diff options
author | Samuel Just <sam.just@inktank.com> | 2013-05-28 11:10:05 -0700 |
---|---|---|
committer | Samuel Just <sam.just@inktank.com> | 2013-05-28 12:47:51 -0700 |
commit | 5bca9c38ef5187c7a97916970a7fa73b342755ac (patch) | |
tree | 24828d3149eea6b1fae13b816db09fb065eb68fc /src | |
parent | 8c1c2d98c6dc0611e4eb09086fb3939088bad826 (diff) | |
download | ceph-5bca9c38ef5187c7a97916970a7fa73b342755ac.tar.gz |
HashIndex: sync top directory during start_split,merge,col_split
Otherwise, the links might be ordered after the in progress
operation tag write. We need the in progress operation tag to
correctly recover from an interrupted merge, split, or col_split.
Fixes: #5180
Backport: cuttlefish, bobtail
Signed-off-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/os/HashIndex.cc | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/os/HashIndex.cc b/src/os/HashIndex.cc index d5f2d74080c..216f53ce72b 100644 --- a/src/os/HashIndex.cc +++ b/src/os/HashIndex.cc @@ -368,21 +368,30 @@ int HashIndex::start_col_split(const vector<string> &path) { bufferlist bl; InProgressOp op_tag(InProgressOp::COL_SPLIT, path); op_tag.encode(bl); - return add_attr_path(vector<string>(), IN_PROGRESS_OP_TAG, bl); + int r = add_attr_path(vector<string>(), IN_PROGRESS_OP_TAG, bl); + if (r < 0) + return r; + return fsync_dir(vector<string>()); } int HashIndex::start_split(const vector<string> &path) { bufferlist bl; InProgressOp op_tag(InProgressOp::SPLIT, path); op_tag.encode(bl); - return add_attr_path(vector<string>(), IN_PROGRESS_OP_TAG, bl); + int r = add_attr_path(vector<string>(), IN_PROGRESS_OP_TAG, bl); + if (r < 0) + return r; + return fsync_dir(vector<string>()); } int HashIndex::start_merge(const vector<string> &path) { bufferlist bl; InProgressOp op_tag(InProgressOp::MERGE, path); op_tag.encode(bl); - return add_attr_path(vector<string>(), IN_PROGRESS_OP_TAG, bl); + int r = add_attr_path(vector<string>(), IN_PROGRESS_OP_TAG, bl); + if (r < 0) + return r; + return fsync_dir(vector<string>()); } int HashIndex::end_split_or_merge(const vector<string> &path) { |