Skip to content
  • Changlong Xie's avatar
    a8bbee0e
    Backup: export interfaces for extra serialization · a8bbee0e
    Changlong Xie authored
    
    
    Normal backup(sync='none') workflow:
    step 1. NBD peformance I/O write from client to server
       qcow2_co_writev
        bdrv_co_writev
         ...
           bdrv_aligned_pwritev
            notifier_with_return_list_notify -> backup_do_cow
             bdrv_driver_pwritev // write new contents
    
    step 2. drive-backup sync=none
       backup_do_cow
       {
        wait_for_overlapping_requests
        cow_request_begin
        for(; start < end; start++) {
                bdrv_co_readv_no_serialising //read old contents from Secondary disk
                bdrv_co_writev // write old contents to hidden-disk
        }
        cow_request_end
       }
    
    step 3. Then roll back to "step 1" to write new contents to Secondary disk.
    
    And for replication, we must make sure that we only read the old contents from
    Secondary disk in order to keep contents consistent.
    
    1) Replication workflow of Secondary
                                                             virtio-blk
                                                                  ^
    ------->  1 NBD                                               |
       ||     server                                       3 replication
       ||        ^                                                ^
       ||        |           backing                 backing      |
       ||  Secondary disk 6<-------- hidden-disk 5 <-------- active-disk 4
       ||        |                         ^
       ||        '-------------------------'
       ||           drive-backup sync=none 2
    
    Hence, we need these interfaces to implement coarse-grained serialization between
    COW of Secondary disk and the read operation of replication.
    
    Example codes about how to use them:
    
    *#include "block/block_backup.h"
    
    static coroutine_fn int xxx_co_readv()
    {
            CowRequest req;
            BlockJob *job = secondary_disk->bs->job;
    
            if (job) {
                  backup_wait_for_overlapping_requests(job, start, end);
                  backup_cow_request_begin(&req, job, start, end);
                  ret = bdrv_co_readv();
                  backup_cow_request_end(&req);
                  goto out;
            }
            ret = bdrv_co_readv();
    out:
            return ret;
    }
    
    Signed-off-by: default avatarChanglong Xie <xiecl.fnst@cn.fujitsu.com>
    Signed-off-by: default avatarWen Congyang <wency@cn.fujitsu.com>
    Signed-off-by: default avatarWang WeiWei <wangww.fnst@cn.fujitsu.com>
    Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-id: 1469602913-20979-4-git-send-email-xiecl.fnst@cn.fujitsu.com
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    a8bbee0e
    Backup: export interfaces for extra serialization
    Changlong Xie authored
    
    
    Normal backup(sync='none') workflow:
    step 1. NBD peformance I/O write from client to server
       qcow2_co_writev
        bdrv_co_writev
         ...
           bdrv_aligned_pwritev
            notifier_with_return_list_notify -> backup_do_cow
             bdrv_driver_pwritev // write new contents
    
    step 2. drive-backup sync=none
       backup_do_cow
       {
        wait_for_overlapping_requests
        cow_request_begin
        for(; start < end; start++) {
                bdrv_co_readv_no_serialising //read old contents from Secondary disk
                bdrv_co_writev // write old contents to hidden-disk
        }
        cow_request_end
       }
    
    step 3. Then roll back to "step 1" to write new contents to Secondary disk.
    
    And for replication, we must make sure that we only read the old contents from
    Secondary disk in order to keep contents consistent.
    
    1) Replication workflow of Secondary
                                                             virtio-blk
                                                                  ^
    ------->  1 NBD                                               |
       ||     server                                       3 replication
       ||        ^                                                ^
       ||        |           backing                 backing      |
       ||  Secondary disk 6<-------- hidden-disk 5 <-------- active-disk 4
       ||        |                         ^
       ||        '-------------------------'
       ||           drive-backup sync=none 2
    
    Hence, we need these interfaces to implement coarse-grained serialization between
    COW of Secondary disk and the read operation of replication.
    
    Example codes about how to use them:
    
    *#include "block/block_backup.h"
    
    static coroutine_fn int xxx_co_readv()
    {
            CowRequest req;
            BlockJob *job = secondary_disk->bs->job;
    
            if (job) {
                  backup_wait_for_overlapping_requests(job, start, end);
                  backup_cow_request_begin(&req, job, start, end);
                  ret = bdrv_co_readv();
                  backup_cow_request_end(&req);
                  goto out;
            }
            ret = bdrv_co_readv();
    out:
            return ret;
    }
    
    Signed-off-by: default avatarChanglong Xie <xiecl.fnst@cn.fujitsu.com>
    Signed-off-by: default avatarWen Congyang <wency@cn.fujitsu.com>
    Signed-off-by: default avatarWang WeiWei <wangww.fnst@cn.fujitsu.com>
    Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-id: 1469602913-20979-4-git-send-email-xiecl.fnst@cn.fujitsu.com
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Loading