[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 7/7] drbd: implement replicated checkpointing disk



> On Apr 3, 2014, at 5:22 AM, Lai Jiangshan <laijs@xxxxxxxxxxxxxx> wrote:
> 
> Signed-off-by: Lai Jiangshan <laijs@xxxxxxxxxxxxxx>
> Signed-off-by: Wen Congyang <wency@xxxxxxxxxxxxxx>
> ---
> tools/hotplug/Linux/Makefile         |    1 +
> tools/hotplug/Linux/block-drbd-probe |   56 ++++++++++++++
> tools/libxl/Makefile                 |    2 +-
> tools/libxl/libxl_remus_disk.c       |    1 +
> tools/libxl/libxl_remus_disk.h       |    2 +
> tools/libxl/libxl_remus_disk_drbd.c  |  132 ++++++++++++++++++++++++++++++++++
> 6 files changed, 193 insertions(+), 1 deletions(-)
> create mode 100755 tools/hotplug/Linux/block-drbd-probe
> create mode 100644 tools/libxl/libxl_remus_disk_drbd.c
> 
> diff --git a/tools/hotplug/Linux/Makefile b/tools/hotplug/Linux/Makefile
> index 6139c1f..b830a8e 100644
> --- a/tools/hotplug/Linux/Makefile
> +++ b/tools/hotplug/Linux/Makefile
> @@ -24,6 +24,7 @@ XEN_SCRIPTS += xen-hotplug-cleanup
> XEN_SCRIPTS += external-device-migrate
> XEN_SCRIPTS += vscsi
> XEN_SCRIPTS += block-iscsi
> +XEN_SCRIPTS += block-drbd-probe
> XEN_SCRIPTS += $(XEN_SCRIPTS-y)
> 
> XEN_SCRIPT_DATA = xen-script-common.sh locking.sh logging.sh
> diff --git a/tools/hotplug/Linux/block-drbd-probe 
> b/tools/hotplug/Linux/block-drbd-probe
> new file mode 100755
> index 0000000..432f051
> --- /dev/null
> +++ b/tools/hotplug/Linux/block-drbd-probe
> @@ -0,0 +1,56 @@
> +#! /bin/bash
> +#
> +# Copyright (C) 2014 FUJITSU LIMITED
> +#
> +# This library is free software; you can redistribute it and/or
> +# modify it under the terms of version 2.1 of the GNU Lesser General Public
> +# License as published by the Free Software Foundation.
> +#
> +# 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, write to the Free Software
> +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
> +#
> +# Usage:
> +#     block-drbd-probe devicename
> +#
> +# Return value:
> +#     0: the device is drbd device
> +#     1: the device is not drbd device
> +

I was under the impression xl had a separate type for drbd disks.
Anyway, since the disk type checking is done in an external script, 
I suggest you also check for the protocol type (proto D) and drbd version 
(8.3.9 or 8.3.11 iirc).
Otherwise, there is no point initiating drbd replication with Remus.
The old python code has this check, in case you need a reference 
implementation. 

