{
dout(20) <<" [" << std::hex << offset << ", " << length << "]" << dendl;
- if (offset + length >= m_num_bits) {
+ if (offset + length > m_num_bits) {
derr << __func__ << "::offset + length = " << offset + length << " exceeds map size = " << m_num_bits << dendl;
- ceph_assert(offset + length < m_num_bits);
+ ceph_assert(offset + length <= m_num_bits);
return false;
}
//----------------------------------------------------------------------------
bool SimpleBitmap::clr(uint64_t offset, uint64_t length)
{
- if (offset + length >= m_num_bits) {
+ if (offset + length > m_num_bits) {
derr << __func__ << "::offset + length = " << offset + length << " exceeds map size = " << m_num_bits << dendl;
- ceph_assert(offset + length < m_num_bits);
+ ceph_assert(offset + length <= m_num_bits);
return false;
}
int ffs = __builtin_ffsll(word) - 1;
extent_t ext;
ext.offset = words_to_bits(word_idx) + ffs;
+ if (ext.offset >= m_num_bits ) {
+ return null_extent;
+ }
// set all bits from current to LSB
uint64_t clr_mask = FULL_MASK << ffs;
int ffz = __builtin_ffsll(~word) - 1;
extent_t ext;
ext.offset = words_to_bits(word_idx) + ffz;
+ if (ext.offset >= m_num_bits ) {
+ return null_extent;
+ }
// clear all bits from current position to LSB
word &= (FULL_MASK << ffz);
struct extent_t {
uint64_t offset;
uint64_t length;
+ bool operator==(const extent_t& other) const {
+ return (this->offset == other.offset && this->length == other.length);
+ }
};
class SimpleBitmap {
}
}
+//---------------------------------------------------------------------------------
+TEST(SimpleBitmap, boundaries2)
+{
+ const uint64_t bit_count_base = 64 << 10; // 64Kb = 8MB
+ const extent_t null_extent = {0, 0};
+
+ for (unsigned i = 0; i < 64; i++) {
+ uint64_t bit_count = bit_count_base + i;
+ extent_t full_extent = {0, bit_count};
+ SimpleBitmap sbmap(g_ceph_context, bit_count);
+
+ sbmap.set(0, bit_count);
+ ASSERT_TRUE(sbmap.get_next_set_extent(0) == full_extent);
+ ASSERT_TRUE(sbmap.get_next_clr_extent(0) == null_extent);
+
+ for (uint64_t bit = 0; bit < bit_count; bit++) {
+ sbmap.clr(bit, 1);
+ }
+ ASSERT_TRUE(sbmap.get_next_set_extent(0) == null_extent);
+ ASSERT_TRUE(sbmap.get_next_clr_extent(0) == full_extent);
+
+ for (uint64_t bit = 0; bit < bit_count; bit++) {
+ sbmap.set(bit, 1);
+ }
+ ASSERT_TRUE(sbmap.get_next_set_extent(0) == full_extent);
+ ASSERT_TRUE(sbmap.get_next_clr_extent(0) == null_extent);
+
+ sbmap.clr(0, bit_count);
+ ASSERT_TRUE(sbmap.get_next_set_extent(0) == null_extent);
+ ASSERT_TRUE(sbmap.get_next_clr_extent(0) == full_extent);
+ }
+}
+
TEST(shared_blob_2hash_tracker_t, basic_test)
{
shared_blob_2hash_tracker_t t1(1024 * 1024, 4096);