Skip to content

Commit

Permalink
librbd: OBJECT_PENDING should always be treated as dirty
Browse files Browse the repository at this point in the history
OBJECT_PENDING is a transition state which normally isn't encountered
in (snapshot) object maps.  In case it's encountered, for example when
a snapshot is taken after losing power at the time a discard was being
handled, the object should be treated as dirty and produce a diff as
a result.

Assuming an object is marked OBJECT_PENDING, theoretically there are
four cases with respect to object's state in the next snapshot:

    1. OBJECT_NONEXISTENT
    2. OBJECT_EXISTS
    3. OBJECT_PENDING
    4. OBJECT_EXISTS_CLEAN

Prior to commit b81cd24 ("librbd/object_map: diff state machine
should track object existence"), (3) was handled incorrectly (diff set
to DIFF_STATE_NONE instead of DIFF_STATE_UPDATED).

Post commit 399a45e ("librbd/object_map: rbd diff between two
snapshots lists entire image content"), (4) is handled incorrectly
(diff set to DIFF_STATE_DATA instead of DIFF_STATE_DATA_UPDATED).

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
  • Loading branch information
idryomov committed Dec 11, 2023
1 parent 6b45a2d commit 70c1991
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/librbd/object_map/DiffRequest.cc
Expand Up @@ -266,7 +266,11 @@ void DiffRequest<I>::handle_load_object_map(int r) {
}
} else {
// diffing against a snapshot, this is its object map
*diff_it = DIFF_STATE_DATA;
if (object_map_state != OBJECT_PENDING) {
*diff_it = DIFF_STATE_DATA;
} else {
*diff_it = DIFF_STATE_DATA_UPDATED;
}
}

ldout(cct, 20) << "object state: " << i << " "
Expand Down

0 comments on commit 70c1991

Please sign in to comment.