From: Wen Congyang <wency@cn.fujitsu.com>
To: Dong Eddie <eddie.dong@intel.com>,
Lai Jiangshan <laijs@cn.fujitsu.com>,
xen-devl <xen-devel@lists.xen.org>,
Shriram Rajagopalan <rshriram@cs.ubc.ca>
Cc: Jiang Yunhong <yunhong.jiang@intel.com>,
Wen Congyang <wency@cn.fujitsu.com>,
Ye Wei <wei.ye1987@gmail.com>, Xu Yao <xuyao.xu@huawei.com>,
Hong Tao <bobby.hong@huawei.com>
Subject: [RFC Patch v2 03/16] block-remus: introduce a interface to allow the user specify which mode the backup end uses
Date: Thu, 11 Jul 2013 16:35:35 +0800 [thread overview]
Message-ID: <1373531748-12547-4-git-send-email-wency@cn.fujitsu.com> (raw)
In-Reply-To: <1373531748-12547-1-git-send-email-wency@cn.fujitsu.com>
block-remus can be used for remus and colo, so we should introduce a way to
tell block-remus which mode it should use:
write mode to /var/run/tap/remus_xxx(control file):
1. 'r': remus
2. 'c': colo
The mode should be writen to control file before we write any other command
to control file.
The master side will write TDREMUS_COLO to slaver side to tell it use colo
mode.
Signed-off-by: Ye Wei <wei.ye1987@gmail.com>
Signed-off-by: Jiang Yunhong <yunhong.jiang@intel.com>
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
---
tools/blktap2/drivers/block-remus.c | 49 +++++++++++++++++++++++++++++++++++
tools/python/xen/remus/device.py | 8 +++++
tools/remus/remus | 1 +
3 files changed, 58 insertions(+), 0 deletions(-)
diff --git a/tools/blktap2/drivers/block-remus.c b/tools/blktap2/drivers/block-remus.c
index bced0e9..a85f5a0 100644
--- a/tools/blktap2/drivers/block-remus.c
+++ b/tools/blktap2/drivers/block-remus.c
@@ -188,6 +188,9 @@ struct tdremus_state {
/* mode methods */
enum tdremus_mode mode;
int (*queue_flush)(td_driver_t *driver);
+
+ /* init data */
+ int init_state; /* 0: init, 1: remus, 2: colo */
};
typedef struct tdremus_wire {
@@ -201,6 +204,7 @@ typedef struct tdremus_wire {
#define TDREMUS_WRITE "wreq"
#define TDREMUS_SUBMIT "sreq"
#define TDREMUS_COMMIT "creq"
+#define TDREMUS_COLO "colo"
#define TDREMUS_DONE "done"
#define TDREMUS_FAIL "fail"
@@ -786,6 +790,33 @@ static int primary_do_connect(struct tdremus_state *state)
return 0;
}
+static void read_state(struct tdremus_state *s)
+{
+ int rc;
+ char state;
+
+ rc = read(s->ctl_fd.fd, &state, 1);
+ if (rc <= 0)
+ return;
+
+ if (state == 'r') {
+ s->init_state = 1;
+ } else if (state == 'c') {
+ s->init_state = 2;
+ } else {
+ RPRINTF("read unknown state: %d, use remus\n", (int)state);
+ s->init_state = 1;
+ }
+}
+
+static void start_remus(struct tdremus_state *s)
+{
+ if (mwrite(s->stream_fd.fd, TDREMUS_COLO, strlen(TDREMUS_COLO)) < 0) {
+ RPRINTF("error start colo mode");
+ exit(1);
+ }
+}
+
static int primary_blocking_connect(struct tdremus_state *state)
{
int fd;
@@ -835,6 +866,18 @@ static int primary_blocking_connect(struct tdremus_state *state)
state->stream_fd.fd = fd;
state->stream_fd.id = id;
+
+ /* The user runs the remus command after we try to connect backup end */
+ if (!state->init_state)
+ read_state(state);
+
+ if (!state->init_state) {
+ RPRINTF("read state failed, try to use remus\n");
+ state->init_state = 1;
+ }
+
+ if (state->init_state == 2)
+ start_remus(state);
return 0;
}
@@ -1424,6 +1467,8 @@ static void remus_server_event(event_id_t id, char mode, void *private)
server_do_sreq(driver);
else if (!strcmp(req, TDREMUS_COMMIT))
server_do_creq(driver);
+ else if (!strcmp(req, TDREMUS_COLO))
+ switch_mode(driver, mode_colo);
else
RPRINTF("unknown request received: %s\n", req);
@@ -1624,6 +1669,10 @@ static void ctl_request(event_id_t id, char mode, void *private)
int rc;
// RPRINTF("data waiting on control fifo\n");
+ if (!s->init_state) {
+ read_state(s);
+ return;
+ }
if (!(rc = read(s->ctl_fd.fd, msg, sizeof(msg) - 1 /* append nul */))) {
RPRINTF("0-byte read received, reopening FIFO\n");
diff --git a/tools/python/xen/remus/device.py b/tools/python/xen/remus/device.py
index 970e1ea..bbb1cd8 100644
--- a/tools/python/xen/remus/device.py
+++ b/tools/python/xen/remus/device.py
@@ -12,6 +12,10 @@ class BufferedNICException(Exception): pass
class CheckpointedDevice(object):
'Base class for buffered devices'
+ def init(self, mode):
+ 'init device state, only called once'
+ pass
+
def postsuspend(self):
'called after guest has suspended'
pass
@@ -79,6 +83,10 @@ class ReplicatedDisk(CheckpointedDevice):
def __del__(self):
self.uninstall()
+ def init(self, mode):
+ if self.ctlfd:
+ os.write(self.ctlfd.fileno(), mode)
+
def uninstall(self):
if self.ctlfd:
self.ctlfd.close()
diff --git a/tools/remus/remus b/tools/remus/remus
index 38f0365..d5178cd 100644
--- a/tools/remus/remus
+++ b/tools/remus/remus
@@ -124,6 +124,7 @@ def run(cfg):
for disk in dom.disks:
try:
bufs.append(ReplicatedDisk(disk))
+ disk.init('r')
except ReplicatedDiskException, e:
print e
continue
--
1.7.4
next prev parent reply other threads:[~2013-07-11 8:35 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-11 8:35 [RFC Patch v2 00/16] COarse-grain LOck-stepping Virtual Machines for Non-stop Service Wen Congyang
2013-07-11 8:35 ` [RFC Patch v2 01/16] xen: introduce new hypercall to reset vcpu Wen Congyang
2013-07-11 9:44 ` Andrew Cooper
2013-07-11 9:58 ` Wen Congyang
2013-07-11 10:01 ` Ian Campbell
2013-08-01 11:48 ` Tim Deegan
2013-08-06 6:47 ` Wen Congyang
2013-07-11 8:35 ` [RFC Patch v2 02/16] block-remus: introduce colo mode Wen Congyang
2013-07-11 8:35 ` Wen Congyang [this message]
2013-07-11 8:35 ` [RFC Patch v2 04/16] dominfo.completeRestore() will be called more than once in " Wen Congyang
2013-07-11 8:35 ` [RFC Patch v2 05/16] xc_domain_restore: introduce restore_callbacks for colo Wen Congyang
2013-07-11 8:35 ` [RFC Patch v2 06/16] colo: implement restore_callbacks init()/free() Wen Congyang
2013-07-11 8:35 ` [RFC Patch v2 07/16] colo: implement restore_callbacks get_page() Wen Congyang
2013-07-11 8:35 ` [RFC Patch v2 08/16] colo: implement restore_callbacks flush_memory Wen Congyang
2013-07-11 8:35 ` [RFC Patch v2 09/16] colo: implement restore_callbacks update_p2m() Wen Congyang
2013-07-11 8:35 ` [RFC Patch v2 10/16] colo: implement restore_callbacks finish_restore() Wen Congyang
2013-07-11 9:40 ` Ian Campbell
2013-07-11 9:54 ` Wen Congyang
2013-07-11 8:35 ` [RFC Patch v2 11/16] xc_restore: implement for colo Wen Congyang
2013-07-11 8:35 ` [RFC Patch v2 12/16] XendCheckpoint: implement colo Wen Congyang
2013-07-11 8:35 ` [RFC Patch v2 13/16] xc_domain_save: flush cache before calling callbacks->postcopy() Wen Congyang
2013-07-11 13:43 ` Andrew Cooper
2013-07-12 1:36 ` Wen Congyang
2013-07-11 8:35 ` [RFC Patch v2 14/16] add callback to configure network for colo Wen Congyang
2013-07-11 8:35 ` [RFC Patch v2 15/16] xc_domain_save: implement save_callbacks " Wen Congyang
2013-07-11 13:52 ` Andrew Cooper
2013-07-11 8:35 ` [RFC Patch v2 16/16] remus: implement colo mode Wen Congyang
2013-07-11 9:37 ` [RFC Patch v2 00/16] COarse-grain LOck-stepping Virtual Machines for Non-stop Service Andrew Cooper
2013-07-11 9:40 ` Ian Campbell
2013-07-14 14:33 ` Shriram Rajagopalan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1373531748-12547-4-git-send-email-wency@cn.fujitsu.com \
--to=wency@cn.fujitsu.com \
--cc=bobby.hong@huawei.com \
--cc=eddie.dong@intel.com \
--cc=laijs@cn.fujitsu.com \
--cc=rshriram@cs.ubc.ca \
--cc=wei.ye1987@gmail.com \
--cc=xen-devel@lists.xen.org \
--cc=xuyao.xu@huawei.com \
--cc=yunhong.jiang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).