All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lai Jiangshan <laijs@cn.fujitsu.com>
To: rshriram@cs.ubc.ca
Cc: Ian Campbell <ian.campbell@citrix.com>,
	FNST-Wen Congyang <wency@cn.fujitsu.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Jiang Yunhong <yunhong.jiang@intel.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	"xen-devel@lists.xen.org" <xen-devel@lists.xen.org>,
	Dong Eddie <eddie.dong@intel.com>,
	Roger Pau Monne <roger.pau@citrix.com>
Subject: Re: [PATCH RFC] remus: implement remus replicated checkpointing disk
Date: Wed, 12 Mar 2014 10:35:31 +0800	[thread overview]
Message-ID: <531FC7F3.5060202@cn.fujitsu.com> (raw)
In-Reply-To: <CAP8mzPOmmeyQhGTWDG79rZ8e+JJHPoT1BTOB+kqzn0KOd-mbUQ@mail.gmail.com>

On 03/12/2014 02:10 AM, Shriram Rajagopalan wrote:
> On Tue, Feb 25, 2014 at 6:53 PM, Lai Jiangshan <laijs@cn.fujitsu.com <mailto:laijs@cn.fujitsu.com>> wrote:
> 
>     This patch implements remus replicated checkpointing disk.
>     It includes two parts:
>       generic remus replicated checkpointing disks framework
>       drbd replicated checkpointing disks
>     They will be split into different files in next round.
> 
>     The patch is still simple due to disk-setup-teardown-script is
>     still under implementing. I need to use libxl_ao to implement it,
>     but libxl_ao is hard to use. The work sequence is needed to ugly split
>     to serveral callbacks like device_hotplug().
> 
>     And becuase the remus disk script is unimplemented, the drbd_setup() code
>     can't check the disk now. So it just assumes the user config the disk correctly.
> 
>     This patch is *UNTESTED*.
>     (there is a problem with xl&drbd(without remus) in my BOXes).
> 
>     I request *comments* as many as possible.
> 
>     Thanks,
>     Lai
> 
>     Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com <mailto:laijs@cn.fujitsu.com>>
> 
> 
> 
> Hi
>  sorry for the delayed response. And thanks a lot for this initiative. Apart from the inline feedback,
> there are a few things to consider first before going down this route. 
> 
> 1. The drbd kernel module required for Remus is still out of tree, currently hosted on a wiki page.
> The drbd folks didnt want to include the changes into their code unfortunately, as they were offering the
> same functionality to one of their paid customers. This is what they told me back in 2011 or so.
> 
> To streamline the storage replication module installation, is there a chance of hosting the code in 
> xen.org <http://xen.org>'s repos? That way, we could script the download and installation process. Like the qemu
> stuff.
> 
> 2. The tapdisk based replication unfortunately is outdated. Please correct me if I have got this wrong.
> Haven't we decided to get rid of blktap2 and go with the qemu disk models? In which case, the tapdisk
> remus code has to be ported into some qemu disk variant.

We are implementing *qemu* replicated checkpointing disk, but we can't make it public even we have done,
we need to delay the publication due to we are paid to implement it by a paid customer.

> 
> Without getting a resolution to the above two, my stance is that we shouldn't pollute xl with functionality
> that requires out-of-band modules that may prove pretty painful to install for the majority of folks out there.

I'm also concern with out-of-band modules, since remus-drbd can't be merged upstream,
It will be valueless to apply remus-drbd replicated checkpointing disk to xl.

What's the status of blktap3 now? (I am asking to xen community)

