qemu

Форк
0
/
replication.c 
107 строк · 2.5 Кб
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
#include "qemu/osdep.h"
16
#include "qapi/error.h"
17
#include "block/replication.h"
18

19
static QLIST_HEAD(, ReplicationState) replication_states;
20

21
ReplicationState *replication_new(void *opaque, ReplicationOps *ops)
22
{
23
    ReplicationState *rs;
24

25
    assert(ops != NULL);
26
    rs = g_new0(ReplicationState, 1);
27
    rs->opaque = opaque;
28
    rs->ops = ops;
29
    QLIST_INSERT_HEAD(&replication_states, rs, node);
30

31
    return rs;
32
}
33

34
void replication_remove(ReplicationState *rs)
35
{
36
    if (rs) {
37
        QLIST_REMOVE(rs, node);
38
        g_free(rs);
39
    }
40
}
41

42
/*
43
 * The caller of the function MUST make sure vm stopped
44
 */
45
void replication_start_all(ReplicationMode mode, Error **errp)
46
{
47
    ReplicationState *rs, *next;
48
    Error *local_err = NULL;
49

50
    QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
51
        if (rs->ops && rs->ops->start) {
52
            rs->ops->start(rs, mode, &local_err);
53
        }
54
        if (local_err) {
55
            error_propagate(errp, local_err);
56
            return;
57
        }
58
    }
59
}
60

61
void replication_do_checkpoint_all(Error **errp)
62
{
63
    ReplicationState *rs, *next;
64
    Error *local_err = NULL;
65

66
    QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
67
        if (rs->ops && rs->ops->checkpoint) {
68
            rs->ops->checkpoint(rs, &local_err);
69
        }
70
        if (local_err) {
71
            error_propagate(errp, local_err);
72
            return;
73
        }
74
    }
75
}
76

77
void replication_get_error_all(Error **errp)
78
{
79
    ReplicationState *rs, *next;
80
    Error *local_err = NULL;
81

82
    QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
83
        if (rs->ops && rs->ops->get_error) {
84
            rs->ops->get_error(rs, &local_err);
85
        }
86
        if (local_err) {
87
            error_propagate(errp, local_err);
88
            return;
89
        }
90
    }
91
}
92

93
void replication_stop_all(bool failover, Error **errp)
94
{
95
    ReplicationState *rs, *next;
96
    Error *local_err = NULL;
97

98
    QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
99
        if (rs->ops && rs->ops->stop) {
100
            rs->ops->stop(rs, failover, &local_err);
101
        }
102
        if (local_err) {
103
            error_propagate(errp, local_err);
104
            return;
105
        }
106
    }
107
}
108

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.