std::map<std::string, bufferlist> *out_vals,
int *prval);
+ /**
+ * omap_get_vals: keys and values from the object omap
+ *
+ * Get up to max_return keys and values beginning after start_after
+ *
+ * @param start_after [in] list no keys smaller than start_after
+ * @param filter_prefix [in] list only keys beginning with filter_prefix
+ * @parem max_return [in] list no more than max_return key/value pairs
+ * @param out_vals [out] place returned values in out_vals on completion
+ * @param prval [out] place error code in prval upon completion
+ */
+ void omap_get_vals(
+ const std::string &start_after,
+ const std::string &filter_prefix,
+ uint64_t max_return,
+ std::map<std::string, bufferlist> *out_vals,
+ int *prval);
+
/**
* omap_get_keys: keys from the object omap
-Subproject commit 8b5ada5c89c0fc34b3c277337d9b3f2c6f1fb85d
+Subproject commit 08c39ee222de6c07f94724bcd61d33573e2f873a
void librados::ObjectReadOperation::omap_get_vals(
const std::string &start_after,
+ const std::string &filter_prefix,
uint64_t max_return,
std::map<std::string, bufferlist> *out_vals,
int *prval)
{
::ObjectOperation *o = (::ObjectOperation *)impl;
- o->omap_get_vals(start_after, max_return, out_vals, prval);
+ o->omap_get_vals(start_after, filter_prefix, max_return, out_vals, prval);
+}
+
+void librados::ObjectReadOperation::omap_get_vals(
+ const std::string &start_after,
+ uint64_t max_return,
+ std::map<std::string, bufferlist> *out_vals,
+ int *prval)
+{
+ ::ObjectOperation *o = (::ObjectOperation *)impl;
+ o->omap_get_vals(start_after, "", max_return, out_vals, prval);
}
void librados::ObjectReadOperation::omap_get_keys(
{
string start_after;
uint64_t max_return;
+ string filter_prefix;
::decode(start_after, bp);
::decode(max_return, bp);
+ ::decode(filter_prefix, bp);
map<string, bufferlist> out_set;
if (oi.uses_tmap && g_conf->osd_auto_upgrade_tmap) {
int r = _get_tmap(ctx, &vals, &header);
if (r == 0) {
map<string, bufferlist>::iterator iter = vals.upper_bound(start_after);
+ if (filter_prefix > start_after) iter = vals.lower_bound(filter_prefix);
for (uint64_t i = 0;
- i < max_return && iter != vals.end();
+ i < max_return && iter != vals.end() &&
+ iter->first.substr(0, filter_prefix.size()) == filter_prefix;
++i, iter++) {
out_set.insert(*iter);
}
);
assert(iter);
iter->upper_bound(start_after);
+ if (filter_prefix >= start_after) iter->lower_bound(filter_prefix);
for (uint64_t i = 0;
- i < max_return && iter->valid();
+ i < max_return && iter->valid() &&
+ iter->key().substr(0, filter_prefix.size()) == filter_prefix;
++i, iter->next()) {
dout(20) << "Found key " << iter->key() << dendl;
out_set.insert(make_pair(iter->key(), iter->value()));
}
void omap_get_vals(const string &start_after,
+ const string &filter_prefix,
uint64_t max_to_get,
std::map<std::string, bufferlist> *out_set,
int *prval) {
bufferlist bl;
::encode(start_after, bl);
::encode(max_to_get, bl);
+ ::encode(filter_prefix, bl);
op.op.extent.offset = 0;
op.op.extent.length = bl.length();
op.indata.claim_append(bl);
string val = "bar";
to_set["foo"] = header_to_set;
to_set["foo2"] = header_to_set;
- to_set["foo3"] = header_to_set;
+ to_set["qfoo3"] = header_to_set;
op.omap_set(to_set);
op.omap_set_header(header_to_set);
set<string> to_get;
map<string, bufferlist> got3;
+ map<string, bufferlist> got4;
+
bufferlist header;
op.omap_get_keys("", 1, &set_got, 0);
op.omap_get_vals("foo", 1, &map_got, 0);
to_get.insert("foo");
- to_get.insert("foo3");
+ to_get.insert("qfoo3");
op.omap_get_vals_by_key(to_get, &got3, 0);
op.omap_get_header(&header, 0);
+ op.omap_get_vals("foo2", "q", 1, &got4, 0);
+
ioctx.aio_operate("test_obj", my_completion.get(), &op, 0);
{
TestAlarm alarm;
ASSERT_EQ(map_got.begin()->first, "foo2");
ASSERT_EQ(got3.size(), (unsigned)2);
ASSERT_EQ(got3.begin()->first, "foo");
- ASSERT_EQ(got3.rbegin()->first, "foo3");
+ ASSERT_EQ(got3.rbegin()->first, "qfoo3");
+ ASSERT_EQ(got4.size(), (unsigned)1);
+ ASSERT_EQ(got4.begin()->first, "qfoo3");
}
{