}
int KeyValueStore::BufferTransaction::get_buffer_key(
- StripObjectMap::StripObjectHeader *strip_header, const string &prefix,
- const string &key, bufferlist &bl)
+ StripObjectMap::StripObjectHeader &strip_header,
+ const string &prefix, const string &key, bufferlist &bl)
{
- if (strip_header->buffers.count(make_pair(prefix, key))) {
- bl.swap(strip_header->buffers[make_pair(prefix, key)]);
+ if (strip_header.buffers.count(make_pair(prefix, key))) {
+ bl.swap(strip_header.buffers[make_pair(prefix, key)]);
return 0;
}
set<string> keys;
map<string, bufferlist> out;
keys.insert(key);
- int r = store->backend->get_values_with_header(*strip_header, prefix,
+ int r = store->backend->get_values_with_header(strip_header, prefix,
keys, &out);
if (r < 0) {
- dout(10) << __func__ << " " << strip_header->cid << "/"
- << strip_header->oid << " " << " r = " << r << dendl;
+ dout(10) << __func__ << " " << strip_header.cid << "/"
+ << strip_header.oid << " " << " r = " << r << dendl;
return r;
}
}
void KeyValueStore::BufferTransaction::set_buffer_keys(
- const string &prefix, StripObjectMap::StripObjectHeader *strip_header,
- map<string, bufferlist> &values)
+ StripObjectMap::StripObjectHeader &strip_header,
+ const string &prefix, map<string, bufferlist> &values)
{
- if (store->backend->check_spos(*strip_header, &spos))
+ if (store->backend->check_spos(strip_header, &spos))
return ;
- store->backend->set_keys(strip_header->header, prefix, values, t);
+ store->backend->set_keys(strip_header.header, prefix, values, t);
for (map<string, bufferlist>::iterator iter = values.begin();
iter != values.end(); ++iter) {
- strip_header->buffers[make_pair(prefix, iter->first)].swap(iter->second);
+ strip_header.buffers[make_pair(prefix, iter->first)].swap(iter->second);
}
}
int KeyValueStore::BufferTransaction::remove_buffer_keys(
- const string &prefix, StripObjectMap::StripObjectHeader *strip_header,
+ StripObjectMap::StripObjectHeader &strip_header, const string &prefix,
const set<string> &keys)
{
- if (store->backend->check_spos(*strip_header, &spos))
+ 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();
+ strip_header.buffers[make_pair(prefix, *iter)] = bufferlist();
}
- return store->backend->rm_keys(strip_header->header, prefix, keys, t);
+ return store->backend->rm_keys(strip_header.header, prefix, keys, t);
}
void KeyValueStore::BufferTransaction::clear_buffer_keys(
- const string &prefix, StripObjectMap::StripObjectHeader *strip_header)
+ StripObjectMap::StripObjectHeader &strip_header, const string &prefix)
{
- for (map<pair<string, string>, bufferlist>::iterator iter = strip_header->buffers.begin();
- iter != strip_header->buffers.end(); ++iter) {
+ for (map<pair<string, string>, bufferlist>::iterator iter = strip_header.buffers.begin();
+ iter != strip_header.buffers.end(); ++iter) {
if (iter->first.first == prefix)
iter->second = bufferlist();
}
}
int KeyValueStore::BufferTransaction::clear_buffer(
- StripObjectMap::StripObjectHeader *strip_header)
+ StripObjectMap::StripObjectHeader &strip_header)
{
- if (store->backend->check_spos(*strip_header, &spos))
+ if (store->backend->check_spos(strip_header, &spos))
return 0;
- strip_header->deleted = true;
+ strip_header.deleted = true;
- return store->backend->clear(strip_header->header, t);
+ return store->backend->clear(strip_header.header, t);
}
void KeyValueStore::BufferTransaction::clone_buffer(
- StripObjectMap::StripObjectHeader *old_header,
+ 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 ;
// Remove target ahead to avoid dead lock
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, spos,
&new_origin_header, &new_target_header);
// FIXME: Lacking of lock for origin header(now become parent), it will
// cause other operation can get the origin header while submitting
// transactions
- strip_headers[make_pair(cid, old_header->oid)] = new_origin_header;
+ strip_headers[make_pair(cid, old_header.oid)] = new_origin_header;
strip_headers[make_pair(cid, oid)] = new_target_header;
}
void KeyValueStore::BufferTransaction::rename_buffer(
- StripObjectMap::StripObjectHeader *old_header,
+ 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, spos, &old_header);
- strip_headers.erase(make_pair(old_header->cid, old_header->oid));
- strip_headers[make_pair(cid, oid)] = *old_header;
+ strip_headers.erase(make_pair(old_header.cid, old_header.oid));
+ strip_headers[make_pair(cid, oid)] = old_header;
}
int KeyValueStore::BufferTransaction::submit_transaction()
return r;
}
-int KeyValueStore::_generic_read(coll_t cid, const ghobject_t& oid,
+int KeyValueStore::_generic_read(StripObjectMap::StripObjectHeader &header,
uint64_t offset, size_t len, bufferlist& bl,
bool allow_eio, BufferTransaction *bt)
{
- dout(15) << __func__ << " " << cid << "/" << oid << " " << offset << "~"
- << len << dendl;
-
int r;
- StripObjectMap::StripObjectHeader header;
-
- r = _check_coll(cid);
- if (r < 0) {
- return r;
- }
-
- // use strip_header buffer
- if (bt) {
- StripObjectMap::StripObjectHeader *cache_header;
- r = bt->lookup_cached_header(cid, oid, &cache_header, false);
- if (r == 0) {
- header = *cache_header;
- }
- } else {
- r = backend->lookup_strip_header(cid, oid, header);
- }
-
- if (r < 0) {
- dout(10) << __func__ << " " << cid << "/" << oid << " " << offset << "~"
- << len << " header isn't exist: r = " << r << dendl;
- return r;
- }
if (header.max_size < offset) {
r = -EINVAL;
- dout(10) << __func__ << " " << cid << "/" << oid << ")"
+ dout(10) << __func__ << " " << header.cid << "/" << header.oid << ")"
<< " offset exceed the length of bl"<< dendl;
return r;
}
string key = strip_object_key(iter->no);
if (bt && header.buffers.count(make_pair(OBJECT_STRIP_PREFIX, key))) {
+ // use strip_header buffer
assert(header.bits[iter->no]);
out[key] = header.buffers[make_pair(OBJECT_STRIP_PREFIX, key)];
} else if (header.bits[iter->no]) {
r = backend->get_values_with_header(header, OBJECT_STRIP_PREFIX, keys, &out);
if (r < 0) {
- dout(10) << __func__ << " " << cid << "/" << oid << " " << offset << "~"
- << len << " = " << r << dendl;
+ dout(10) << __func__ << " " << header.cid << "/" << header.oid << " "
+ << offset << "~" << len << " = " << r << dendl;
return r;
}
if (out.size() != keys.size()) {
r = -EINVAL;
- dout(10) << __func__ << " " << cid << "/" << oid << " " << offset << "~"
- << len << " get incorrect key/value pairs " << dendl;
+ dout(5) << __func__ << " " << header.cid << "/" << header.oid << " "
+ << offset << "~" << len << " get incorrect key/value pairs "
+ << dendl;
return r;
}
readed += header.strip_size;
}
- dout(10) << __func__ << " " << cid << "/" << oid << " " << offset
- << "~" << bl.length() << "/" << len << " r = " << r << dendl;
+ dout(10) << __func__ << " " << header.cid << "/" << header.oid << " "
+ << offset << "~" << bl.length() << "/" << len << " r = " << r
+ << dendl;
return bl.length();
}
int KeyValueStore::read(coll_t cid, const ghobject_t& oid, uint64_t offset,
size_t len, bufferlist& bl, bool allow_eio)
{
- return _generic_read(cid, oid, offset, len, bl, allow_eio);
+ dout(15) << __func__ << " " << cid << "/" << oid << " " << offset << "~"
+ << len << dendl;
+
+ StripObjectMap::StripObjectHeader header;
+
+ int r = _check_coll(cid);
+ if (r < 0) {
+ return r;
+ }
+
+ r = backend->lookup_strip_header(cid, oid, header);
+
+ if (r < 0) {
+ dout(10) << __func__ << " " << cid << "/" << oid << " " << offset << "~"
+ << len << " header isn't exist: r = " << r << dendl;
+ return r;
+ }
+
+ return _generic_read(header, offset, len, bl, allow_eio);
}
int KeyValueStore::fiemap(coll_t cid, const ghobject_t& oid,
return r;
}
- r = t.clear_buffer(header);
+ r = t.clear_buffer(*header);
dout(10) << __func__ << " " << cid << "/" << oid << " = " << r << dendl;
return r;
bufferlist value;
bufferlist old;
map<string, bufferlist> values;
- r = t.get_buffer_key(header, OBJECT_STRIP_PREFIX,
+ r = t.get_buffer_key(*header, OBJECT_STRIP_PREFIX,
strip_object_key(iter->no), old);
if (r < 0) {
dout(10) << __func__ << " " << cid << "/" << oid << " "
++iter;
values[strip_object_key(iter->no)] = value;
- t.set_buffer_keys(OBJECT_STRIP_PREFIX, header, values);
+ t.set_buffer_keys(*header, OBJECT_STRIP_PREFIX, values);
}
set<string> keys;
header->bits[iter->no] = 0;
}
}
- r = t.remove_buffer_keys(OBJECT_STRIP_PREFIX, header, keys);
+ r = t.remove_buffer_keys(*header, OBJECT_STRIP_PREFIX, keys);
if (r < 0) {
dout(10) << __func__ << " " << cid << "/" << oid << " "
<< size << " = " << r << dendl;
return r;
}
-int KeyValueStore::_write(coll_t cid, const ghobject_t& oid,
- uint64_t offset, size_t len, const bufferlist& bl,
- BufferTransaction &t, bool replica)
+int KeyValueStore::_generic_write(StripObjectMap::StripObjectHeader &header,
+ uint64_t offset, size_t len,
+ const bufferlist& bl, BufferTransaction &t,
+ bool replica)
{
- dout(15) << __func__ << " " << cid << "/" << oid << " " << offset << "~"
- << len << dendl;
int r;
- StripObjectMap::StripObjectHeader *header;
-
- r = t.lookup_cached_header(cid, oid, &header, true);
- if (r < 0) {
- dout(10) << __func__ << " " << cid << "/" << oid << " " << offset
- << "~" << len << " failed to get header: r = " << r << dendl;
- return r;
- }
if (len > bl.length())
len = bl.length();
- if (len + offset > header->max_size) {
- header->max_size = len + offset;
- header->bits.resize(header->max_size/header->strip_size+1);
+ if (len + offset > header.max_size) {
+ header.max_size = len + offset;
+ header.bits.resize(header.max_size/header.strip_size+1);
}
vector<StripObjectMap::StripExtent> extents;
- StripObjectMap::file_to_extents(offset, len, header->strip_size,
+ StripObjectMap::file_to_extents(offset, len, header.strip_size,
extents);
uint64_t bl_offset = 0;
map<string, bufferlist> values;
iter != extents.end(); ++iter) {
bufferlist value;
string key = strip_object_key(iter->no);
- if (header->bits[iter->no]) {
- if (iter->offset == 0 && iter->len == header->strip_size) {
+ if (header.bits[iter->no]) {
+ if (iter->offset == 0 && iter->len == header.strip_size) {
bl.copy(bl_offset, iter->len, value);
bl_offset += iter->len;
} else {
bufferlist old;
r = t.get_buffer_key(header, OBJECT_STRIP_PREFIX, key, old);
if (r < 0) {
- dout(10) << __func__ << " failed to get value " << cid << "/" << oid
- << " " << offset << "~" << len << " = " << r << dendl;
+ dout(10) << __func__ << " failed to get value " << header.cid << "/"
+ << header.oid << " " << offset << "~" << len << " = " << r
+ << dendl;
return r;
}
bl.copy(bl_offset, iter->len, value);
bl_offset += iter->len;
- if (value.length() != header->strip_size)
- old.copy(value.length(), header->strip_size-value.length(), value);
+ if (value.length() != header.strip_size)
+ old.copy(value.length(), header.strip_size-value.length(), value);
}
} else {
if (iter->offset)
bl.copy(bl_offset, iter->len, value);
bl_offset += iter->len;
- if (value.length() < header->strip_size)
- value.append_zero(header->strip_size-value.length());
+ if (value.length() < header.strip_size)
+ value.append_zero(header.strip_size-value.length());
- header->bits[iter->no] = 1;
+ header.bits[iter->no] = 1;
}
- assert(value.length() == header->strip_size);
+ assert(value.length() == header.strip_size);
values[key].swap(value);
}
assert(bl_offset == len);
- t.set_buffer_keys(OBJECT_STRIP_PREFIX, header, values);
- dout(10) << __func__ << " " << cid << "/" << oid << " " << offset << "~" << len
- << " = " << r << dendl;
+ t.set_buffer_keys(header, OBJECT_STRIP_PREFIX, values);
+ dout(10) << __func__ << " " << header.cid << "/" << header.oid << " "
+ << offset << "~" << len << " = " << r << dendl;
return r;
}
+int KeyValueStore::_write(coll_t cid, const ghobject_t& oid,
+ uint64_t offset, size_t len, const bufferlist& bl,
+ BufferTransaction &t, bool replica)
+{
+ dout(15) << __func__ << " " << cid << "/" << oid << " " << offset << "~"
+ << len << dendl;
+
+ int r;
+ StripObjectMap::StripObjectHeader *header;
+
+ r = t.lookup_cached_header(cid, oid, &header, true);
+ if (r < 0) {
+ dout(10) << __func__ << " " << cid << "/" << oid << " " << offset
+ << "~" << len << " failed to get header: r = " << r << dendl;
+ return r;
+ }
+
+ return _generic_write(*header, offset, len, bl, t, replica);
+}
+
int KeyValueStore::_zero(coll_t cid, const ghobject_t& oid, uint64_t offset,
size_t len, BufferTransaction &t)
{
bl.push_back(bp);
int r = _write(cid, oid, offset, len, bl, t);
- dout(20) << __func__ << " " << cid << "/" << oid << " " << offset << "~"
+ dout(10) << __func__ << " " << cid << "/" << oid << " " << offset << "~"
<< len << " = " << r << dendl;
return r;
}
return r;
}
- t.clone_buffer(old_header, cid, newoid);
+ t.clone_buffer(*old_header, cid, newoid);
dout(10) << __func__ << " " << cid << "/" << oldoid << " -> " << cid << "/"
<< newoid << " = " << r << dendl;
int r;
bufferlist bl;
- r = _generic_read(cid, oldoid, srcoff, len, bl, &t);
+ StripObjectMap::StripObjectHeader *old_header, *new_header;
+
+ r = t.lookup_cached_header(cid, oldoid, &old_header, false);
+ if (r < 0) {
+ dout(10) << __func__ << " " << cid << "/" << oldoid << " -> " << cid << "/"
+ << newoid << " " << srcoff << "~" << len << " to " << dstoff
+ << " header isn't exist: r = " << r << dendl;
+ return r;
+ }
+
+ r = t.lookup_cached_header(cid, newoid, &new_header, true);
+ if (r < 0) {
+ dout(10) << __func__ << " " << cid << "/" << oldoid << " -> " << cid << "/"
+ << newoid << " " << srcoff << "~" << len << " to " << dstoff
+ << " can't create header: r = " << r << dendl;
+ return r;
+ }
+
+ r = _generic_read(*old_header, srcoff, len, bl, &t);
if (r < 0)
goto out;
- r = _write(cid, newoid, dstoff, len, bl, t);
+ r = _generic_write(*new_header, dstoff, len, bl, t);
out:
dout(10) << __func__ << " " << cid << "/" << oldoid << " -> " << cid << "/"
attrs[it->first].push_back(it->second);
}
- t.set_buffer_keys(OBJECT_XATTR, header, attrs);
+ t.set_buffer_keys(*header, OBJECT_XATTR, attrs);
out:
dout(10) << __func__ << " " << cid << "/" << oid << " = " << r << dendl;
}
to_remove.insert(string(name));
- r = t.remove_buffer_keys(OBJECT_XATTR, header, to_remove);
+ r = t.remove_buffer_keys(*header, OBJECT_XATTR, to_remove);
dout(10) << __func__ << " " << cid << "/" << oid << " '" << name << "' = "
<< r << dendl;
return r;
}
- r = t.remove_buffer_keys(OBJECT_XATTR, header, attrs);
- t.clear_buffer_keys(OBJECT_XATTR, header);
+ r = t.remove_buffer_keys(*header, OBJECT_XATTR, attrs);
+ t.clear_buffer_keys(*header, OBJECT_XATTR);
dout(10) << __func__ << " " << cid << "/" << oid << " = " << r << dendl;
return r;
bl.append(reinterpret_cast<const char*>(value), size);
out.insert(make_pair(string(name), bl));
- t.set_buffer_keys(COLLECTION_ATTR, header, out);
+ t.set_buffer_keys(*header, COLLECTION_ATTR, out);
dout(10) << __func__ << " " << c << " '"
<< name << "' len " << size << " = " << r << dendl;
}
out.insert(string(name));
- r = t.remove_buffer_keys(COLLECTION_ATTR, header, out);
+ r = t.remove_buffer_keys(*header, COLLECTION_ATTR, out);
dout(10) << __func__ << " " << c << " = " << r << dendl;
return r;
attrs[it->first].push_back(it->second);
}
- t.set_buffer_keys(COLLECTION_ATTR, header, attrs);
+ t.set_buffer_keys(*header, COLLECTION_ATTR, attrs);
dout(10) << __func__ << " " << cid << " = " << r << dendl;
return r;
}
}
- r = t.clear_buffer(header);
+ r = t.clear_buffer(*header);
out:
dout(10) << __func__ << " " << c << " = " << r << dendl;
goto out;
}
- r = _generic_read(oldcid, o, 0, old_header->max_size, bl, &t);
+ r = _generic_read(*old_header, 0, old_header->max_size, bl, &t);
if (r < 0) {
r = -EINVAL;
goto out;
}
- r = _write(c, o, 0, bl.length(), bl, t);
+ r = _generic_write(*header, 0, bl.length(), bl, t);
if (r < 0) {
r = -EINVAL;
}
return r;
}
- t.rename_buffer(header, c, o);
+ t.rename_buffer(*header, c, o);
dout(10) << __func__ << " " << c << "/" << o << " from " << oldcid << "/"
<< oldoid << " = " << r << dendl;
}
}
- r = t.clear_buffer(header);
+ r = t.clear_buffer(*header);
dout(10) << __func__ << " " << cid << " r = " << r << dendl;
return 0;
return r;
}
- r = t.remove_buffer_keys(OBJECT_OMAP, header, keys);
+ r = t.remove_buffer_keys(*header, OBJECT_OMAP, keys);
if (r < 0) {
dout(10) << __func__ << " could not remove keys r = " << r << dendl;
return r;
keys.clear();
keys.insert(OBJECT_OMAP_HEADER_KEY);
- r = t.remove_buffer_keys(OBJECT_OMAP_HEADER, header, keys);
+ r = t.remove_buffer_keys(*header, OBJECT_OMAP_HEADER, keys);
if (r < 0) {
dout(10) << __func__ << " could not remove keys r = " << r << dendl;
return r;
}
- t.clear_buffer_keys(OBJECT_OMAP_HEADER, header);
+ t.clear_buffer_keys(*header, OBJECT_OMAP_HEADER);
dout(10) << __func__ << " " << cid << "/" << hoid << " r = " << r << dendl;
return 0;
return r;
}
- t.set_buffer_keys(OBJECT_OMAP, header, aset);
+ t.set_buffer_keys(*header, OBJECT_OMAP, aset);
return 0;
}
return r;
}
- r = t.remove_buffer_keys(OBJECT_OMAP, header, keys);
+ r = t.remove_buffer_keys(*header, OBJECT_OMAP, keys);
dout(10) << __func__ << " " << cid << "/" << hoid << " r = " << r << dendl;
return r;
}
sets[OBJECT_OMAP_HEADER_KEY] = bl;
- t.set_buffer_keys(OBJECT_OMAP_HEADER, header, sets);
+ t.set_buffer_keys(*header, OBJECT_OMAP_HEADER, sets);
return 0;
}