fix reverse scan with magic row problem
This commit is contained in:
		
							
								
								
									
										33
									
								
								deps/oblib/src/common/ob_store_range.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								deps/oblib/src/common/ob_store_range.cpp
									
									
									
									
										vendored
									
									
								
							@ -418,16 +418,15 @@ int ObVersionStoreRangeConversionHelper::store_rowkey_to_multi_version_range(
 | 
			
		||||
    COMMON_LOG(WARN, "version_range is not valid", K(ret), K(version_range));
 | 
			
		||||
  } else if (OB_FAIL(build_multi_version_store_rowkey(src_rowkey.get_store_rowkey(),
 | 
			
		||||
                 //-version_range.snapshot_version_,
 | 
			
		||||
                 -INT64_MAX,
 | 
			
		||||
                 true,  // min_value
 | 
			
		||||
                 allocator,
 | 
			
		||||
                 multi_version_range.get_range().get_start_key()))) {
 | 
			
		||||
    COMMON_LOG(WARN, "build multi version store rowkey failed", K(ret), K(src_rowkey), K(version_range));
 | 
			
		||||
  } else if (OB_FAIL(build_multi_version_store_rowkey(src_rowkey.get_store_rowkey(),
 | 
			
		||||
                                                ObVersionRange::MAX_VERSION,
 | 
			
		||||
                 false,  // min_value
 | 
			
		||||
                 allocator,
 | 
			
		||||
                 multi_version_range.get_range().get_end_key()))) {
 | 
			
		||||
    COMMON_LOG(WARN, "build multi version store rowkey failed",
 | 
			
		||||
                  K(ret), K(src_rowkey), K(version_range));
 | 
			
		||||
    COMMON_LOG(WARN, "build multi version store rowkey failed", K(ret), K(src_rowkey), K(version_range));
 | 
			
		||||
  } else if (OB_FAIL(multi_version_range.to_collation_free_range_on_demand_and_cutoff_range(allocator))) {
 | 
			
		||||
    COMMON_LOG(WARN, "fail to get colllation free rowkey and range cutoff", K(ret));
 | 
			
		||||
  } else {
 | 
			
		||||
@ -455,15 +454,15 @@ int ObVersionStoreRangeConversionHelper::range_to_multi_version_range(
 | 
			
		||||
    ret = OB_INVALID_ARGUMENT;
 | 
			
		||||
    COMMON_LOG(WARN, "version_range is not valid", K(ret), K(version_range));
 | 
			
		||||
  } else if (OB_FAIL(build_multi_version_store_rowkey(src_range.get_range().get_start_key(),
 | 
			
		||||
      include_start ? -INT64_MAX : ObVersionRange::MAX_VERSION,
 | 
			
		||||
      allocator, multi_version_range.get_range().get_start_key()))) {
 | 
			
		||||
    COMMON_LOG(WARN, "build multi version store rowkey failed",
 | 
			
		||||
              K(ret), K(src_range), K(version_range));
 | 
			
		||||
                 include_start,
 | 
			
		||||
                 allocator,
 | 
			
		||||
                 multi_version_range.get_range().get_start_key()))) {
 | 
			
		||||
    COMMON_LOG(WARN, "build multi version store rowkey failed", K(ret), K(src_range), K(version_range));
 | 
			
		||||
  } else if (OB_FAIL(build_multi_version_store_rowkey(src_range.get_range().get_end_key(),
 | 
			
		||||
      include_end ? ObVersionRange::MAX_VERSION : - ObVersionRange::MAX_VERSION,
 | 
			
		||||
      allocator, multi_version_range.get_range().get_end_key()))) {
 | 
			
		||||
    COMMON_LOG(WARN, "build multi version store rowkey failed",
 | 
			
		||||
               K(ret), K(src_range), K(version_range));
 | 
			
		||||
                 !include_end,
 | 
			
		||||
                 allocator,
 | 
			
		||||
                 multi_version_range.get_range().get_end_key()))) {
 | 
			
		||||
    COMMON_LOG(WARN, "build multi version store rowkey failed", K(ret), K(src_range), K(version_range));
 | 
			
		||||
  } else if (OB_FAIL(multi_version_range.to_collation_free_range_on_demand_and_cutoff_range(allocator))) {
 | 
			
		||||
    COMMON_LOG(WARN, "fail to get collation free rowkey", K(ret));
 | 
			
		||||
  } else {
 | 
			
		||||
@ -482,8 +481,8 @@ int ObVersionStoreRangeConversionHelper::range_to_multi_version_range(
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ObVersionStoreRangeConversionHelper::build_multi_version_store_rowkey(const ObStoreRowkey& store_rowkey,
 | 
			
		||||
    const int64_t trans_version, ObIAllocator& allocator, ObStoreRowkey& multi_version_store_rowkey)
 | 
			
		||||
int ObVersionStoreRangeConversionHelper::build_multi_version_store_rowkey(const ObStoreRowkey &store_rowkey,
 | 
			
		||||
    const bool min_value, ObIAllocator &allocator, ObStoreRowkey &multi_version_store_rowkey)
 | 
			
		||||
{
 | 
			
		||||
  int ret = OB_SUCCESS;
 | 
			
		||||
 | 
			
		||||
@ -509,7 +508,11 @@ int ObVersionStoreRangeConversionHelper::build_multi_version_store_rowkey(const
 | 
			
		||||
        cells[i] = store_rowkey.get_obj_ptr()[i];
 | 
			
		||||
      }
 | 
			
		||||
      // FIXME: hard coding
 | 
			
		||||
      cells[i].set_int(trans_version);
 | 
			
		||||
      if (min_value) {
 | 
			
		||||
        cells[i].set_min_value();
 | 
			
		||||
      } else {
 | 
			
		||||
        cells[i].set_max_value();
 | 
			
		||||
      }
 | 
			
		||||
      multi_version_store_rowkey.assign(cells, cell_cnt);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								deps/oblib/src/common/ob_store_range.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								deps/oblib/src/common/ob_store_range.h
									
									
									
									
										vendored
									
									
								
							@ -409,8 +409,8 @@ public:
 | 
			
		||||
      ObIAllocator& allocator, ObExtStoreRange& multi_version_range);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  static int build_multi_version_store_rowkey(const ObStoreRowkey& rowkey, const int64_t trans_version,
 | 
			
		||||
      ObIAllocator& allocator, ObStoreRowkey& multi_version_rowkey);
 | 
			
		||||
  static int build_multi_version_store_rowkey(
 | 
			
		||||
      const ObStoreRowkey &rowkey, const bool min_value, ObIAllocator &allocator, ObStoreRowkey &multi_version_rowkey);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // end namespace common
 | 
			
		||||
 | 
			
		||||
@ -2609,16 +2609,168 @@ TEST_F(TestMultiVersionSSTableSingleScan, test_memleak)
 | 
			
		||||
  scanner->~ObStoreRowIterator();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(TestMultiVersionSSTableSingleScan, test_reverse)
 | 
			
		||||
{
 | 
			
		||||
  const int64_t rowkey_cnt = 4;
 | 
			
		||||
  const char *micro_data[5];
 | 
			
		||||
  micro_data[0] = "bigint   var   bigint bigint  bigint   bigint  flag    multi_version_row_flag\n"
 | 
			
		||||
                  "0        var1  -9       0     7        NOP     EXIST   C\n"
 | 
			
		||||
                  "0        var1  -7       0     6        5       EXIST   C\n"
 | 
			
		||||
                  "0        var1  9223372036854775807       9223372036854775807 NOP      NOP     EXIST   LM\n";
 | 
			
		||||
 | 
			
		||||
  micro_data[1] = "bigint   var   bigint bigint  bigint   bigint  flag    multi_version_row_flag\n"
 | 
			
		||||
                  "1        var1  -8       0     NOP      2       EXIST   C\n"
 | 
			
		||||
                  "1        var1  -2       0     2        NOP     EXIST   L\n"
 | 
			
		||||
                  "2        var1  -9       0     7        NOP     EXIST   C\n"
 | 
			
		||||
                  "2        var1  -7       0     6        5       EXIST   C\n"
 | 
			
		||||
                  "2        var1  9223372036854775807       9223372036854775807     NOP      NOP     EXIST   LM\n";
 | 
			
		||||
 | 
			
		||||
  micro_data[2] = "bigint   var   bigint bigint  bigint   bigint  flag    multi_version_row_flag\n"
 | 
			
		||||
                  "3        var1  -6       0     6        1       EXIST   C\n"
 | 
			
		||||
                  "3        var1  9223372036854775807       9223372036854775807     NOP      NOP     EXIST   LM\n";
 | 
			
		||||
 | 
			
		||||
  micro_data[3] = "bigint   var   bigint bigint  bigint   bigint  flag    multi_version_row_flag\n"
 | 
			
		||||
                  "4        var1  -3       0     5        2       EXIST   C\n"
 | 
			
		||||
                  "4        var1  -2       0     5        1       EXIST   C\n"
 | 
			
		||||
                  "4        var1  -1       0     NOP      NOP     EXIST   LM\n"
 | 
			
		||||
                  "5        var1  -2       0     5        1       EXIST   C\n"
 | 
			
		||||
                  "5        var1  -1       0     4        3       EXIST   L\n";
 | 
			
		||||
 | 
			
		||||
  micro_data[4] = "bigint   var   bigint bigint  bigint   bigint  flag    multi_version_row_flag\n"
 | 
			
		||||
                  "6        var1  -3       0     5        2       EXIST   C\n"
 | 
			
		||||
                  "6        var1  -2       0     5        1       EXIST   C\n"
 | 
			
		||||
                  "6        var1  -1       0     4        3       EXIST   L\n";
 | 
			
		||||
 | 
			
		||||
  prepare_data_start(micro_data, rowkey_cnt, 10, "none", FLAT_ROW_STORE, 0);
 | 
			
		||||
  prepare_one_macro(micro_data, 2, 10, nullptr, nullptr, true);
 | 
			
		||||
  prepare_one_macro(µ_data[2], 1, 10, nullptr, nullptr, true);
 | 
			
		||||
  prepare_one_macro(µ_data[3], 2, 10, nullptr, nullptr, true);
 | 
			
		||||
  // prepare_one_macro(µ_data[2], 1, 10, nullptr, nullptr, true);
 | 
			
		||||
  prepare_data_end();
 | 
			
		||||
 | 
			
		||||
  ObMockIterator res_iter;
 | 
			
		||||
  ObStoreRowIterator *scanner = NULL;
 | 
			
		||||
  ObExtStoreRange range;
 | 
			
		||||
 | 
			
		||||
  const char *result1 = "bigint   var   bigint   bigint  flag    multi_version_row_flag\n"
 | 
			
		||||
                        "6        var1  5        2        EXIST   N\n"
 | 
			
		||||
                        "5        var1  5        1        EXIST   N\n"
 | 
			
		||||
                        "4        var1  5        2        EXIST   N\n"
 | 
			
		||||
                        "3        var1  6        1        EXIST N\n";
 | 
			
		||||
  const char *rowkey1 = "bigint   var   bigint flag    multi_version_row_flag\n"
 | 
			
		||||
                        "2        var1  9223372036854775807 EXIST   N\n";
 | 
			
		||||
 | 
			
		||||
  ObMockIterator rowkey_iter;
 | 
			
		||||
  ObExtStoreRowkey ext_rowkey;
 | 
			
		||||
  const ObStoreRow *row = NULL;
 | 
			
		||||
  rowkey_iter.reset();
 | 
			
		||||
  OK(rowkey_iter.from(rowkey1));
 | 
			
		||||
  OK(rowkey_iter.get_row(0, row));
 | 
			
		||||
  ASSERT_TRUE(NULL != row);
 | 
			
		||||
  range.get_range().set_whole_range();
 | 
			
		||||
  range.get_range().start_key_.assign(row->row_val_.cells_, rowkey_cnt - 2);
 | 
			
		||||
  range.get_range().set_left_open();
 | 
			
		||||
  OK(range.to_collation_free_range_on_demand_and_cutoff_range(stmt_allocator_));
 | 
			
		||||
 | 
			
		||||
  ObVersionRange trans_version_range;
 | 
			
		||||
  trans_version_range.base_version_ = 0;
 | 
			
		||||
  trans_version_range.multi_version_start_ = 0;
 | 
			
		||||
  trans_version_range.snapshot_version_ = 100;
 | 
			
		||||
  prepare_query_param(trans_version_range, false, false, true);
 | 
			
		||||
 | 
			
		||||
  res_iter.reset();
 | 
			
		||||
  OK(sstable_.scan(param_, context_, range, scanner));
 | 
			
		||||
  OK(res_iter.from(result1));
 | 
			
		||||
  ASSERT_TRUE(res_iter.equals(*scanner));
 | 
			
		||||
 | 
			
		||||
  scanner->~ObStoreRowIterator();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(TestMultiVersionSSTableSingleScan, test_reverse2)
 | 
			
		||||
{
 | 
			
		||||
  const int64_t rowkey_cnt = 4;
 | 
			
		||||
  const char *micro_data[5];
 | 
			
		||||
  micro_data[0] = "bigint   var   bigint bigint  bigint   bigint  flag    multi_version_row_flag\n"
 | 
			
		||||
                  "0        var1  -9       0     7        NOP     EXIST   C\n"
 | 
			
		||||
                  "0        var1  -7       0     6        5       EXIST   C\n"
 | 
			
		||||
                  "0        var1  9223372036854775807       9223372036854775807 NOP      NOP     EXIST   LM\n";
 | 
			
		||||
 | 
			
		||||
  micro_data[1] = "bigint   var   bigint bigint  bigint   bigint  flag    multi_version_row_flag\n"
 | 
			
		||||
                  "1        var1  -8       0     NOP      2       EXIST   C\n"
 | 
			
		||||
                  "1        var1  -2       0     2        NOP     EXIST   L\n"
 | 
			
		||||
                  "2        var1  9223372036854775807       9223372036854775807     NOP      NOP     EXIST   LM\n";
 | 
			
		||||
 | 
			
		||||
  micro_data[2] = "bigint   var   bigint bigint  bigint   bigint  flag    multi_version_row_flag\n"
 | 
			
		||||
                  "3        var1  -6       0     6        1       EXIST   C\n"
 | 
			
		||||
                  "3        var1  9223372036854775807       9223372036854775807     NOP      NOP     EXIST   LM\n";
 | 
			
		||||
 | 
			
		||||
  micro_data[3] = "bigint   var   bigint bigint  bigint   bigint  flag    multi_version_row_flag\n"
 | 
			
		||||
                  "4        var1  -3       0     5        2       EXIST   C\n"
 | 
			
		||||
                  "4        var1  -2       0     5        1       EXIST   C\n"
 | 
			
		||||
                  "4        var1  -1       0     NOP      NOP     EXIST   LM\n"
 | 
			
		||||
                  "5        var1  -2       0     5        1       EXIST   C\n"
 | 
			
		||||
                  "5        var1  -1       0     4        3       EXIST   L\n";
 | 
			
		||||
 | 
			
		||||
  micro_data[4] = "bigint   var   bigint bigint  bigint   bigint  flag    multi_version_row_flag\n"
 | 
			
		||||
                  "6        var1  -3       0     5        2       EXIST   C\n"
 | 
			
		||||
                  "6        var1  -2       0     5        1       EXIST   C\n"
 | 
			
		||||
                  "6        var1  -1       0     4        3       EXIST   L\n";
 | 
			
		||||
 | 
			
		||||
  prepare_data_start(micro_data, rowkey_cnt, 10, "none", FLAT_ROW_STORE, 0);
 | 
			
		||||
  prepare_one_macro(micro_data, 2, 10, nullptr, nullptr, true);
 | 
			
		||||
  prepare_one_macro(µ_data[2], 1, 10, nullptr, nullptr, true);
 | 
			
		||||
  prepare_one_macro(µ_data[3], 2, 10, nullptr, nullptr, true);
 | 
			
		||||
  // prepare_one_macro(µ_data[2], 1, 10, nullptr, nullptr, true);
 | 
			
		||||
  prepare_data_end();
 | 
			
		||||
 | 
			
		||||
  ObMockIterator res_iter;
 | 
			
		||||
  ObStoreRowIterator *scanner = NULL;
 | 
			
		||||
  ObExtStoreRange range;
 | 
			
		||||
 | 
			
		||||
  const char *result1 = "bigint   var   bigint   bigint  flag    multi_version_row_flag\n"
 | 
			
		||||
                        "6        var1  5        2        EXIST   N\n"
 | 
			
		||||
                        "5        var1  5        1        EXIST   N\n"
 | 
			
		||||
                        "4        var1  5        2        EXIST   N\n"
 | 
			
		||||
                        "3        var1  6        1        EXIST N\n";
 | 
			
		||||
  const char *rowkey1 = "bigint   var   bigint flag    multi_version_row_flag\n"
 | 
			
		||||
                        "1        var1  9223372036854775807 EXIST   N\n";
 | 
			
		||||
 | 
			
		||||
  ObMockIterator rowkey_iter;
 | 
			
		||||
  ObExtStoreRowkey ext_rowkey;
 | 
			
		||||
  const ObStoreRow *row = NULL;
 | 
			
		||||
  rowkey_iter.reset();
 | 
			
		||||
  OK(rowkey_iter.from(rowkey1));
 | 
			
		||||
  OK(rowkey_iter.get_row(0, row));
 | 
			
		||||
  ASSERT_TRUE(NULL != row);
 | 
			
		||||
  range.get_range().set_whole_range();
 | 
			
		||||
  range.get_range().start_key_.assign(row->row_val_.cells_, rowkey_cnt - 2);
 | 
			
		||||
  range.get_range().set_left_open();
 | 
			
		||||
  OK(range.to_collation_free_range_on_demand_and_cutoff_range(stmt_allocator_));
 | 
			
		||||
 | 
			
		||||
  ObVersionRange trans_version_range;
 | 
			
		||||
  trans_version_range.base_version_ = 0;
 | 
			
		||||
  trans_version_range.multi_version_start_ = 0;
 | 
			
		||||
  trans_version_range.snapshot_version_ = 100;
 | 
			
		||||
  prepare_query_param(trans_version_range, false, false, true);
 | 
			
		||||
 | 
			
		||||
  res_iter.reset();
 | 
			
		||||
  OK(sstable_.scan(param_, context_, range, scanner));
 | 
			
		||||
  OK(res_iter.from(result1));
 | 
			
		||||
  ASSERT_TRUE(res_iter.equals(*scanner));
 | 
			
		||||
 | 
			
		||||
  scanner->~ObStoreRowIterator();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace unittest
 | 
			
		||||
}  // namespace oceanbase
 | 
			
		||||
 | 
			
		||||
int main(int argc, char** argv)
 | 
			
		||||
{
 | 
			
		||||
  GCONF._enable_sparse_row = true;
 | 
			
		||||
  // GCONF._enable_sparse_row = true;
 | 
			
		||||
  system("rm -rf test_multi_version_sstable_single_scan.log");
 | 
			
		||||
  OB_LOGGER.set_file_name("test_multi_version_sstable_single_scan.log");
 | 
			
		||||
  STORAGE_LOG(INFO, "begin unittest: test_multi_version_sstable_single_scan");
 | 
			
		||||
  oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
 | 
			
		||||
  oceanbase::common::ObLogger::get_logger().set_log_level("DEBUG");
 | 
			
		||||
  testing::InitGoogleTest(&argc, argv);
 | 
			
		||||
  return RUN_ALL_TESTS();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user