]> git.proxmox.com Git - mirror_qemu.git/blob - replication.h
Merge tag 'pull-aspeed-20240201' of https://github.com/legoater/qemu into staging
[mirror_qemu.git] / replication.h
1 /*
2 * Replication filter
3 *
4 * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD.
5 * Copyright (c) 2016 Intel Corporation
6 * Copyright (c) 2016 FUJITSU LIMITED
7 *
8 * Author:
9 * Changlong Xie <xiecl.fnst@cn.fujitsu.com>
10 *
11 * This work is licensed under the terms of the GNU GPL, version 2 or later.
12 * See the COPYING file in the top-level directory.
13 */
14
15 #ifndef REPLICATION_H
16 #define REPLICATION_H
17
18 #include "qapi/qapi-types-block-core.h"
19 #include "qemu/queue.h"
20
21 typedef struct ReplicationOps ReplicationOps;
22 typedef struct ReplicationState ReplicationState;
23
24 /**
25 * SECTION:replication.h
26 * @title:Base Replication System
27 * @short_description: interfaces for handling replication
28 *
29 * The Replication Model provides a framework for handling Replication
30 *
31 * <example>
32 * <title>How to use replication interfaces</title>
33 * <programlisting>
34 * #include "replication.h"
35 *
36 * typedef struct BDRVReplicationState {
37 * ReplicationState *rs;
38 * } BDRVReplicationState;
39 *
40 * static void replication_start(ReplicationState *rs, ReplicationMode mode,
41 * Error **errp);
42 * static void replication_do_checkpoint(ReplicationState *rs, Error **errp);
43 * static void replication_get_error(ReplicationState *rs, Error **errp);
44 * static void replication_stop(ReplicationState *rs, bool failover,
45 * Error **errp);
46 *
47 * static ReplicationOps replication_ops = {
48 * .start = replication_start,
49 * .checkpoint = replication_do_checkpoint,
50 * .get_error = replication_get_error,
51 * .stop = replication_stop,
52 * }
53 *
54 * static int replication_open(BlockDriverState *bs, QDict *options,
55 * int flags, Error **errp)
56 * {
57 * BDRVReplicationState *s = bs->opaque;
58 * s->rs = replication_new(bs, &replication_ops);
59 * return 0;
60 * }
61 *
62 * static void replication_close(BlockDriverState *bs)
63 * {
64 * BDRVReplicationState *s = bs->opaque;
65 * replication_remove(s->rs);
66 * }
67 *
68 * BlockDriver bdrv_replication = {
69 * .format_name = "replication",
70 * .instance_size = sizeof(BDRVReplicationState),
71 *
72 * .bdrv_open = replication_open,
73 * .bdrv_close = replication_close,
74 * };
75 *
76 * static void bdrv_replication_init(void)
77 * {
78 * bdrv_register(&bdrv_replication);
79 * }
80 *
81 * block_init(bdrv_replication_init);
82 * </programlisting>
83 * </example>
84 *
85 * We create an example about how to use replication interfaces in above.
86 * Then in migration, we can use replication_(start/stop/do_checkpoint/
87 * get_error)_all to handle all replication operations.
88 */
89
90 /**
91 * ReplicationState:
92 * @opaque: opaque pointer value passed to this ReplicationState
93 * @ops: replication operation of this ReplicationState
94 * @node: node that we will insert into @replication_states QLIST
95 */
96 struct ReplicationState {
97 void *opaque;
98 ReplicationOps *ops;
99 QLIST_ENTRY(ReplicationState) node;
100 };
101
102 /**
103 * ReplicationOps:
104 * @start: callback to start replication
105 * @stop: callback to stop replication
106 * @checkpoint: callback to do checkpoint
107 * @get_error: callback to check if error occurred during replication
108 */
109 struct ReplicationOps {
110 void (*start)(ReplicationState *rs, ReplicationMode mode, Error **errp);
111 void (*stop)(ReplicationState *rs, bool failover, Error **errp);
112 void (*checkpoint)(ReplicationState *rs, Error **errp);
113 void (*get_error)(ReplicationState *rs, Error **errp);
114 };
115
116 /**
117 * replication_new:
118 * @opaque: opaque pointer value passed to ReplicationState
119 * @ops: replication operation of the new relevant ReplicationState
120 *
121 * Called to create a new ReplicationState instance, and then insert it
122 * into @replication_states QLIST
123 *
124 * Returns: the new ReplicationState instance
125 */
126 ReplicationState *replication_new(void *opaque, ReplicationOps *ops);
127
128 /**
129 * replication_remove:
130 * @rs: the ReplicationState instance to remove
131 *
132 * Called to remove a ReplicationState instance, and then delete it from
133 * @replication_states QLIST
134 */
135 void replication_remove(ReplicationState *rs);
136
137 /**
138 * replication_start_all:
139 * @mode: replication mode that could be "primary" or "secondary"
140 * @errp: returns an error if this function fails
141 *
142 * Start replication, called in migration/checkpoint thread
143 *
144 * Note: the caller of the function MUST make sure vm stopped
145 */
146 void replication_start_all(ReplicationMode mode, Error **errp);
147
148 /**
149 * replication_do_checkpoint_all:
150 * @errp: returns an error if this function fails
151 *
152 * This interface is called after all VM state is transferred to Secondary QEMU
153 */
154 void replication_do_checkpoint_all(Error **errp);
155
156 /**
157 * replication_get_error_all:
158 * @errp: returns an error if this function fails
159 *
160 * This interface is called to check if error occurred during replication
161 */
162 void replication_get_error_all(Error **errp);
163
164 /**
165 * replication_stop_all:
166 * @failover: boolean value that indicates if we need do failover or not
167 * @errp: returns an error if this function fails
168 *
169 * It is called on failover. The vm should be stopped before calling it, if you
170 * use this API to shutdown the guest, or other things except failover
171 */
172 void replication_stop_all(bool failover, Error **errp);
173
174 #endif /* REPLICATION_H */