> 
> Based on the experience from the last 3 years, most average users of Remus tend to skip disk replication 
> altogether.  They install the distro's default drbd, use the disk replication provided with it and then complain
> that Remus crashes or fails.  Some have ventured into tapdisk replication but it unfortunately seemed to 
> get difficult as xend/blktap2 started getting deprecated.
> 
>  
> 
>     ---
>      tools/libxl/Makefile                      |    1 +
>      tools/libxl/libxl_dom.c                   |   19 +++-
>      tools/libxl/libxl_internal.h              |   10 ++
>      tools/libxl/libxl_remus.c                 |    2 +
>      tools/libxl/libxl_remus_replicated_disk.c |  219 +++++++++++++++++++++++++++++
>      5 files changed, 249 insertions(+), 2 deletions(-)
>      create mode 100644 tools/libxl/libxl_remus_replicated_disk.c
> 
>     diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
>     index 218f55e..dbf5dd9 100644
>     --- a/tools/libxl/Makefile
>     +++ b/tools/libxl/Makefile
>     @@ -53,6 +53,7 @@ LIBXL_OBJS-y += libxl_nonetbuffer.o
>      endif
> 
>      LIBXL_OBJS-y += libxl_remus.o
>     +LIBXL_OBJS-y += libxl_remus_replicated_disk.o
> 
> 
> So I think this part will also require some autoconf based stuff.
> Especially, if DRBD & tapdisk are not present, then this whole
> thing gets disabled. Just like the libxl_netbuffer and libxl_nonetbuffer
> 
> Given that both of these (netbuffer and disk) are associated with Remus
> and both are required for Remus to work "correctly", we might as well have
> noremus.c and remus.c . Ofcourse it can be modularized a bit to have
> netbuffer but no disk replication or vice versa. As long as the person installing
> or compiling this stuff is made to state explicitly that he/she does not want
> Remus, but only a subset of its functionality for some other purpose.
>  
> 
>     diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
>     index a4ffdfd..858f5be 100644
>     --- a/tools/libxl/libxl_dom.c
>     +++ b/tools/libxl/libxl_dom.c
> 
> 
>  
> 
>          /* The domain was suspended successfully. Start a new network
>     @@ -1279,7 +1284,10 @@ static int libxl__remus_domain_resume_callback(void *data)
>          if (libxl__domain_resume(gc, dss->domid, /* Fast Suspend */1))
>              return 0;
> 
>     -    /* REMUS TODO: Deal with disk. */
>     +    /* Deal with disk. */
>     +    if (libxl__remus_disks_preresume(dss->remus_state))
>     +        return 0;
>     +
> 
> 
> Bug. This should go before the resume call. Also, I would suggest changing the comment 
> to something more meaningful, e.g., "commit disk changes.."
> 
> 
>          return 1;
>      }
> 
>     @@ -1326,6 +1334,13 @@ static void remus_checkpoint_dm_saved(libxl__egc *egc,
>              goto out;
>          }
> 
>     +    rc = libxl__remus_disks_commit(remus_state);
>     +    if (rc) {
>     +        LOG(ERROR, "Failed to commit disks state"
>     +            " Terminating Remus..");
>     +        goto out;
>     +    }
>     +
> 
> 
> Now might be a good time to use the restore callbacks offered by the toolstack to 
> get an explicit ack from the backup that it has received the memory checkpoint too
> before the network buffer is released. I think I put in a comment related to that somewhere.
> 
>  
> 
>          if (remus_state->netbuf_state) {
>              rc = libxl__remus_netbuf_release_prev_epoch(gc, dss->domid,
>                                                          remus_state);
>     diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
>     index 1bd2bba..8933e5f 100644
>     --- a/tools/libxl/libxl_internal.h
>     +++ b/tools/libxl/libxl_internal.h
>     @@ -2309,6 +2309,10 @@ typedef struct libxl__remus_state {
>          void *netbuf_state;
>          libxl__ev_time timeout;
>          libxl__ev_child child;
>     +
>     +    /* remus disks state */
>     +    uint32_t nr_disks;
>     +    struct libxl__remus_disk **disks;
>      } libxl__remus_state;
> 
>      _hidden int libxl__netbuffer_enabled(libxl__gc *gc);
>     @@ -2336,6 +2340,12 @@ _hidden int libxl__remus_netbuf_start_new_epoch(libxl__gc *gc, uint32_t domid,
>      _hidden int libxl__remus_netbuf_release_prev_epoch(libxl__gc *gc, uint32_t domid,
>                                                        libxl__remus_state *remus_state);
> 
>     +_hidden int libxl__remus_disks_postsuspend(libxl__remus_state *state);
>     +_hidden int libxl__remus_disks_preresume(libxl__remus_state *state);
>     +_hidden int libxl__remus_disks_commit(libxl__remus_state *state);
>     +_hidden int libxl__remus_disks_setup(libxl__egc *egc, libxl__domain_suspend_state *dss);
>     +_hidden void libxl__remus_disks_teardown(libxl__remus_state *state);
>     +
>      _hidden void libxl__remus_setup_initiate(libxl__egc *egc,
>                                               libxl__domain_suspend_state *dss);
> 
>     diff --git a/tools/libxl/libxl_remus.c b/tools/libxl/libxl_remus.c
>     index cdc1c16..92eb36a 100644
>     --- a/tools/libxl/libxl_remus.c
>     +++ b/tools/libxl/libxl_remus.c
>     @@ -23,6 +23,7 @@ void libxl__remus_setup_initiate(libxl__egc *egc,
>                                       libxl__domain_suspend_state *dss)
>      {
>          libxl__ev_time_init(&dss->remus_state->timeout);
>     +    libxl__remus_disks_setup(egc, dss);
>          if (!dss->remus_state->netbufscript)
>              libxl__remus_setup_done(egc, dss, 0);
>          else
>     @@ -51,6 +52,7 @@ void libxl__remus_teardown_initiate(libxl__egc *egc,
>          /* stash rc somewhere before invoking teardown ops. */
>          dss->remus_state->saved_rc = rc;
> 
>     +    libxl__remus_disks_teardown(dss->remus_state);
>          if (!dss->remus_state->netbuf_state)
>              libxl__remus_teardown_done(egc, dss);
>          else
>     diff --git a/tools/libxl/libxl_remus_replicated_disk.c b/tools/libxl/libxl_remus_replicated_disk.c
>     new file mode 100644
>     index 0000000..4b16403
>     --- /dev/null
>     +++ b/tools/libxl/libxl_remus_replicated_disk.c
>     @@ -0,0 +1,219 @@
>     +/*
>     + * Copyright (C) 2013
>     + * Author Lai Jiangshan <laijs@cn.fujitsu.com <mailto:laijs@cn.fujitsu.com>>
>     + *
>     + * This program 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; version 2.1 only. with the special
>     + * exception on linking described in file LICENSE.
>     + *
>     + * This program 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.
>     + */
>     +
>     +#include "libxl_osdeps.h" /* must come before any other headers */
>     +
>     +#include "libxl_internal.h"
>     +
>     +typedef struct libxl__remus_disk
>     +{
>     +    const struct libxl_device_disk *disk;
>     +    const struct libxl__remus_disk_type *type;
>     +
>     +    /* ao callbacks for setup & teardown script */
>     +    int (*setup_cb)(struct libxl__remus_disk *d);
>     +    int (*teardown_cb)(struct libxl__remus_disk *d);
>     +} libxl__remus_disk;
>     +
>     +typedef struct libxl__remus_disk_type
>     +{
>     +    /* checkpointing */
>     +    int (*postsuspend)(libxl__remus_disk *d);
>     +    int (*preresume)(libxl__remus_disk *d);
>     +    int (*commit)(libxl__remus_disk *d);
>     +
> 
> 
> I would also suggest renaming these to something else, not associated with
> suspend but associated with checkpoints. start_disk_sync, finish_disk_sync,
> start_new_epoch or something along those lines.
> 
>  
> 
>     +    /* setup & teardown */
>     +    libxl__remus_disk *(*setup)(libxl__gc *gc, libxl_device_disk *disk);
>     +    void (*teardown)(libxl__remus_disk *d); 
> 
>     +} libxl__remus_disk_type;
>     +
>     +
>     +/*** drbd implementation ***/
>     +const int DRBD_SEND_CHECKPOINT = 20;
>     +const int DRBD_WAIT_CHECKPOINT_ACK = 30;
>     +typedef struct libxl__remus_drbd_disk
>     +{
>     +    libxl__remus_disk remus_disk;
>     +    int ctl_fd;
>     +    int ackwait;
>     +} libxl__remus_drbd_disk;
>     +
>     +static int drbd_postsuspend(libxl__remus_disk *d)
>     +{
>     +    struct libxl__remus_drbd_disk *drbd = CONTAINER_OF(d, *drbd, remus_disk);
>     +
>     +    if (!drbd->ackwait) {
>     +        if (ioctl(drbd->ctl_fd, DRBD_SEND_CHECKPOINT, 0) <= 0)
>     +            drbd->ackwait = 1;
>     +    }
>     +
>     +    return 0;
>     +}
>     +
>     +static int drbd_preresume(libxl__remus_disk *d)
>     +{
>     +    struct libxl__remus_drbd_disk *drbd = CONTAINER_OF(d, *drbd, remus_disk);
>     +
>     +    if (drbd->ackwait) {
>     +        ioctl(drbd->ctl_fd, DRBD_WAIT_CHECKPOINT_ACK, 0);
>     +        drbd->ackwait = 0;
>     +    }
>     +
>     +    return 0;
>     +}
>     +
>     +static int drbd_commit(libxl__remus_disk *d)
>     +{
>     +    /* nothing to do, all work are done by DRBD's protocal-D. */
>     +    return 0;
>     +}
>     +
>     +static libxl__remus_disk *drbd_setup(libxl__gc *gc, libxl_device_disk *disk)
>     +{
>     +    libxl__remus_drbd_disk *drbd;
>     +    //if (!(drbd && protocal-D)) // TODO: need to run script async to check
>     +    //  return NULL
>     +
> 
> 
> We don't need to run any scripts for DRBD (or tapdisk for that matter).

It is hard to check the status/configuration of DRBD-disk in C code,
it requires drbd C-header files(with remus supported).

I find no way to do it. So we try to use scripts.

Thank you and thanks to your elaborate reply.
Lai

> 
> DRBD scripts will get activated when the domain boots and thats the end of it.
> On the backup side, it gets activated during the initial phase of Remus, which
> is same as live migration.  Since xl already supports live migration with drbd
> based disks, we don't need any script related code at all.
> 
> With regard to tapdisk-remus (atleast with blktap2), you cant boot the domain
> fully unless you start Remus too. This in turn forces the backup to start the 
> tapdisk-remus receiving end.  Once again in this case, in Xend, the live migration
> infrastructure did all the script setup work.
> 
> 
>  
> 
>     +    GCNEW(drbd);
>     +
>     +    drbd->ctl_fd = open(GCSPRINTF("/dev/drbd/by-res/%s", disk->pdev_path), O_RDONLY);
>     +    drbd->ackwait = 0;
>     +
>     +    if (drbd->ctl_fd < 0)
>     +        return NULL;
>     +
>     +    return &drbd->remus_disk;
>     +}
>     +
>     +static void drbd_teardown(libxl__remus_disk *d)
>     +{
>     +    struct libxl__remus_drbd_disk *drbd = CONTAINER_OF(d, *drbd, remus_disk);
>     +
>     +    close(drbd->ctl_fd);
>     +}
>     +
>     +static const libxl__remus_disk_type drbd_disk_type = {
>     +  .postsuspend = drbd_postsuspend,
>     +  .preresume = drbd_preresume,
>     +  .commit = drbd_commit,
>     +  .setup = drbd_setup,
>     +  .teardown = drbd_teardown,
>     +};
>     +
>     +/*** checkpoint disks states and callbacks ***/
>     +static const libxl__remus_disk_type *remus_disk_types[] =
>     +{
>     +    &drbd_disk_type,
>     +};
>     +
>     +int libxl__remus_disks_postsuspend(libxl__remus_state *state)
>     +{
>     +    int i;
>     +    int rc = 0;
>     +
>     +    for (i = 0; rc == 0 && i < state->nr_disks; i++)
>     +        rc = state->disks[i]->type->postsuspend(state->disks[i]);
>     +
>     +    return rc;
>     +}
>     +
>     +int libxl__remus_disks_preresume(libxl__remus_state *state)
>     +{
>     +    int i;
>     +    int rc = 0;
>     +
>     +    for (i = 0; rc == 0 && i < state->nr_disks; i++)
>     +        rc = state->disks[i]->type->preresume(state->disks[i]);
>     +
>     +    return rc;
>     +}
>     +
>     +int libxl__remus_disks_commit(libxl__remus_state *state)
>     +{
>     +    int i;
>     +    int rc = 0;
>     +
>     +    for (i = 0; rc == 0 && i < state->nr_disks; i++)
>     +        rc = state->disks[i]->type->commit(state->disks[i]);
>     +
>     +    return rc;
>     +}
>     +
>     +#if 0
>     +/* TODO: implement disk setup/teardown script */
>     +static void disk_exec_timeout_cb(libxl__egc *egc, libxl__ev_time *ev,
>     +                                      const struct timeval *requested_abs)
>     +{
>     +    libxl__remus_disks_state *state = CONTAINER_OF(ev, *aodev, timeout);
>     +    STATE_AO_GC(state->ao);
>     +
>     +    libxl__ev_time_deregister(gc, &state->timeout);
>     +
>     +    assert(libxl__ev_child_inuse(&state->child));
>     +    if (kill(state->child.pid, SIGKILL)) {
>     +    }
>     +
>     +    return;
>     +}
>     +
>     +int libxl__remus_disks_exec_script(libxl__gc *gc,
>     +    libxl__remus_disks_state *state)
>     +{
>     +}
>     +#endif
>     +
> 
> 
> I don't know if this is needed at all, given that we don't have disk script setup issues.
>  
> 
>      
> 
>     +int libxl__remus_disks_setup(libxl__egc *egc, libxl__domain_suspend_state *dss)
>     +{
>     +    libxl__remus_state *remus_state = dss->remus_state;
>     +    int i, j, nr_disks;
>     +    libxl_device_disk *disks;
>     +    libxl__remus_disk *remus_disk;
>     +    const libxl__remus_disk_type *type;
>     +
>     +    STATE_AO_GC(dss->ao);
>     +    disks = libxl_device_disk_list(CTX, dss->domid, &nr_disks);
>     +    remus_state->nr_disks = nr_disks;
>     +    GCNEW_ARRAY(remus_state->disks, nr_disks);
>     +
>     +    for (i = 0; i < nr_disks; i++) {
>     +        remus_disk = NULL;
>     +        for (j = 0; j < ARRAY_SIZE(remus_disk_types); j++) {
>     +            type = remus_disk_types[j];
>     +            remus_disk = type->setup(gc, &disks[i]);
>     +            if (!remus_disk)
>     +                break;
>     +
>     +            remus_state->disks[i] = remus_disk;
>     +            remus_disk->disk = &disks[i];
>     +            remus_disk->type = type;
>     +        }
>     +        if (!remus_disk) {
>     +            remus_state->nr_disks = i;
>     +            libxl__remus_disks_teardown(remus_state);
>     +            return -1;
>     +        }
>     +    }
>     +    return 0;
>     +}
>     +
>     +void libxl__remus_disks_teardown(libxl__remus_state *state)
>     +{
>     +    int i;
>     +
>     +    for (i = 0; i < state->nr_disks; i++)
>     +        state->disks[i]->type->teardown(state->disks[i]);
>     +    state->nr_disks = 0;
>     +}
>     +
>     --
>     1.7.1
> 
> 

  reply	other threads:[~2014-03-12  2:35 UTC|newest]

Thread overview: 89+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-02 11:04 [PATCH V8 0/8] Remus/Libxl: Network buffering support Yang Hongyang
2014-02-10  9:19 ` [PATCH 00/10 V7] " Lai Jiangshan
2014-02-10  9:19   ` [PATCH 01/10 V7] remus: add libnl3 dependency to autoconf scripts Lai Jiangshan
2014-02-10  9:19   ` [PATCH 02/10 V7] tools/libxl: update libxl_domain_remus_info Lai Jiangshan
2014-03-03 16:33     ` Ian Jackson
2014-02-10  9:19   ` [PATCH 03/10 V7] tools/libxl: introduce a new structure libxl__remus_state Lai Jiangshan
2014-03-03 16:38     ` Ian Jackson
2014-02-10  9:19   ` [PATCH 04/10 V7] remus: introduce a function to check whether network buffering is enabled Lai Jiangshan
2014-03-03 16:39     ` Ian Jackson
2014-02-10  9:19   ` [PATCH 05/10 V7] remus: Remus network buffering core and APIs to setup/teardown Lai Jiangshan
2014-03-03 17:44     ` Ian Jackson
2014-02-10  9:19   ` [PATCH 06/10 V7] remus: implement the API to buffer/release packages Lai Jiangshan
2014-03-03 17:48     ` Ian Jackson
2014-02-10  9:19   ` [PATCH 07/10 V7] libxl: use the API to setup/teardown network buffering Lai Jiangshan
2014-03-03 17:51     ` Ian Jackson
2014-02-10  9:19   ` [PATCH 08/10 V7] libxl: rename remus_failover_cb() to remus_replication_failure_cb() Lai Jiangshan
2014-03-03 17:52     ` Ian Jackson
2014-02-10  9:19   ` [PATCH 09/10 V7] libxl: control network buffering in remus callbacks Lai Jiangshan
2014-03-03 17:54     ` Ian Jackson
2014-02-10  9:19   ` [PATCH 10/10 V7] libxl: network buffering cmdline switch Lai Jiangshan
2014-03-03 17:58     ` Ian Jackson
2014-02-26  2:31   ` [PATCH 00/10 V7] Remus/Libxl: Network buffering support Lai Jiangshan
2014-02-26  2:53   ` [PATCH RFC] remus: implement remus replicated checkpointing disk Lai Jiangshan
2014-03-10 11:28     ` Ian Jackson
2014-03-10 12:34       ` Lai Jiangshan
2014-03-10 16:19         ` Ian Jackson
2014-03-11 18:10     ` Shriram Rajagopalan
2014-03-12  2:35       ` Lai Jiangshan [this message]
2014-03-12  6:23         ` Shriram Rajagopalan
2014-03-12 10:07         ` Ian Campbell
2014-03-12 11:57           ` Lai Jiangshan
2014-03-12 12:17             ` Ian Campbell
2014-03-12 12:28               ` Lai Jiangshan
2014-03-12 10:06       ` Ian Campbell
2014-03-12 12:21         ` Lai Jiangshan
2014-04-02 11:04 ` [PATCH V8 1/8] remus: add libnl3 dependency to autoconf scripts Yang Hongyang
2014-04-02 11:04 ` [PATCH V8 2/8] remus: introduce a function to check whether network buffering is enabled Yang Hongyang
2014-04-02 11:04 ` [PATCH V8 3/8] remus: Remus network buffering core and APIs to setup/teardown Yang Hongyang
2014-04-03 14:06   ` [PATCH 05/10 V7] remus: Remus network buffering core and APIs to setup/teardown [and 1 more messages] Ian Jackson
2014-04-02 11:04 ` [PATCH V8 4/8] remus: implement the API to buffer/release packages Yang Hongyang
2014-04-02 11:04 ` [PATCH V8 5/8] libxl: use the API to setup/teardown network buffering Yang Hongyang
2014-04-02 11:04 ` [PATCH V8 6/8] libxl: rename remus_failover_cb() to remus_replication_failure_cb() Yang Hongyang
2014-04-02 11:04 ` [PATCH V8 7/8] libxl: control network buffering in remus callbacks Yang Hongyang
2014-04-02 11:04 ` [PATCH V8 8/8] libxl: network buffering cmdline switch Yang Hongyang
2014-04-03 12:22   ` [PATCH 1/7] introduce a new function libxl__remus_netbuf_setup_done() Lai Jiangshan
2014-04-03 12:22     ` [PATCH 2/7] introduce a new function libxl__remus_netbuf_teardown_done() Lai Jiangshan
2014-04-03 12:22     ` [PATCH 3/7] introduce an API to async exec scripts Lai Jiangshan
2014-04-03 12:22     ` [PATCH 4/7] netbuffer: use async exec API to exec the netbuffer script Lai Jiangshan
2014-04-03 12:22     ` [PATCH 5/7] netbuf: move dev_id from remus_state to netbuf_state Lai Jiangshan
2014-04-03 12:22     ` [PATCH 6/7] remus: implement remus replicated checkpointing disk Lai Jiangshan
2014-04-03 16:41       ` Shriram Rajagopalan
2014-04-04  3:04         ` Lai Jiangshan
2014-04-03 12:22     ` [PATCH 7/7] drbd: implement " Lai Jiangshan
2014-04-03 16:07       ` Shriram Rajagopalan
2014-04-03 14:08     ` [PATCH 1/7] introduce a new function libxl__remus_netbuf_setup_done() Ian Jackson
2014-04-04  8:53       ` Hongyang Yang
  -- strict thread matches above, loose matches on Subject: below --
2014-04-15  5:38 [PATCH V9 00/12] Remus/Libxl: Network buffering support Yang Hongyang
2014-04-15  5:38 ` [PATCH V9 01/12] introduce an API to async exec scripts Yang Hongyang
2014-04-23 15:44   ` Ian Jackson
2014-04-15  5:38 ` [PATCH V9 02/12] libxl_device: use async exec script api Yang Hongyang
2014-04-23 15:48   ` Ian Jackson
2014-04-15  5:38 ` [PATCH V9 03/12] remus: add libnl3 dependency to autoconf scripts Yang Hongyang
2014-04-15  5:38 ` [PATCH V9 04/12] remus: introduce a function to check whether network buffering is enabled Yang Hongyang
2014-04-23 15:50   ` Ian Jackson
2014-04-23 15:51     ` Shriram Rajagopalan
2014-04-30 14:36       ` Ian Jackson
2014-04-15  5:38 ` [PATCH V9 05/12] remus: remus device core and APIs to setup/teardown Yang Hongyang
2014-04-23 16:02   ` [PATCH 07/10 V7] libxl: use the API to setup/teardown network buffering [and 1 more messages] Ian Jackson
2014-04-23 16:55     ` Shriram Rajagopalan
2014-05-02 16:08       ` Ian Jackson
2014-05-02 21:59         ` Shriram Rajagopalan
2014-05-07  5:42         ` Hongyang Yang
2014-05-07 13:12           ` Shriram Rajagopalan
2014-05-12 13:18             ` Ian Jackson
2014-05-13  1:41               ` Hongyang Yang
2014-04-15  5:38 ` [PATCH V9 06/12] remus: implement the API for checkpoint Yang Hongyang
2014-04-23 16:04   ` Ian Jackson
2014-05-14  1:46     ` Hongyang Yang
2014-04-15  5:38 ` [PATCH V9 07/12] remus: Remus network buffering core and APIs to setup/teardown Yang Hongyang
2014-04-15  5:38 ` [PATCH V9 08/12] remus: implement the API to buffer/release packages Yang Hongyang
2014-04-23 16:10   ` Ian Jackson
2014-04-23 17:04     ` Shriram Rajagopalan
2014-05-02 16:10       ` Ian Jackson
2014-04-15  5:38 ` [PATCH V9 09/12] libxl: use the API to setup/teardown network buffering Yang Hongyang
2014-04-23 16:12   ` Ian Jackson
2014-04-16  2:55 ` [PATCH 1/2] drbd: implement replicated checkpointing disk Lai Jiangshan
2014-04-16  2:56   ` [PATCH 2/2] remus: support disk replicated checkpointing Lai Jiangshan
2014-04-23  9:53 ` [PATCH V9 00/12] Remus/Libxl: Network buffering support Hongyang Yang
2014-04-23 15:51 ` Ian Jackson

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=531FC7F3.5060202@cn.fujitsu.com \
    --to=laijs@cn.fujitsu.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=eddie.dong@intel.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=roger.pau@citrix.com \
    --cc=rshriram@cs.ubc.ca \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=wency@cn.fujitsu.com \
    --cc=xen-devel@lists.xen.org \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.