filestore: guard replay of collection_add

- set guard on apply
- check guard on replay

Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
This commit is contained in:
Sage Weil 2012-03-07 20:55:16 -08:00 committed by Sage Weil
parent 4ea6e0d24f
commit 51372a769e
2 changed files with 18 additions and 3 deletions

View File

@ -2617,7 +2617,7 @@ unsigned FileStore::_do_transaction(Transaction& t, uint64_t op_seq, int trans_n
coll_t ocid = i.get_cid();
coll_t ncid = i.get_cid();
hobject_t oid = i.get_oid();
r = _collection_add(ocid, ncid, oid);
r = _collection_add(ocid, ncid, oid, spos);
}
break;
@ -4239,10 +4239,24 @@ int FileStore::_destroy_collection(coll_t c)
}
int FileStore::_collection_add(coll_t c, coll_t cid, const hobject_t& o)
int FileStore::_collection_add(coll_t c, coll_t cid, const hobject_t& o,
const SequencerPosition& spos)
{
dout(15) << "collection_add " << c << "/" << o << " " << cid << "/" << o << dendl;
if (!_check_replay_guard(c, o, spos))
return 0;
int r = lfn_link(cid, c, o);
// set guard on object so we don't do this again
if (r >= 0) {
int fd = lfn_open(c, o, 0);
assert(fd >= 0);
_set_replay_guard(fd, spos);
TEMP_FAILURE_RETRY(::close(fd));
}
dout(10) << "collection_add " << c << "/" << o << " " << cid << "/" << o << " = " << r << dendl;
return r;
}

View File

@ -418,7 +418,8 @@ public:
int _create_collection(coll_t c);
int _destroy_collection(coll_t c);
int _collection_add(coll_t c, coll_t ocid, const hobject_t& o);
int _collection_add(coll_t c, coll_t ocid, const hobject_t& o,
const SequencerPosition& spos);
int _collection_remove(coll_t c, const hobject_t& o);
int _collection_move(coll_t c, coll_t ocid, const hobject_t& o);