ASSERT_FALSE(m.intersects(55, 1));
}
+TEST(bluestore_blob_t, put_ref)
+{
+ unsigned mas = 4096;
+ unsigned mrs = 8192;
+
+ {
+ bluestore_blob_t b;
+ vector<bluestore_pextent_t> r;
+ b.length = mas * 2;
+ b.extents.push_back(bluestore_pextent_t(0, mas*2));
+ b.ref_map.get(0, mas*2);
+ ASSERT_TRUE(b.is_allocated(0, mas*2));
+ b.put_ref(0, mas*2, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(1u, r.size());
+ ASSERT_EQ(0u, r[0].offset);
+ ASSERT_EQ(mas*2, r[0].length);
+ ASSERT_FALSE(b.is_allocated(0, mas*2));
+ ASSERT_FALSE(b.is_allocated(0, mas));
+ ASSERT_FALSE(b.is_allocated(mas, 0));
+ ASSERT_FALSE(b.extents[0].is_valid());
+ ASSERT_EQ(mas*2, b.extents[0].length);
+ }
+ {
+ bluestore_blob_t b;
+ vector<bluestore_pextent_t> r;
+ b.length = mas * 2;
+ b.extents.push_back(bluestore_pextent_t(123, mas*2));
+ b.ref_map.get(0, mas*2);
+ b.put_ref(0, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*2));
+ b.put_ref(mas, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(1u, r.size());
+ ASSERT_EQ(123u, r[0].offset);
+ ASSERT_EQ(mas*2, r[0].length);
+ ASSERT_FALSE(b.is_allocated(0, mas*2));
+ ASSERT_FALSE(b.extents[0].is_valid());
+ ASSERT_EQ(mas*2, b.extents[0].length);
+ }
+ {
+ bluestore_blob_t b;
+ vector<bluestore_pextent_t> r;
+ b.length = mas * 4;
+ b.extents.push_back(bluestore_pextent_t(1, mas));
+ b.extents.push_back(bluestore_pextent_t(2, mas));
+ b.extents.push_back(bluestore_pextent_t(3, mas));
+ b.extents.push_back(bluestore_pextent_t(4, mas));
+ b.ref_map.get(0, mas*4);
+ b.put_ref(mas, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*4));
+ ASSERT_TRUE(b.is_allocated(mas, mas));
+ b.put_ref(mas*2, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(mas*2, mas));
+ ASSERT_TRUE(b.is_allocated(0, mas*4));
+ b.put_ref(mas*3, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(2u, r.size());
+ ASSERT_EQ(3u, r[0].offset);
+ ASSERT_EQ(mas, r[0].length);
+ ASSERT_EQ(4u, r[1].offset);
+ ASSERT_EQ(mas, r[1].length);
+ ASSERT_TRUE(b.is_allocated(0, mas*2));
+ ASSERT_FALSE(b.is_allocated(mas*2, mas*2));
+ ASSERT_TRUE(b.extents[0].is_valid());
+ ASSERT_TRUE(b.extents[1].is_valid());
+ ASSERT_FALSE(b.extents[2].is_valid());
+ ASSERT_EQ(3u, b.extents.size());
+ }
+ {
+ bluestore_blob_t b;
+ vector<bluestore_pextent_t> r;
+ b.length = mas * 6;
+ b.extents.push_back(bluestore_pextent_t(1, mas));
+ b.extents.push_back(bluestore_pextent_t(2, mas));
+ b.extents.push_back(bluestore_pextent_t(3, mas));
+ b.extents.push_back(bluestore_pextent_t(4, mas));
+ b.extents.push_back(bluestore_pextent_t(5, mas));
+ b.extents.push_back(bluestore_pextent_t(6, mas));
+ b.ref_map.get(0, mas*6);
+ b.put_ref(mas, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*6));
+ b.put_ref(mas*2, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*6));
+ b.put_ref(mas*3, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(2u, r.size());
+ ASSERT_EQ(3u, r[0].offset);
+ ASSERT_EQ(mas, r[0].length);
+ ASSERT_EQ(4u, r[1].offset);
+ ASSERT_EQ(mas, r[1].length);
+ ASSERT_TRUE(b.is_allocated(0, mas*2));
+ ASSERT_FALSE(b.is_allocated(mas*2, mas*2));
+ ASSERT_TRUE(b.is_allocated(mas*4, mas*2));
+ ASSERT_EQ(5u, b.extents.size());
+ ASSERT_TRUE(b.extents[0].is_valid());
+ ASSERT_TRUE(b.extents[1].is_valid());
+ ASSERT_FALSE(b.extents[2].is_valid());
+ ASSERT_TRUE(b.extents[3].is_valid());
+ ASSERT_TRUE(b.extents[4].is_valid());
+ }
+ {
+ bluestore_blob_t b;
+ vector<bluestore_pextent_t> r;
+ b.length = mas * 6;
+ b.extents.push_back(bluestore_pextent_t(1, mas * 6));
+ b.ref_map.get(0, mas*6);
+ b.put_ref(mas, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*6));
+ b.put_ref(mas*2, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*6));
+ b.put_ref(mas*3, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(1u, r.size());
+ ASSERT_EQ(0x2001u, r[0].offset);
+ ASSERT_EQ(mas*2, r[0].length);
+ ASSERT_TRUE(b.is_allocated(0, mas*2));
+ ASSERT_FALSE(b.is_allocated(mas*2, mas*2));
+ ASSERT_TRUE(b.is_allocated(mas*4, mas*2));
+ ASSERT_EQ(3u, b.extents.size());
+ ASSERT_TRUE(b.extents[0].is_valid());
+ ASSERT_FALSE(b.extents[1].is_valid());
+ ASSERT_TRUE(b.extents[2].is_valid());
+ }
+ {
+ bluestore_blob_t b;
+ vector<bluestore_pextent_t> r;
+ b.length = mas * 12;
+ b.extents.push_back(bluestore_pextent_t(1, mas * 4));
+ b.extents.push_back(bluestore_pextent_t(2, mas * 4));
+ b.extents.push_back(bluestore_pextent_t(3, mas * 4));
+ b.ref_map.get(0, mas*12);
+ b.put_ref(mas, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*12));
+ b.put_ref(mas*9, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*12));
+ b.put_ref(mas*2, mas*7, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(3u, r.size());
+ ASSERT_EQ(0x2001u, r[0].offset);
+ ASSERT_EQ(mas*2, r[0].length);
+ ASSERT_EQ(0x2u, r[1].offset);
+ ASSERT_EQ(mas*4, r[1].length);
+ ASSERT_EQ(0x3u, r[2].offset);
+ ASSERT_EQ(mas*2, r[2].length);
+ ASSERT_TRUE(b.is_allocated(0, mas*2));
+ ASSERT_FALSE(b.is_allocated(mas*2, mas*8));
+ ASSERT_TRUE(b.is_allocated(mas*10, mas*2));
+ ASSERT_EQ(3u, b.extents.size());
+ ASSERT_TRUE(b.extents[0].is_valid());
+ ASSERT_FALSE(b.extents[1].is_valid());
+ ASSERT_TRUE(b.extents[2].is_valid());
+ }
+ {
+ bluestore_blob_t b;
+ vector<bluestore_pextent_t> r;
+ b.length = mas * 12;
+ b.extents.push_back(bluestore_pextent_t(1, mas * 4));
+ b.extents.push_back(bluestore_pextent_t(2, mas * 4));
+ b.extents.push_back(bluestore_pextent_t(3, mas * 4));
+ b.ref_map.get(0, mas*12);
+ b.put_ref(mas, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*12));
+ b.put_ref(mas*9, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*12));
+ b.put_ref(mas*2, mas*7, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(3u, r.size());
+ ASSERT_EQ(0x2001u, r[0].offset);
+ ASSERT_EQ(mas*2, r[0].length);
+ ASSERT_EQ(0x2u, r[1].offset);
+ ASSERT_EQ(mas*4, r[1].length);
+ ASSERT_EQ(0x3u, r[2].offset);
+ ASSERT_EQ(mas*2, r[2].length);
+ ASSERT_TRUE(b.is_allocated(0, mas*2));
+ ASSERT_FALSE(b.is_allocated(mas*2, mas*8));
+ ASSERT_TRUE(b.is_allocated(mas*10, mas*2));
+ ASSERT_EQ(3u, b.extents.size());
+ ASSERT_TRUE(b.extents[0].is_valid());
+ ASSERT_FALSE(b.extents[1].is_valid());
+ ASSERT_TRUE(b.extents[2].is_valid());
+ b.put_ref(0, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(1u, r.size());
+ ASSERT_EQ(0x1u, r[0].offset);
+ ASSERT_EQ(mas*2, r[0].length);
+ ASSERT_EQ(2u, b.extents.size());
+ ASSERT_FALSE(b.extents[0].is_valid());
+ ASSERT_TRUE(b.extents[1].is_valid());
+ b.put_ref(mas*10, mas*2, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(1u, r.size());
+ ASSERT_EQ(0x2003u, r[0].offset);
+ ASSERT_EQ(mas*2, r[0].length);
+ ASSERT_EQ(1u, b.extents.size());
+ ASSERT_FALSE(b.extents[0].is_valid());
+ }
+ {
+ bluestore_blob_t b;
+ vector<bluestore_pextent_t> r;
+ b.length = mas * 12;
+ b.extents.push_back(bluestore_pextent_t(1, mas * 4));
+ b.extents.push_back(bluestore_pextent_t(2, mas * 4));
+ b.extents.push_back(bluestore_pextent_t(3, mas * 4));
+ b.ref_map.get(0, mas*12);
+ b.put_ref(mas, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*12));
+ b.put_ref(mas*9, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*12));
+ b.put_ref(mas*2, mas*7, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(3u, r.size());
+ ASSERT_EQ(0x2001u, r[0].offset);
+ ASSERT_EQ(mas*2, r[0].length);
+ ASSERT_EQ(0x2u, r[1].offset);
+ ASSERT_EQ(mas*4, r[1].length);
+ ASSERT_EQ(0x3u, r[2].offset);
+ ASSERT_EQ(mas*2, r[2].length);
+ ASSERT_TRUE(b.is_allocated(0, mas*2));
+ ASSERT_FALSE(b.is_allocated(mas*2, mas*8));
+ ASSERT_TRUE(b.is_allocated(mas*10, mas*2));
+ ASSERT_EQ(3u, b.extents.size());
+ ASSERT_TRUE(b.extents[0].is_valid());
+ ASSERT_FALSE(b.extents[1].is_valid());
+ ASSERT_TRUE(b.extents[2].is_valid());
+ b.put_ref(mas*10, mas*2, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(1u, r.size());
+ ASSERT_EQ(0x2003u, r[0].offset);
+ ASSERT_EQ(mas*2, r[0].length);
+ ASSERT_EQ(2u, b.extents.size());
+ ASSERT_TRUE(b.extents[0].is_valid());
+ ASSERT_FALSE(b.extents[1].is_valid());
+ b.put_ref(0, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(1u, r.size());
+ ASSERT_EQ(0x1u, r[0].offset);
+ ASSERT_EQ(mas*2, r[0].length);
+ ASSERT_EQ(1u, b.extents.size());
+ ASSERT_FALSE(b.extents[0].is_valid());
+ }
+ {
+ bluestore_blob_t b;
+ vector<bluestore_pextent_t> r;
+ b.length = mas * 8;
+ b.extents.push_back(bluestore_pextent_t(1, mas * 8));
+ b.ref_map.get(0, mas*8);
+ b.put_ref(0, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*8));
+ b.put_ref(mas*7, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, mas*8));
+ b.put_ref(mas*2, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(0u, r.size());
+ ASSERT_TRUE(b.is_allocated(0, 8));
+ b.put_ref(mas*3, mas*4, mrs, &r);
+ ASSERT_EQ(1u, r.size());
+ ASSERT_EQ(0x2001u, r[0].offset);
+ ASSERT_EQ(mas*6, r[0].length);
+ ASSERT_TRUE(b.is_allocated(0, mas*2));
+ ASSERT_FALSE(b.is_allocated(mas*2, mas*6));
+ ASSERT_EQ(2u, b.extents.size());
+ ASSERT_TRUE(b.extents[0].is_valid());
+ ASSERT_FALSE(b.extents[1].is_valid());
+ b.put_ref(mas, mas, mrs, &r);
+ cout << "r " << r << " " << b << std::endl;
+ ASSERT_EQ(1u, r.size());
+ ASSERT_EQ(0x1u, r[0].offset);
+ ASSERT_EQ(mas*2, r[0].length);
+ ASSERT_EQ(1u, b.extents.size());
+ ASSERT_FALSE(b.extents[0].is_valid());
+ }
+}
+
TEST(bluestore_blob_t, calc_csum)
{
bufferlist bl;