TEST(ObMultiVersionTabletImage, test_write) { FileInfoCache fic; ObMultiVersionTabletImage image(fic); fic.init(100); CharArena allocator; ObRange r1,r2,r3; create_range(allocator, r1, 1, ObBorderFlag::INCLUSIVE_START|ObBorderFlag::INCLUSIVE_END, "aoo", "foo"); create_range(allocator, r2, 1, ObBorderFlag::INCLUSIVE_END, "foo", "mj"); create_range(allocator, r3, 1, ObBorderFlag::INCLUSIVE_END, "mj", "oi"); int ret = 0; ObTablet* tablet = NULL; ObSSTableId id; id.sstable_file_id_ = 1; id.sstable_file_offset_ = 0; ret = image.alloc_tablet_object(r1, VERSION_1, tablet); ASSERT_EQ(0, ret); tablet->set_disk_no(1); //tablet->set_merged(1); ret = tablet->add_sstable_by_id(id); ASSERT_EQ(0, ret); ret = image.add_tablet(tablet, false); ASSERT_EQ(0, ret); ret = image.alloc_tablet_object(r1, VERSION_2, tablet); ASSERT_EQ(0, ret); tablet->set_disk_no(1); ret = tablet->add_sstable_by_id(id); ASSERT_EQ(0, ret); ret = image.add_tablet(tablet, false); ASSERT_EQ(0, ret); ret = image.alloc_tablet_object(r2, VERSION_2, tablet); ASSERT_EQ(0, ret); id.sstable_file_id_ = 2; id.sstable_file_offset_ = 0; tablet->set_disk_no(2); tablet->add_sstable_by_id(id); ret = image.add_tablet(tablet, false); ASSERT_EQ(0, ret); ret = image.alloc_tablet_object(r3, VERSION_2, tablet); ASSERT_EQ(0, ret); id.sstable_file_id_ = 3; id.sstable_file_offset_ = 0; tablet->set_disk_no(3); tablet->add_sstable_by_id(id); ret = image.add_tablet(tablet, false); ASSERT_EQ(0, ret); ret = write_all(image); ASSERT_EQ(0, ret); fic.destroy(); }
TEST(ObMultiVersionTabletImage, test_write_null) { FileInfoCache fic; ObMultiVersionTabletImage image(fic); fic.init(100); CharArena allocator; ObRange r1; ObBorderFlag flag; flag.set_min_value(); flag.set_max_value(); create_range(allocator, r1, 1, flag.get_data(), "", ""); int ret = 0; ObTablet* tablet = NULL; ObSSTableId id; id.sstable_file_id_ = 1; id.sstable_file_offset_ = 0; ret = image.alloc_tablet_object(r1, VERSION_1, tablet); ASSERT_EQ(0, ret); tablet->set_disk_no(1); ret = tablet->add_sstable_by_id(id); ASSERT_EQ(0, ret); ret = image.add_tablet(tablet, false); ASSERT_EQ(0, ret); image.write(VERSION_1, 1); fic.destroy(); }
TEST(ObMultiVersionTabletImage, test_query_min_max) { FileInfoCache fic; ObMultiVersionTabletImage image(fic); fic.init(100); CharArena allocator; ObRange r1,r2,r3; create_range(allocator, r1, 1, ObBorderFlag::INCLUSIVE_START|ObBorderFlag::INCLUSIVE_END, "aoo", "foo"); create_range(allocator, r2, 1, ObBorderFlag::INCLUSIVE_END, "foo", "mj"); create_range(allocator, r3, 1, ObBorderFlag::INCLUSIVE_END, "mj", "oi"); ObRange rall; ObBorderFlag flag; flag.set_min_value(); flag.set_max_value(); create_range(allocator, rall, 1, flag.get_data(), "aoo", "zoo"); int ret = 0; ObTablet* tablet = NULL; ObSSTableId id; id.sstable_file_id_ = 1; id.sstable_file_offset_ = 0; ret = image.alloc_tablet_object(rall, VERSION_1, tablet); ASSERT_EQ(0, ret); tablet->set_disk_no(1); ret = tablet->add_sstable_by_id(id); ASSERT_EQ(0, ret); ret = image.add_tablet(tablet, false, true); ASSERT_EQ(0, ret); image.dump(); ret = image.acquire_tablet(r1, ObMultiVersionTabletImage::SCAN_FORWARD, 0, tablet); ASSERT_EQ(0, ret); ASSERT_EQ(VERSION_1, tablet->get_data_version()); image.release_tablet(tablet); ret = image.acquire_tablet(rall, ObMultiVersionTabletImage::SCAN_FORWARD, 0, tablet); ASSERT_EQ(0, ret); ASSERT_EQ(VERSION_1, tablet->get_data_version()); tablet->get_range().hex_dump(); image.release_tablet(tablet); fic.destroy(); }
int TabletManagerIniter::create_tablet(const ObNewRange& range, const ObSSTableId& sst_id, bool serving, bool add_sst_id, const int64_t version) { int ret = OB_SUCCESS; UNUSED(serving); if (range.empty()) { TBSYS_LOG(ERROR, "create_tablet error, input range is empty."); ret = OB_INVALID_ARGUMENT; } if (OB_SUCCESS == ret) { ObTablet* tablet = NULL; // find tablet if exist? ObMultiVersionTabletImage &image = tablet_mgr_.get_serving_tablet_image(); ret = image.acquire_tablet(range, ObMultiVersionTabletImage::SCAN_FORWARD, version, tablet); if (OB_SUCCESS == ret) { TBSYS_LOG(ERROR, "tablet already exists! dump input and exist:"); range.hex_dump(TBSYS_LOG_LEVEL_ERROR); tablet->get_range().hex_dump(TBSYS_LOG_LEVEL_ERROR); ret = OB_ERROR; tablet = NULL; image.release_tablet(tablet); } else { ret = image.alloc_tablet_object(range, version, tablet); if (OB_SUCCESS == ret && add_sst_id) { ret = tablet->add_sstable_by_id(sst_id); } if (OB_SUCCESS == ret) { tablet->set_disk_no(sst_id.sstable_file_id_ & DISK_NO_MASK); ret = image.add_tablet(tablet, true, true); } } } return ret; }