Skip to content
  • Vladimir Sementsov-Ogievskiy's avatar
    d0ebeca1
    block/block-copy: fix progress calculation · d0ebeca1
    Vladimir Sementsov-Ogievskiy authored
    
    
    Assume we have two regions, A and B, and region B is in-flight now,
    region A is not yet touched, but it is unallocated and should be
    skipped.
    
    Correspondingly, as progress we have
    
      total = A + B
      current = 0
    
    If we reset unallocated region A and call progress_reset_callback,
    it will calculate 0 bytes dirty in the bitmap and call
    job_progress_set_remaining, which will set
    
       total = current + 0 = 0 + 0 = 0
    
    So, B bytes are actually removed from total accounting. When job
    finishes we'll have
    
       total = 0
       current = B
    
    , which doesn't sound good.
    
    This is because we didn't considered in-flight bytes, actually when
    calculating remaining, we should have set (in_flight + dirty_bytes)
    as remaining, not only dirty_bytes.
    
    To fix it, let's refactor progress calculation, moving it to block-copy
    itself instead of fixing callback. And, of course, track in_flight
    bytes count.
    
    We still have to keep one callback, to maintain backup job bytes_read
    calculation, but it will go on soon, when we turn the whole backup
    process into one block_copy call.
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Reviewed-by: default avatarAndrey Shinkevich <andrey.shinkevich@virtuozzo.com>
    Message-Id: <20200311103004.7649-3-vsementsov@virtuozzo.com>
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
    d0ebeca1
    block/block-copy: fix progress calculation
    Vladimir Sementsov-Ogievskiy authored
    
    
    Assume we have two regions, A and B, and region B is in-flight now,
    region A is not yet touched, but it is unallocated and should be
    skipped.
    
    Correspondingly, as progress we have
    
      total = A + B
      current = 0
    
    If we reset unallocated region A and call progress_reset_callback,
    it will calculate 0 bytes dirty in the bitmap and call
    job_progress_set_remaining, which will set
    
       total = current + 0 = 0 + 0 = 0
    
    So, B bytes are actually removed from total accounting. When job
    finishes we'll have
    
       total = 0
       current = B
    
    , which doesn't sound good.
    
    This is because we didn't considered in-flight bytes, actually when
    calculating remaining, we should have set (in_flight + dirty_bytes)
    as remaining, not only dirty_bytes.
    
    To fix it, let's refactor progress calculation, moving it to block-copy
    itself instead of fixing callback. And, of course, track in_flight
    bytes count.
    
    We still have to keep one callback, to maintain backup job bytes_read
    calculation, but it will go on soon, when we turn the whole backup
    process into one block_copy call.
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Reviewed-by: default avatarAndrey Shinkevich <andrey.shinkevich@virtuozzo.com>
    Message-Id: <20200311103004.7649-3-vsementsov@virtuozzo.com>
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
Loading