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>
This commit is contained in:
Samuel Just 2013-05-28 11:10:05 -07:00
parent 8c1c2d98c6
commit 5bca9c38ef

View File

@ -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) {