> +function get_res_name()
> +{
> +    local drbd_dev=$1
> +    local drbd_dev_list=($(drbdadm sh-dev all))
> +    local drbd_res_list=($(drbdadm sh-resource all))
> +    local temp_drbd_dev temp_drbd_res
> +    local found=0
> +
> +    for temp_drbd_dev in ${drbd_dev_list[@]}; do
> +        if [[ "$temp_drbd_dev" == "$drbd_dev" ]]; then
> +            found=1
> +            break
> +        fi
> +    done
> +
> +    if [[ $found -eq 0 ]]; then
> +        return 1
> +    fi
> +
> +    for temp_drbd_res in ${drbd_res_list[@]}; do
> +        temp_drbd_dev=$(drbdadm sh-dev $temp_drbd_res)
> +        if [[ "$temp_drbd_dev" == "$drbd_dev" ]]; then
> +            return 0
> +        fi
> +    done
> +
> +    # OOPS
> +    return 2
> +}
> +
> +get_res_name $1
> +exit $?
> diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
> index b040a79..658e1b1 100644
> --- a/tools/libxl/Makefile
> +++ b/tools/libxl/Makefile
> @@ -53,7 +53,7 @@ LIBXL_OBJS-y += libxl_nonetbuffer.o
> endif
> 
> LIBXL_OBJS-y += libxl_remus.o
> -LIBXL_OBJS-y += libxl_remus_disk.o
> +LIBXL_OBJS-y += libxl_remus_disk.o libxl_remus_disk_drbd.o
> 
> LIBXL_OBJS-$(CONFIG_X86) += libxl_cpuid.o libxl_x86.o
> LIBXL_OBJS-$(CONFIG_ARM) += libxl_nocpuid.o libxl_arm.o
> diff --git a/tools/libxl/libxl_remus_disk.c b/tools/libxl/libxl_remus_disk.c
> index ca3e879..3af43e6 100644
> --- a/tools/libxl/libxl_remus_disk.c
> +++ b/tools/libxl/libxl_remus_disk.c
> @@ -33,6 +33,7 @@ typedef struct libxl__remus_disk_state {
> /*** checkpoint disks states and callbacks ***/
> static const libxl__remus_disk_type *remus_disk_types[] =
> {
> +    &drbd_disk_type,
> };
> 
> int libxl__remus_disk_postsuspend(libxl__remus_state *remus_state)
> diff --git a/tools/libxl/libxl_remus_disk.h b/tools/libxl/libxl_remus_disk.h
> index 33b0e59..dfd2432 100644
> --- a/tools/libxl/libxl_remus_disk.h
> +++ b/tools/libxl/libxl_remus_disk.h
> @@ -71,4 +71,6 @@ typedef struct libxl__remus_disk_type {
> extern void disk_match_script_cb(void *disk_state, int status);
> extern void disk_teardown_script_cb(void *disk_state);
> 
> +extern const libxl__remus_disk_type drbd_disk_type;
> +
> #endif
> diff --git a/tools/libxl/libxl_remus_disk_drbd.c 
> b/tools/libxl/libxl_remus_disk_drbd.c
> new file mode 100644
> index 0000000..719e950
> --- /dev/null
> +++ b/tools/libxl/libxl_remus_disk_drbd.c
> @@ -0,0 +1,132 @@
> +/*
> + * Copyright (C) 2014 FUJITSU LIMITED
> + * Author Lai Jiangshan <laijs@xxxxxxxxxxxxxx>
> + *
> + * 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"
> +
> +#include "libxl_remus_disk.h"
> +
> +/*** drbd implementation ***/
> +const int DRBD_SEND_CHECKPOINT = 20;
> +const int DRBD_WAIT_CHECKPOINT_ACK = 30;
> +
> +char *drbd_probe_script;
> +
> +typedef struct libxl__remus_drbd_disk
> +{
> +    int ctl_fd;
> +    int ackwait;
> +    const char *path;
> +} libxl__remus_drbd_disk;
> +
> +static int drbd_postsuspend(libxl__remus_disk *remus_disk)
> +{
> +    struct libxl__remus_drbd_disk *drbd = remus_disk->opaque;
> +
> +    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 *remus_disk)
> +{
> +    struct libxl__remus_drbd_disk *drbd = remus_disk->opaque;
> +
> +    if (drbd->ackwait) {
> +        ioctl(drbd->ctl_fd, DRBD_WAIT_CHECKPOINT_ACK, 0);
> +        drbd->ackwait = 0;
> +    }
> +
> +    return 0;
> +}
> +
> +static int drbd_commit(libxl__remus_disk *remus_disk)
> +{
> +    /* nothing to do, all work are done by DRBD's protocal-D. */
> +    return 0;
> +}
> +
> +static int drbd_match(libxl__domain_suspend_state *dss,
> +                      const libxl_device_disk *disk,
> +                      libxl_async_exec *async_exec,
> +                      void *disk_state)
> +{
> +    int arraysize, nr = 0;
> +    STATE_AO_GC(dss->ao);
> +
> +    if (!drbd_probe_script)
> +        drbd_probe_script = GCSPRINTF("%s/block-drbd-probe",
> +                                      libxl__xen_script_dir_path());
> +
> +    /* setup env & args */
> +    arraysize = 1;
> +    GCNEW_ARRAY(async_exec->env, arraysize);
> +    async_exec->env[nr++] = NULL;
> +    assert(nr <= arraysize);
> +
> +    arraysize = 3;
> +    nr = 0;
> +    GCNEW_ARRAY(async_exec->args, arraysize);
> +    async_exec->args[nr++] = drbd_probe_script;
> +    async_exec->args[nr++] = disk->pdev_path;
> +    async_exec->args[nr++] = NULL;
> +    assert(nr <= arraysize);
> +
> +    async_exec->finish_cb = disk_match_script_cb;
> +    async_exec->opaque = disk_state;
> +    async_exec->allow_fail = true;
> +    async_exec->timeout = LIBXL_HOTPLUG_TIMEOUT;
> +
> +    if (libxl_async_exec_script(gc, async_exec))
> +        return ERROR_FAIL;
> +
> +    return 1;
> +}
> +
> +static int drbd_setup(libxl__remus_disk *remus_disk)
> +{
> +    libxl__remus_drbd_disk *drbd = remus_disk->opaque;
> +
> +    drbd->path = remus_disk->disk->pdev_path;
> +    drbd->ctl_fd = open(drbd->path, O_RDONLY);
> +    drbd->ackwait = 0;
> +
> +    if (drbd->ctl_fd < 0)
> +        return ERROR_INVAL;
> +
> +    return 0;
> +}
> +
> +static int drbd_teardown(libxl__remus_disk *remus_disk, libxl_async_exec 
> *async_exec)
> +{
> +    struct libxl__remus_drbd_disk *drbd = remus_disk->opaque;
> +
> +    close(drbd->ctl_fd);
> +    return 0;
> +}
> +
> +const libxl__remus_disk_type drbd_disk_type = {
> +    .postsuspend = drbd_postsuspend,
> +    .preresume = drbd_preresume,
> +    .commit = drbd_commit,
> +    .match = drbd_match,
> +    .setup = drbd_setup,
> +    .teardown = drbd_teardown,
> +    .size = sizeof(libxl__remus_drbd_disk),
> +};
> -- 
> 1.7.4.4
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.