#if GTEST_HAS_PARAM_TEST
-static void dump_bl_mismatch(bufferlist& expected, bufferlist& actual);
+static bool bl_eq(bufferlist& expected, bufferlist& actual)
+{
+ if (expected.contents_equal(actual))
+ return true;
+
+ unsigned first = 0;
+ if(expected.length() != actual.length()) {
+ cout << "--- buffer lengths mismatch " << std::hex
+ << "expected 0x" << expected.length() << " != actual 0x"
+ << actual.length() << std::dec << std::endl;
+ }
+ auto len = MIN(expected.length(), actual.length());
+ while ( first<len && expected[first] == actual[first])
+ ++first;
+ unsigned last = len;
+ while (last > 0 && expected[last-1] == actual[last-1])
+ --last;
+ if(len > 0) {
+ cout << "--- buffer mismatch between offset 0x" << std::hex << first
+ << " and 0x" << last << ", total 0x" << len << std::dec
+ << std::endl;
+ cout << "--- expected:\n";
+ expected.hexdump(cout);
+ cout << "--- actual:\n";
+ actual.hexdump(cout);
+ }
+ return false;
+}
+
+
template <typename T>
int apply_transaction(
r = store->read(cid, hoid, 0, 0x4000, in);
ASSERT_EQ(0x1000, r);
exp.append(a);
- ASSERT_TRUE(in.contents_equal(exp));
+ ASSERT_TRUE(bl_eq(exp, in));
}
{
ObjectStore::Transaction t;
ASSERT_EQ(0x2000, r);
exp.append(a);
exp.append(b);
- ASSERT_TRUE(in.contents_equal(exp));
+ ASSERT_TRUE(bl_eq(exp, in));
}
{
ObjectStore::Transaction t;
exp.append(b);
exp.append(z);
exp.append(c);
- ASSERT_TRUE(in.contents_equal(exp));
+ ASSERT_TRUE(bl_eq(exp, in));
}
{
ObjectStore::Transaction t;
exp.append(b);
exp.append(a);
exp.append(c);
- ASSERT_TRUE(in.contents_equal(exp));
+ ASSERT_TRUE(bl_eq(exp, in));
}
{
ObjectStore::Transaction t;
exp.append(b);
exp.append(a);
exp.append(c);
- ASSERT_TRUE(in.contents_equal(exp));
+ ASSERT_TRUE(bl_eq(exp, in));
}
{
ObjectStore::Transaction t;
expected.append(bl);
expected.append_zero(5);
expected.append(bl);
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
}
//overwrite over the same extents
expected.append(bl);
expected.append_zero(5);
expected.append(bl);
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
}
//additional write to an unused region of some blob
expected.append_zero(5);
expected.append(bl2);
- if (!newdata.contents_equal(expected)){
- dump_bl_mismatch(expected, newdata);
- }
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
}
//additional write to an unused region of some blob and partial owerite over existing extents
expected.append(bl2);
expected.append(bl2);
- if (!newdata.contents_equal(expected)){
- dump_bl_mismatch(expected, newdata);
- }
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
}
}
{
bufferlist expected;
expected.append(data);
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
newdata.clear();
r = store->read(cid, hoid, 0, 711 , newdata);
{
bufferlist expected;
expected.append(data.substr(0,711));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
newdata.clear();
r = store->read(cid, hoid, 0xf00f, data.size(), newdata);
{
bufferlist expected;
expected.append(data.substr(0xf00f));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
}
std::string data2;
bufferlist expected;
expected.append(data.substr(0, 0x8000));
expected.append(data2.substr(0, 0x8000));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
newdata.clear();
r = store->read(cid, hoid, 0x9000, 711 , newdata);
{
bufferlist expected;
expected.append(data2.substr(0x1000,711));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
newdata.clear();
r = store->read(cid, hoid, 0x0, 0x40000, newdata);
expected.append(data.substr(0, 0x8000));
expected.append(data2.substr(0, 0x37000));
expected.append(data.substr(0x3f000, 0x1000));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
}
data2.resize(0x3f000);
{
bufferlist expected;
expected.append(data2.substr(0, 0x3e000 - 1));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
newdata.clear();
r = store->read(cid, hoid, 0x3e000-1, 0x2001, newdata);
bufferlist expected;
expected.append(data2.substr(0x3e000-1, 0x1001));
expected.append(data.substr(0x3f000, 0x1000));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
newdata.clear();
r = store->read(cid, hoid, 0x0, 0x40000, newdata);
bufferlist expected;
expected.append(data2.substr(0, 0x3f000));
expected.append(data.substr(0x3f000, 0x1000));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
}
data.resize(0x1001);
bufferlist expected;
expected.append(data2.substr(0x3e000, 0x1000 - 1));
expected.append(data.substr(0, 0x1001));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
}
{
bufferlist in;
r = store->read(cid, hoid, 0, 5, in);
ASSERT_EQ(5, r);
- ASSERT_TRUE(in.contents_equal(orig));
+ ASSERT_TRUE(bl_eq(orig, in));
}
{
ObjectStore::Transaction t;
bufferlist in;
r = store->read(cid, hoid, 0, 10, in);
ASSERT_EQ(10, r);
- ASSERT_TRUE(in.contents_equal(exp));
+ ASSERT_TRUE(bl_eq(exp, in));
}
{
ObjectStore::Transaction t;
bufferlist in;
r = store->read(cid, hoid, 0, 10, in);
ASSERT_EQ(10, r);
- ASSERT_TRUE(in.contents_equal(exp));
+ ASSERT_TRUE(bl_eq(exp, in));
}
{
ObjectStore::Transaction t;
r = store->read(cid, hoid, 0, 10, in);
ASSERT_EQ(10, r);
in.hexdump(cout);
- ASSERT_TRUE(in.contents_equal(exp));
+ ASSERT_TRUE(bl_eq(exp, in));
}
{
{
r = store->read(cid, hoid, 0, 10, in);
ASSERT_EQ(10, r);
in.hexdump(cout);
- ASSERT_TRUE(in.contents_equal(exp));
+ ASSERT_TRUE(bl_eq(exp, in));
}
{
ObjectStore::Transaction t;
r = store->read(cid, hoid, 0, bl.length(), in);
ASSERT_EQ((int)bl.length(), r);
in.hexdump(cout);
- ASSERT_TRUE(in.contents_equal(bl));
+ ASSERT_TRUE(bl_eq(bl, in));
}
{
bufferlist bl;
r = store->read(cid, hoid, 0, 0, in);
ASSERT_EQ((int)bl.length(), r);
in.hexdump(cout);
- ASSERT_TRUE(in.contents_equal(bl));
+ ASSERT_TRUE(bl_eq(bl, in));
}
{
//verifying unaligned csums
exp3.append(s3);
r = store->read(cid, hoid, 0x1000-1, 1, in);
ASSERT_EQ(1, r);
- ASSERT_TRUE(in.contents_equal(exp1));
+ ASSERT_TRUE(bl_eq(exp1, in));
in.clear();
r = store->read(cid, hoid, 0x1000, 0x1000, in);
ASSERT_EQ(0x1000, r);
- ASSERT_TRUE(in.contents_equal(exp2));
+ ASSERT_TRUE(bl_eq(exp2, in));
{
ObjectStore::Transaction t;
in.clear();
r = store->read(cid, hoid, 1, 2, in);
ASSERT_EQ(2, r);
- ASSERT_TRUE(in.contents_equal(exp3));
+ ASSERT_TRUE(bl_eq(exp3, in));
in.clear();
r = store->read(cid, hoid, 0x1000-1, 1, in);
ASSERT_EQ(1, r);
- ASSERT_TRUE(in.contents_equal(exp1));
+ ASSERT_TRUE(bl_eq(exp1, in));
in.clear();
r = store->read(cid, hoid, 0x1000, 0x1000, in);
ASSERT_EQ(0x1000, r);
- ASSERT_TRUE(in.contents_equal(exp2));
+ ASSERT_TRUE(bl_eq(exp2, in));
}
expected.append(data.substr(0, 0x10000));
expected.append(string(0x10000, 0));
expected.append(data.substr(0x20000, 0x10000));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
newdata.clear();
expected.append(data.substr(1, 0x10000-1));
expected.append(string(0x10000, 0));
expected.append(data.substr(0x20000, 0x10000 - 1));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
newdata.clear();
}
expected.append(string(0x1, 0));
expected.append(string(data2));
expected.append(data.substr(0x20003, 21-4));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
newdata.clear();
}
expected.append(string(0x10000-4, 0));
expected.append(string(0x3, 'b'));
expected.append(data.substr(0x20004, 21-3));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
newdata.clear();
}
expected.append(string(0x10000, 0));
expected.append(string(0x10000, 'c'));
expected.append(string(0x10000, 0));
- ASSERT_TRUE(newdata.contents_equal(expected));
+ ASSERT_TRUE(bl_eq(expected, newdata));
}
newdata.clear();
}
{
ASSERT_EQ((int)final.length(),
store->read(cid, a, 0, final.length(), actual));
- ASSERT_TRUE(final.contents_equal(actual));
+ ASSERT_TRUE(bl_eq(final, actual));
}
{
ObjectStore::Transaction t;
store->read(cid, a, 0, final.length(), actual));
final.hexdump(cout);
actual.hexdump(cout);
- ASSERT_TRUE(final.contents_equal(actual));
+ ASSERT_TRUE(bl_eq(final, actual));
}
{
ObjectStore::Transaction t;
ASSERT_EQ(0, r);
bufferlist bl;
bl.append(bp);
- ASSERT_TRUE(bl.contents_equal(val));
+ ASSERT_TRUE(bl_eq(val, bl));
map<string,bufferptr> bm;
r = store->getattrs(cid, hoid, bm);
r = store->read(cid, hoid, 10, 5, newdata);
ASSERT_EQ(r, 5);
- ASSERT_TRUE(newdata.contents_equal(large));
+ ASSERT_TRUE(bl_eq(large, newdata));
newdata.clear();
r = store->read(cid, hoid, 0, 5, newdata);
ASSERT_EQ(r, 5);
- ASSERT_TRUE(newdata.contents_equal(small));
+ ASSERT_TRUE(bl_eq(small, newdata));
newdata.clear();
r = store->read(cid, hoid2, 10, 5, newdata);
ASSERT_EQ(r, 5);
- ASSERT_TRUE(newdata.contents_equal(small));
+ ASSERT_TRUE(bl_eq(small, newdata));
r = store->getattr(cid, hoid2, "attr2", attr);
ASSERT_EQ(r, 0);
- ASSERT_TRUE(attr.contents_equal(small));
+ ASSERT_TRUE(bl_eq(small, attr));
attr.clear();
r = store->getattr(cid, hoid2, "attr3", attr);
ASSERT_EQ(r, 0);
- ASSERT_TRUE(attr.contents_equal(xlarge));
+ ASSERT_TRUE(bl_eq(xlarge, attr));
attr.clear();
r = store->getattr(cid, hoid, "attr1", attr);
ASSERT_EQ(r, 0);
- ASSERT_TRUE(attr.contents_equal(large));
+ ASSERT_TRUE(bl_eq(large, attr));
}
{
ObjectStore::Transaction t;
bufferlist rl;
ASSERT_EQ((int)final.length(),
store->read(cid, hoid, 0, final.length(), rl));
- ASSERT_TRUE(final.contents_equal(rl));
+ ASSERT_TRUE(bl_eq(rl, final));
}
{
ObjectStore::Transaction t;
bufferlist rl;
ASSERT_EQ((int)final.length(),
store->read(cid, hoid, 0, final.length(), rl));
- ASSERT_TRUE(final.contents_equal(rl));
+ ASSERT_TRUE(bl_eq(rl, final));
}
{
ObjectStore::Transaction t;
final.hexdump(cout);
cout << "got:\n";
rl.hexdump(cout);*/
- ASSERT_TRUE(final.contents_equal(rl));
+ ASSERT_TRUE(bl_eq(rl, final));
}
{
ObjectStore::Transaction t;
final.hexdump(cout);
cout << "got:\n";
rl.hexdump(cout);*/
- ASSERT_TRUE(final.contents_equal(rl));
+ ASSERT_TRUE(bl_eq(rl, final));
}
{
ObjectStore::Transaction t;
final.hexdump(cout);
cout << "got:\n";
rl.hexdump(cout);*/
- ASSERT_TRUE(final.contents_equal(rl));
+ ASSERT_TRUE(bl_eq(rl, final));
}
{
ObjectStore::Transaction t;
final.hexdump(cout);
cout << "got:\n";
rl.hexdump(cout);*/
- ASSERT_TRUE(final.contents_equal(rl));
+ ASSERT_TRUE(bl_eq(rl, final));
}
{
ObjectStore::Transaction t;
bufferlist h;
map<string,bufferlist> r;
store->omap_get(cid, hoid, &h, &r);
- ASSERT_TRUE(h.contents_equal(header));
+ ASSERT_TRUE(bl_eq(header, h));
ASSERT_EQ(r.size(), km.size());
cout << "r: " << r << std::endl;
}
map<string,bufferlist> r;
bufferlist h;
store->omap_get(cid, hoid2, &h, &r);
- ASSERT_TRUE(h.contents_equal(header));
+ ASSERT_TRUE(bl_eq(header, h));
ASSERT_EQ(r.size(), km.size());
}
{
ASSERT_EQ(r, 0);
r = store->read(cid, hoid2, 0, 5, newdata);
ASSERT_EQ(r, 5);
- ASSERT_TRUE(newdata.contents_equal(small));
+ ASSERT_TRUE(bl_eq(small, newdata));
}
{
ObjectStore::Transaction t;
}
};
-static void dump_bl_mismatch(bufferlist& expected, bufferlist& actual)
-{
- cout << __func__ << std::endl;
- unsigned first = 0;
- if(expected.length() != actual.length()) {
- cout << "--- buffer lengths mismatch " << std::hex
- << "expected 0x" << expected.length() << " != actual 0x"
- << actual.length() << std::dec << std::endl;
- }
- auto len = MIN(expected.length(), actual.length());
- while ( first<len && expected[first] == actual[first])
- ++first;
- unsigned last = len;
- while (last > 0 && expected[last-1] == actual[last-1])
- --last;
- if(len > 0) {
- cout << "--- buffer mismatch between offset 0x" << std::hex << first
- << " and 0x" << last << ", total 0x" << len << std::dec
- << std::endl;
- cout << "--- expected:\n";
- expected.hexdump(cout);
- cout << "--- actual:\n";
- actual.hexdump(cout);
- }
-}
-
class SyntheticWorkloadState {
struct Object {
bufferlist data;
bufferlist r2;
r = state->store->read(state->cid, hoid, 0, state->contents[hoid].data.length(), r2);
- if (!state->contents[hoid].data.contents_equal(r2)) {
- dump_bl_mismatch(state->contents[hoid].data, r2);
- assert(0 == "mismatch in OnReadable");
- ASSERT_TRUE(state->contents[hoid].data.contents_equal(r2));
- }
+ assert(bl_eq(state->contents[hoid].data, r2));
state->cond.Signal();
}
};
r = state->store->read(
state->cid, noid, 0,
state->contents[noid].data.length(), r2);
- if (!state->contents[noid].data.contents_equal(r2)) {
- dump_bl_mismatch(state->contents[noid].data, r2);
- assert(0 == " mismatch after clone");
- ASSERT_TRUE(state->contents[noid].data.contents_equal(r2));
- }
+ assert(bl_eq(state->contents[noid].data, r2));
state->cond.Signal();
}
};
--(state->in_flight);
bufferlist r2;
r = state->store->read(state->cid, noid, 0, state->contents[noid].data.length(), r2);
- if (!state->contents[noid].data.contents_equal(r2)) {
- dump_bl_mismatch(state->contents[noid].data, r2);
- assert(0 == " mismatch after clone");
- ASSERT_TRUE(state->contents[noid].data.contents_equal(r2));
- }
+ assert(bl_eq(state->contents[noid].data, r2));
state->cond.Signal();
}
};
ASSERT_TRUE(attrs.size() == expected.size());
for (map<string, bufferlist>::iterator it = expected.begin();
it != expected.end(); ++it) {
- ASSERT_TRUE(it->second.contents_equal(attrs[it->first]));
+ ASSERT_TRUE(bl_eq(attrs[it->first], it->second));
}
}
bufferlist bl;
r = store->getattr(cid, obj, it->first, bl);
ASSERT_EQ(r, 0);
- ASSERT_TRUE(it->second.contents_equal(bl));
+ ASSERT_TRUE(bl_eq(it->second, bl));
}
int rmattr() {
ASSERT_EQ(len, result.length());
expected.copy(offset, len, bl);
ASSERT_EQ(r, (int)len);
- if (!result.contents_equal(bl)) {
- cout << " obj " << obj
- << " size " << expected.length()
- << " offset " << offset
- << " len " << len << std::endl;
- dump_bl_mismatch(bl, result);
- assert(0 == "mismatch after read");
- ASSERT_TRUE(result.contents_equal(bl));
- }
+ ASSERT_TRUE(bl_eq(bl, result));
}
}
r = store->omap_get(cid, hoid, &bl3, &cur_attrs);
ASSERT_EQ(r, 0);
ASSERT_EQ(cur_attrs.size(), size_t(1));
- ASSERT_TRUE(bl3.contents_equal(bl1));
+ ASSERT_TRUE(bl_eq(bl1, bl3));
set<string> keys;
r = store->omap_get_keys(cid, hoid, &keys);
{
bufferlist bl;
store->read(cid, srcoid, 0, 3, bl);
- ASSERT_TRUE(bl.contents_equal(b));
+ ASSERT_TRUE(bl_eq(b, bl));
store->read(cid, dstoid, 0, 3, bl);
- ASSERT_TRUE(bl.contents_equal(a));
+ ASSERT_TRUE(bl_eq(a, bl));
}
{
ObjectStore::Transaction t;
{
bufferlist bl;
store->read(cid, dstoid, 0, 3, bl);
- ASSERT_TRUE(bl.contents_equal(b));
+ ASSERT_TRUE(bl_eq(b, bl));
}
{
ObjectStore::Transaction t;
bufferlist newdata;
r = store->read(cid, oid, 0, 1000, newdata);
ASSERT_GE(r, 0);
- ASSERT_TRUE(newdata.contents_equal(data));
+ ASSERT_TRUE(bl_eq(data, newdata));
bufferlist newattr;
r = store->getattr(cid, oid, "attr", newattr);
ASSERT_EQ(r, 0);
- ASSERT_TRUE(newattr.contents_equal(attr));
+ ASSERT_TRUE(bl_eq(attr, newattr));
set<string> keys;
keys.insert("omap_key");
map<string, bufferlist> newomap;
ASSERT_GE(r, 0);
ASSERT_EQ(1u, newomap.size());
ASSERT_TRUE(newomap.count("omap_key"));
- ASSERT_TRUE(newomap["omap_key"].contents_equal(omap["omap_key"]));
+ ASSERT_TRUE(bl_eq(omap["omap_key"], newomap["omap_key"]));
}
{
ObjectStore::Transaction t;