}
bool StripObjectMap::check_spos(const StripObjectHeader &header,
- const SequencerPosition *spos)
+ const SequencerPosition &spos)
{
- if (!spos || *spos > header.spos) {
+ if (spos > header.spos) {
stringstream out;
- if (spos)
- dout(10) << "cid: " << "oid: " << header.oid
- << " not skipping op, *spos " << *spos << dendl;
- else
- dout(10) << "cid: " << "oid: " << header.oid
- << " not skipping op, *spos " << "empty" << dendl;
+ dout(10) << "cid: " << "oid: " << header.oid
+ << " not skipping op, *spos " << spos << dendl;
dout(10) << " > header.spos " << header.spos << dendl;
return false;
} else {
- dout(10) << "cid: " << "oid: " << header.oid << " skipping op, *spos "
- << *spos << " <= header.spos " << header.spos << dendl;
+ dout(10) << "cid: " << "oid: " << header.oid << " skipping op, spos "
+ << spos << " <= header.spos " << header.spos << dendl;
return true;
}
}
int StripObjectMap::save_strip_header(StripObjectHeader &strip_header,
+ const SequencerPosition &spos,
KeyValueDB::Transaction t)
{
+ strip_header.spos = spos;
strip_header.header->data.clear();
::encode(strip_header, strip_header.header->data);
void StripObjectMap::clone_wrap(StripObjectHeader &old_header,
const coll_t &cid, const ghobject_t &oid,
KeyValueDB::Transaction t,
- const SequencerPosition &spos,
StripObjectHeader *origin_header,
StripObjectHeader *target_header)
{
old_header.header = new_origin_header;
- if (origin_header)
- origin_header->spos = spos;
-
if (target_header) {
target_header->oid = oid;
target_header->cid = cid;
- target_header->spos = spos;
}
}
void StripObjectMap::rename_wrap(const coll_t &cid, const ghobject_t &oid,
KeyValueDB::Transaction t,
- const SequencerPosition &spos,
StripObjectHeader *header)
{
assert(header);
if (header) {
header->oid = oid;
header->cid = cid;
- header->spos = spos;
}
}
StripObjectMap::StripObjectHeader &strip_header,
const string &prefix, map<string, bufferlist> &values)
{
- if (store->backend->check_spos(strip_header, &spos))
- return ;
-
store->backend->set_keys(strip_header.header, prefix, values, t);
for (map<string, bufferlist>::iterator iter = values.begin();
StripObjectMap::StripObjectHeader &strip_header, const string &prefix,
const set<string> &keys)
{
- if (store->backend->check_spos(strip_header, &spos))
- return 0;
-
for (set<string>::iterator iter = keys.begin(); iter != keys.end(); ++iter) {
strip_header.buffers[make_pair(prefix, *iter)] = bufferlist();
}
int KeyValueStore::BufferTransaction::clear_buffer(
StripObjectMap::StripObjectHeader &strip_header)
{
- if (store->backend->check_spos(strip_header, &spos))
- return 0;
-
strip_header.deleted = true;
return store->backend->clear(strip_header.header, t);
StripObjectMap::StripObjectHeader &old_header,
const coll_t &cid, const ghobject_t &oid)
{
- if (store->backend->check_spos(old_header, &spos))
- return ;
-
// Remove target ahead to avoid dead lock
strip_headers.erase(make_pair(cid, oid));
StripObjectMap::StripObjectHeader new_origin_header, new_target_header;
- store->backend->clone_wrap(old_header, cid, oid, t, spos,
+ store->backend->clone_wrap(old_header, cid, oid, t,
&new_origin_header, &new_target_header);
// FIXME: Lacking of lock for origin header(now become parent), it will
StripObjectMap::StripObjectHeader &old_header,
const coll_t &cid, const ghobject_t &oid)
{
- if (store->backend->check_spos(old_header, &spos))
+ if (store->backend->check_spos(old_header, spos))
return ;
// FIXME: Lacking of lock for origin header, it will cause other operation
// can get the origin header while submitting transactions
- store->backend->rename_wrap(cid, oid, t, spos, &old_header);
+ store->backend->rename_wrap(cid, oid, t, &old_header);
strip_headers.erase(make_pair(old_header.cid, old_header.oid));
strip_headers[make_pair(cid, oid)] = old_header;
header_iter != strip_headers.end(); ++header_iter) {
StripObjectMap::StripObjectHeader header = header_iter->second;
- if (store->backend->check_spos(header, &spos))
+ if (store->backend->check_spos(header, spos))
continue;
if (header.deleted)
continue;
- r = store->backend->save_strip_header(header, t);
+ r = store->backend->save_strip_header(header, spos, t);
if (r < 0) {
dout(10) << __func__ << " save strip header failed " << dendl;
goto out;
};
bool check_spos(const StripObjectHeader &header,
- const SequencerPosition *spos);
+ const SequencerPosition &spos);
void sync_wrap(StripObjectHeader &strip_header, KeyValueDB::Transaction t,
const SequencerPosition &spos);
vector<StripExtent> &extents);
int lookup_strip_header(const coll_t & cid, const ghobject_t &oid,
StripObjectHeader &header);
- int save_strip_header(StripObjectHeader &header, KeyValueDB::Transaction t);
+ int save_strip_header(StripObjectHeader &header,
+ const SequencerPosition &spos,
+ KeyValueDB::Transaction t);
int create_strip_header(const coll_t &cid, const ghobject_t &oid,
StripObjectHeader &strip_header,
KeyValueDB::Transaction t);
void clone_wrap(StripObjectHeader &old_header,
const coll_t &cid, const ghobject_t &oid,
KeyValueDB::Transaction t,
- const SequencerPosition &spos,
StripObjectHeader *origin_header,
StripObjectHeader *target_header);
void rename_wrap(const coll_t &cid, const ghobject_t &oid,
KeyValueDB::Transaction t,
- const SequencerPosition &spos,
StripObjectHeader *header);
// Already hold header to avoid lock header seq again
int get_with_header(