From: Samuel Just Date: Tue, 28 May 2013 18:10:05 +0000 (-0700) Subject: HashIndex: sync top directory during start_split,merge,col_split X-Git-Tag: v0.56.7~19 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fca54bfbb35f0c200fac52963cd2d1780467f59a;p=ceph.git 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 Reviewed-by: Sage Weil (cherry picked from commit 5bca9c38ef5187c7a97916970a7fa73b342755ac) --- diff --git a/src/os/HashIndex.cc b/src/os/HashIndex.cc index 5e880e1e30a4..5dd5e4392c06 100644 --- a/src/os/HashIndex.cc +++ b/src/os/HashIndex.cc @@ -368,21 +368,30 @@ int HashIndex::start_col_split(const vector &path) { bufferlist bl; InProgressOp op_tag(InProgressOp::COL_SPLIT, path); op_tag.encode(bl); - return add_attr_path(vector(), IN_PROGRESS_OP_TAG, bl); + int r = add_attr_path(vector(), IN_PROGRESS_OP_TAG, bl); + if (r < 0) + return r; + return fsync_dir(vector()); } int HashIndex::start_split(const vector &path) { bufferlist bl; InProgressOp op_tag(InProgressOp::SPLIT, path); op_tag.encode(bl); - return add_attr_path(vector(), IN_PROGRESS_OP_TAG, bl); + int r = add_attr_path(vector(), IN_PROGRESS_OP_TAG, bl); + if (r < 0) + return r; + return fsync_dir(vector()); } int HashIndex::start_merge(const vector &path) { bufferlist bl; InProgressOp op_tag(InProgressOp::MERGE, path); op_tag.encode(bl); - return add_attr_path(vector(), IN_PROGRESS_OP_TAG, bl); + int r = add_attr_path(vector(), IN_PROGRESS_OP_TAG, bl); + if (r < 0) + return r; + return fsync_dir(vector()); } int HashIndex::end_split_or_merge(const vector &path) {