2020-06-24 16:15:23 +05:30
|
|
|
/*
|
|
|
|
* qemu_domainjob.h: helper functions for QEMU domain jobs
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library. If not, see
|
|
|
|
* <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <glib-object.h>
|
2020-07-16 17:18:34 +05:30
|
|
|
#include "qemu_monitor.h"
|
2022-02-11 14:49:05 +01:00
|
|
|
#include "domain_job.h"
|
2020-06-24 16:15:23 +05:30
|
|
|
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
QEMU_DOMAIN_JOB_STATS_TYPE_NONE = 0,
|
|
|
|
QEMU_DOMAIN_JOB_STATS_TYPE_MIGRATION,
|
|
|
|
QEMU_DOMAIN_JOB_STATS_TYPE_SAVEDUMP,
|
|
|
|
QEMU_DOMAIN_JOB_STATS_TYPE_MEMDUMP,
|
|
|
|
QEMU_DOMAIN_JOB_STATS_TYPE_BACKUP,
|
|
|
|
} qemuDomainJobStatsType;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct _qemuDomainMirrorStats qemuDomainMirrorStats;
|
|
|
|
struct _qemuDomainMirrorStats {
|
|
|
|
unsigned long long transferred;
|
|
|
|
unsigned long long total;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct _qemuDomainBackupStats qemuDomainBackupStats;
|
|
|
|
struct _qemuDomainBackupStats {
|
|
|
|
unsigned long long transferred;
|
|
|
|
unsigned long long total;
|
|
|
|
unsigned long long tmp_used;
|
|
|
|
unsigned long long tmp_total;
|
|
|
|
};
|
|
|
|
|
2022-02-11 14:49:05 +01:00
|
|
|
typedef struct _qemuDomainJobDataPrivate qemuDomainJobDataPrivate;
|
|
|
|
struct _qemuDomainJobDataPrivate {
|
2020-06-24 16:15:23 +05:30
|
|
|
/* Raw values from QEMU */
|
|
|
|
qemuDomainJobStatsType statsType;
|
|
|
|
union {
|
|
|
|
qemuMonitorMigrationStats mig;
|
|
|
|
qemuMonitorDumpStats dump;
|
|
|
|
qemuDomainBackupStats backup;
|
|
|
|
} stats;
|
|
|
|
qemuDomainMirrorStats mirrorStats;
|
|
|
|
};
|
|
|
|
|
2022-02-11 14:49:05 +01:00
|
|
|
extern virDomainJobDataPrivateDataCallbacks qemuJobDataPrivateDataCallbacks;
|
2020-06-24 16:15:23 +05:30
|
|
|
|
|
|
|
typedef struct _qemuDomainJobObj qemuDomainJobObj;
|
2020-07-16 17:18:34 +05:30
|
|
|
|
|
|
|
typedef void *(*qemuDomainObjPrivateJobAlloc)(void);
|
|
|
|
typedef void (*qemuDomainObjPrivateJobFree)(void *);
|
|
|
|
typedef void (*qemuDomainObjPrivateJobReset)(void *);
|
2021-03-11 08:16:13 +01:00
|
|
|
typedef int (*qemuDomainObjPrivateJobFormat)(virBuffer *,
|
|
|
|
qemuDomainJobObj *,
|
|
|
|
virDomainObj *);
|
2020-07-16 17:18:34 +05:30
|
|
|
typedef int (*qemuDomainObjPrivateJobParse)(xmlXPathContextPtr,
|
2021-03-11 08:16:13 +01:00
|
|
|
qemuDomainJobObj *,
|
|
|
|
virDomainObj *);
|
2020-07-16 17:18:34 +05:30
|
|
|
|
|
|
|
typedef struct _qemuDomainObjPrivateJobCallbacks qemuDomainObjPrivateJobCallbacks;
|
|
|
|
struct _qemuDomainObjPrivateJobCallbacks {
|
|
|
|
qemuDomainObjPrivateJobAlloc allocJobPrivate;
|
|
|
|
qemuDomainObjPrivateJobFree freeJobPrivate;
|
|
|
|
qemuDomainObjPrivateJobReset resetJobPrivate;
|
|
|
|
qemuDomainObjPrivateJobFormat formatJob;
|
|
|
|
qemuDomainObjPrivateJobParse parseJob;
|
|
|
|
};
|
|
|
|
|
2020-06-24 16:15:23 +05:30
|
|
|
struct _qemuDomainJobObj {
|
|
|
|
virCond cond; /* Use to coordinate jobs */
|
|
|
|
|
2021-12-01 10:41:41 +01:00
|
|
|
int jobsQueued;
|
|
|
|
|
2022-03-24 16:32:42 +01:00
|
|
|
/* The following members are for VIR_JOB_* */
|
|
|
|
virDomainJob active; /* Currently running job */
|
2020-06-24 16:15:23 +05:30
|
|
|
unsigned long long owner; /* Thread id which set current job */
|
2021-04-30 07:07:57 +02:00
|
|
|
char *ownerAPI; /* The API which owns the job */
|
2020-06-24 16:15:23 +05:30
|
|
|
unsigned long long started; /* When the current job started */
|
|
|
|
|
2022-03-24 16:32:42 +01:00
|
|
|
/* The following members are for VIR_AGENT_JOB_* */
|
|
|
|
virDomainAgentJob agentActive; /* Currently running agent job */
|
2020-06-24 16:15:23 +05:30
|
|
|
unsigned long long agentOwner; /* Thread id which set current agent job */
|
2021-04-30 07:07:57 +02:00
|
|
|
char *agentOwnerAPI; /* The API which owns the agent job */
|
2020-06-24 16:15:23 +05:30
|
|
|
unsigned long long agentStarted; /* When the current agent job started */
|
|
|
|
|
2022-03-24 16:32:42 +01:00
|
|
|
/* The following members are for VIR_ASYNC_JOB_* */
|
2020-06-24 16:15:23 +05:30
|
|
|
virCond asyncCond; /* Use to coordinate with async jobs */
|
2022-03-24 16:32:42 +01:00
|
|
|
virDomainAsyncJob asyncJob; /* Currently active async job */
|
2020-06-24 16:15:23 +05:30
|
|
|
unsigned long long asyncOwner; /* Thread which set current async job */
|
2021-04-30 07:07:57 +02:00
|
|
|
char *asyncOwnerAPI; /* The API which owns the async job */
|
2020-06-24 16:15:23 +05:30
|
|
|
unsigned long long asyncStarted; /* When the current async job started */
|
|
|
|
int phase; /* Job phase (mainly for migrations) */
|
|
|
|
unsigned long long mask; /* Jobs allowed during async job */
|
2022-02-11 14:49:05 +01:00
|
|
|
virDomainJobData *current; /* async job progress data */
|
|
|
|
virDomainJobData *completed; /* statistics data of a recently completed job */
|
2020-06-24 16:15:23 +05:30
|
|
|
bool abortJob; /* abort of the job requested */
|
|
|
|
char *error; /* job event completion error */
|
|
|
|
unsigned long apiFlags; /* flags passed to the API which started the async job */
|
2020-07-16 17:18:34 +05:30
|
|
|
|
|
|
|
void *privateData; /* job specific collection of data */
|
2021-03-11 08:16:13 +01:00
|
|
|
qemuDomainObjPrivateJobCallbacks *cb;
|
2020-06-24 16:15:23 +05:30
|
|
|
};
|
|
|
|
|
2022-02-11 14:49:06 +01:00
|
|
|
void qemuDomainJobSetStatsType(virDomainJobData *jobData,
|
|
|
|
qemuDomainJobStatsType type);
|
|
|
|
|
2022-03-30 09:39:12 +02:00
|
|
|
const char *qemuDomainAsyncJobPhaseToString(virDomainAsyncJob job,
|
2020-06-24 16:15:23 +05:30
|
|
|
int phase);
|
2022-03-30 09:39:12 +02:00
|
|
|
int qemuDomainAsyncJobPhaseFromString(virDomainAsyncJob job,
|
2020-06-24 16:15:23 +05:30
|
|
|
const char *phase);
|
|
|
|
|
2021-03-11 08:16:13 +01:00
|
|
|
void qemuDomainEventEmitJobCompleted(virQEMUDriver *driver,
|
|
|
|
virDomainObj *vm);
|
2020-06-24 16:15:23 +05:30
|
|
|
|
2021-03-11 08:16:13 +01:00
|
|
|
int qemuDomainObjBeginJob(virQEMUDriver *driver,
|
|
|
|
virDomainObj *obj,
|
2022-03-24 16:32:42 +01:00
|
|
|
virDomainJob job)
|
2020-06-24 16:15:23 +05:30
|
|
|
G_GNUC_WARN_UNUSED_RESULT;
|
2021-03-11 08:16:13 +01:00
|
|
|
int qemuDomainObjBeginAgentJob(virQEMUDriver *driver,
|
|
|
|
virDomainObj *obj,
|
2022-03-24 16:32:42 +01:00
|
|
|
virDomainAgentJob agentJob)
|
2020-06-24 16:15:23 +05:30
|
|
|
G_GNUC_WARN_UNUSED_RESULT;
|
2021-03-11 08:16:13 +01:00
|
|
|
int qemuDomainObjBeginAsyncJob(virQEMUDriver *driver,
|
|
|
|
virDomainObj *obj,
|
2022-03-24 16:32:42 +01:00
|
|
|
virDomainAsyncJob asyncJob,
|
2020-06-24 16:15:23 +05:30
|
|
|
virDomainJobOperation operation,
|
|
|
|
unsigned long apiFlags)
|
|
|
|
G_GNUC_WARN_UNUSED_RESULT;
|
2021-03-11 08:16:13 +01:00
|
|
|
int qemuDomainObjBeginNestedJob(virQEMUDriver *driver,
|
|
|
|
virDomainObj *obj,
|
2022-03-24 16:32:42 +01:00
|
|
|
virDomainAsyncJob asyncJob)
|
2020-06-24 16:15:23 +05:30
|
|
|
G_GNUC_WARN_UNUSED_RESULT;
|
2021-03-11 08:16:13 +01:00
|
|
|
int qemuDomainObjBeginJobNowait(virQEMUDriver *driver,
|
|
|
|
virDomainObj *obj,
|
2022-03-24 16:32:42 +01:00
|
|
|
virDomainJob job)
|
2020-06-24 16:15:23 +05:30
|
|
|
G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
|
2022-03-18 11:17:28 +01:00
|
|
|
void qemuDomainObjEndJob(virDomainObj *obj);
|
2021-03-11 08:16:13 +01:00
|
|
|
void qemuDomainObjEndAgentJob(virDomainObj *obj);
|
2022-03-18 11:17:28 +01:00
|
|
|
void qemuDomainObjEndAsyncJob(virDomainObj *obj);
|
2021-03-11 08:16:13 +01:00
|
|
|
void qemuDomainObjAbortAsyncJob(virDomainObj *obj);
|
2022-03-18 11:17:28 +01:00
|
|
|
void qemuDomainObjSetJobPhase(virDomainObj *obj,
|
2020-06-24 16:15:23 +05:30
|
|
|
int phase);
|
2021-03-11 08:16:13 +01:00
|
|
|
void qemuDomainObjSetAsyncJobMask(virDomainObj *obj,
|
2020-06-24 16:15:23 +05:30
|
|
|
unsigned long long allowedJobs);
|
2021-03-11 08:16:13 +01:00
|
|
|
int qemuDomainObjRestoreJob(virDomainObj *obj,
|
|
|
|
qemuDomainJobObj *job);
|
2022-03-18 11:17:28 +01:00
|
|
|
void qemuDomainObjDiscardAsyncJob(virDomainObj *obj);
|
2021-03-11 08:16:13 +01:00
|
|
|
void qemuDomainObjReleaseAsyncJob(virDomainObj *obj);
|
2020-06-24 16:15:23 +05:30
|
|
|
|
2022-02-11 14:49:05 +01:00
|
|
|
int qemuDomainJobDataUpdateTime(virDomainJobData *jobData)
|
2020-06-24 16:15:23 +05:30
|
|
|
ATTRIBUTE_NONNULL(1);
|
2022-02-11 14:49:05 +01:00
|
|
|
int qemuDomainJobDataUpdateDowntime(virDomainJobData *jobData)
|
2020-06-24 16:15:23 +05:30
|
|
|
ATTRIBUTE_NONNULL(1);
|
2022-02-11 14:49:05 +01:00
|
|
|
int qemuDomainJobDataToInfo(virDomainJobData *jobData,
|
2020-06-24 16:15:23 +05:30
|
|
|
virDomainJobInfoPtr info)
|
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
2022-02-11 14:49:05 +01:00
|
|
|
int qemuDomainJobDataToParams(virDomainJobData *jobData,
|
2020-06-24 16:15:23 +05:30
|
|
|
int *type,
|
|
|
|
virTypedParameterPtr *params,
|
|
|
|
int *nparams)
|
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
|
|
|
|
ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
|
|
|
|
|
2022-03-24 16:32:42 +01:00
|
|
|
bool qemuDomainTrackJob(virDomainJob job);
|
2020-06-24 16:15:23 +05:30
|
|
|
|
2021-03-11 08:16:13 +01:00
|
|
|
void qemuDomainObjClearJob(qemuDomainJobObj *job);
|
2020-09-14 13:29:23 +02:00
|
|
|
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(qemuDomainJobObj, qemuDomainObjClearJob);
|
2020-06-24 16:15:23 +05:30
|
|
|
|
2020-07-16 17:18:34 +05:30
|
|
|
int
|
2021-03-11 08:16:13 +01:00
|
|
|
qemuDomainObjInitJob(qemuDomainJobObj *job,
|
|
|
|
qemuDomainObjPrivateJobCallbacks *cb);
|
2020-06-24 16:15:23 +05:30
|
|
|
|
2020-07-13 23:33:39 +05:30
|
|
|
int
|
2021-03-11 08:16:13 +01:00
|
|
|
qemuDomainObjPrivateXMLFormatJob(virBuffer *buf,
|
|
|
|
virDomainObj *vm);
|
2020-07-13 23:33:39 +05:30
|
|
|
|
|
|
|
int
|
2021-03-11 08:16:13 +01:00
|
|
|
qemuDomainObjPrivateXMLParseJob(virDomainObj *vm,
|
2020-07-13 23:33:39 +05:30
|
|
|
xmlXPathContextPtr ctxt);
|