Skip to content

Commit b6fb6e0

Browse files
authored
Merge pull request ceph#63839 from aainscow/setattr_fix
bluestore: Fix _setattr() with rare memory alignments Reviewed-by: [email protected] Reviewed-by: [email protected]
2 parents 634288e + e82bf6d commit b6fb6e0

File tree

2 files changed

+60
-12
lines changed

2 files changed

+60
-12
lines changed

src/os/bluestore/BlueStore.cc

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18039,6 +18039,8 @@ int BlueStore::_remove(TransContext *txc,
1803918039
return r;
1804018040
}
1804118041

18042+
18043+
1804218044
int BlueStore::_setattr(TransContext *txc,
1804318045
CollectionRef& c,
1804418046
OnodeRef& o,
@@ -18049,18 +18051,17 @@ int BlueStore::_setattr(TransContext *txc,
1804918051
<< " " << name << " (" << val.length() << " bytes)"
1805018052
<< dendl;
1805118053
int r = 0;
18052-
if (!val.length()) {
18053-
auto& b = o->onode.attrs[name.c_str()] = bufferptr("", 0);
18054-
b.reassign_to_mempool(mempool::mempool_bluestore_cache_meta);
18055-
} else if (!val.is_contiguous()) {
18056-
val.rebuild();
18057-
auto& b = o->onode.attrs[name.c_str()] = val.front();
18058-
b.reassign_to_mempool(mempool::mempool_bluestore_cache_meta);
18059-
} else if (val.front().is_partial()) {
18060-
val.rebuild();
18061-
auto& b = o->onode.attrs[name.c_str()] = val.front();
18062-
b.reassign_to_mempool(mempool::mempool_bluestore_cache_meta);
18054+
auto& b = o->onode.attrs[name.c_str()];
18055+
if (val.length() == 0) {
18056+
b = bufferptr("", 0);
18057+
} else {
18058+
if (!val.is_contiguous() || val.front().is_partial()) {
18059+
val.rebuild();
18060+
}
18061+
b = val.front();
1806318062
}
18063+
b.reassign_to_mempool(mempool::mempool_bluestore_cache_meta);
18064+
1806418065
txc->write_onode(o);
1806518066
dout(10) << __func__ << " " << c->cid << " " << o->oid
1806618067
<< " " << name << " (" << val.length() << " bytes)"

src/test/objectstore/store_test.cc

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3019,9 +3019,13 @@ TEST_P(StoreTest, SimpleAttrTest) {
30193019
int r;
30203020
coll_t cid;
30213021
ghobject_t hoid(hobject_t(sobject_t("attr object 1", CEPH_NOSNAP)));
3022-
bufferlist val, val2;
3022+
bufferlist val, val2, val_exactly_10, empty_bl;
30233023
val.append("value");
30243024
val.append("value2");
3025+
bufferptr bp = bufferptr("0123456789abcdef", 0x10);
3026+
ASSERT_EQ(bp.length(), 0x10);
3027+
val_exactly_10.append(bp);
3028+
ASSERT_EQ(val_exactly_10.get_num_buffers(), 1);
30253029
{
30263030
auto ch = store->open_collection(cid);
30273031
ASSERT_FALSE(ch);
@@ -3049,6 +3053,8 @@ TEST_P(StoreTest, SimpleAttrTest) {
30493053
t.touch(cid, hoid);
30503054
t.setattr(cid, hoid, "foo", val);
30513055
t.setattr(cid, hoid, "bar", val2);
3056+
t.setattr(cid, hoid, "tiramisu", val_exactly_10);
3057+
t.setattr(cid, hoid, "empty", empty_bl);
30523058
r = queue_transaction(store, ch, std::move(t));
30533059
ASSERT_EQ(r, 0);
30543060
}
@@ -3069,10 +3075,48 @@ TEST_P(StoreTest, SimpleAttrTest) {
30693075
bl.append(bp);
30703076
ASSERT_TRUE(bl_eq(val, bl));
30713077

3078+
r = store->getattr(ch, hoid, "tiramisu", bp);
3079+
ASSERT_EQ(0, r);
3080+
bufferlist bl1;
3081+
bl1.append(bp);
3082+
ASSERT_TRUE(bl_eq(val_exactly_10, bl1));
3083+
3084+
r = store->getattr(ch, hoid, "empty", bp);
3085+
ASSERT_EQ(0, r);
3086+
EXPECT_EQ(bp.length(), 0);
3087+
30723088
map<string,bufferptr,less<>> bm;
30733089
r = store->getattrs(ch, hoid, bm);
30743090
ASSERT_EQ(0, r);
3091+
}
3092+
ch.reset();
3093+
EXPECT_EQ(store->umount(), 0);
3094+
EXPECT_EQ(store->mount(), 0);
3095+
ch = store->open_collection(cid);
3096+
{
3097+
bufferptr bp;
3098+
r = store->getattr(ch, hoid, "nofoo", bp);
3099+
ASSERT_EQ(-ENODATA, r);
30753100

3101+
r = store->getattr(ch, hoid, "foo", bp);
3102+
ASSERT_EQ(0, r);
3103+
bufferlist bl;
3104+
bl.append(bp);
3105+
ASSERT_TRUE(bl_eq(val, bl));
3106+
3107+
r = store->getattr(ch, hoid, "tiramisu", bp);
3108+
ASSERT_EQ(0, r);
3109+
bufferlist bl1;
3110+
bl1.append(bp);
3111+
ASSERT_TRUE(bl_eq(val_exactly_10, bl1));
3112+
3113+
r = store->getattr(ch, hoid, "empty", bp);
3114+
ASSERT_EQ(0, r);
3115+
EXPECT_EQ(bp.length(), 0);
3116+
3117+
map<string,bufferptr,less<>> bm;
3118+
r = store->getattrs(ch, hoid, bm);
3119+
ASSERT_EQ(0, r);
30763120
}
30773121
{
30783122
ObjectStore::Transaction t;
@@ -10692,8 +10736,11 @@ TEST_P(StoreTest, BluestorePerPoolOmapFixOnMount)
1069210736
t.omap_setheader(cid, oid, h);
1069310737
t.touch(cid, oid2);
1069410738
t.omap_setheader(cid, oid2, h);
10739+
C_SaferCond c;
10740+
t.register_on_commit(&c);
1069510741
int r = queue_transaction(store, ch, std::move(t));
1069610742
ASSERT_EQ(r, 0);
10743+
c.wait();
1069710744
}
1069810745

1069910746
// inject legacy omaps

0 commit comments

Comments
 (0)