/** * Copyright (c) 2021 OceanBase * OceanBase CE is licensed under Mulan PubL v2. * You can use this software according to the terms and conditions of the Mulan PubL v2. * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. */ #include "gtest/gtest.h" #include "lib/hash/ob_cuckoo_hashmap.h" #include "lib/hash/ob_hashmap.h" using namespace oceanbase; using namespace oceanbase::common; struct Key { public: Key() : key_(0) {} explicit Key(int64_t k) : key_(k) {} uint64_t hash() const { return murmurhash(&key_, sizeof(key_), 0); } bool operator==(const Key& other) const { return key_ == other.key_; } TO_STRING_KV(K_(key)); int64_t key_; }; struct MacroKey { public: static const uint64_t HASH_MAGIC_NUM = 2654435761; MacroKey() : key_(0) {} explicit MacroKey(int64_t k) : key_(k) {} uint64_t hash() const { return key_ * HASH_MAGIC_NUM; } bool operator==(const MacroKey& other) const { return key_ == other.key_; } TO_STRING_KV(K_(key)); int64_t key_; }; struct BadKey { public: BadKey() : key_(0) {} explicit BadKey(int64_t k) : key_(k) {} uint64_t hash() const { return 1; } bool operator==(const BadKey& other) const { return key_ == other.key_; } TO_STRING_KV(K_(key)); int64_t key_; }; struct ModKey { public: ModKey() : key_(0) {} explicit ModKey(int64_t k) : key_(k) {} uint64_t hash() const { return key_ % 7; } bool operator==(const ModKey& other) const { return key_ == other.key_; } TO_STRING_KV(K_(key)); int64_t key_; }; struct Value { public: Value() : value_(0) {} explicit Value(int64_t v) : value_(v) {} bool operator==(const Value& other) const { return value_ == other.value_; } bool operator!=(const Value& other) const { return !operator==(other); } TO_STRING_KV(K_(value)); int64_t value_; }; class TestCuckooHashMap : public ::testing::Test { public: TestCuckooHashMap(); virtual ~TestCuckooHashMap(); }; TestCuckooHashMap::TestCuckooHashMap() {} TestCuckooHashMap::~TestCuckooHashMap() {} TEST_F(TestCuckooHashMap, basic_test) { const int64_t bucket_num = 100; hash::ObCuckooHashMap map; ObMalloc allocator; ASSERT_EQ(OB_SUCCESS, map.create(bucket_num, &allocator)); for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value(i); ASSERT_EQ(OB_SUCCESS, map.set(key, value)); } for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.get(key, value)); ASSERT_EQ(value.value_, i); } // test overwrite for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value(i + 50); ASSERT_EQ(OB_SUCCESS, map.set(key, value, true)); } for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value(i + 100); ASSERT_EQ(OB_HASH_EXIST, map.set(key, value, false)); } for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.get(key, value)); ASSERT_EQ(value.value_, i + 50); } for (int64_t i = 50; i < 100; ++i) { Key key(i); Value value; ASSERT_EQ(OB_HASH_NOT_EXIST, map.get(key, value)); } for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.erase(key, &value)); ASSERT_EQ(i + 50, value.value_); } for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value; ASSERT_EQ(OB_HASH_NOT_EXIST, map.get(key, value)); } // erase not exist item for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value; ASSERT_EQ(OB_HASH_NOT_EXIST, map.erase(key, &value)); } } TEST_F(TestCuckooHashMap, test_rehash) { const int64_t bucket_num = 40; hash::ObCuckooHashMap map; ObMalloc allocator; ASSERT_EQ(OB_SUCCESS, map.create(bucket_num, &allocator)); for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value(i); ASSERT_EQ(OB_SUCCESS, map.set(key, value)); } for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.get(key, value)); ASSERT_EQ(value.value_, i); } // test overwrite for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value(i + 50); ASSERT_EQ(OB_SUCCESS, map.set(key, value, true)); } for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.get(key, value)); ASSERT_EQ(value.value_, i + 50); } for (int64_t i = 50; i < 100; ++i) { Key key(i); Value value; ASSERT_EQ(OB_HASH_NOT_EXIST, map.get(key, value)); } for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.erase(key, &value)); ASSERT_EQ(i + 50, value.value_); } for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value; ASSERT_EQ(OB_HASH_NOT_EXIST, map.get(key, value)); } // erase not exist item for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value; ASSERT_EQ(OB_HASH_NOT_EXIST, map.erase(key, &value)); } } TEST_F(TestCuckooHashMap, test_bad_hash) { const int64_t bucket_num = 40; hash::ObCuckooHashMap map; ObMalloc allocator; ASSERT_EQ(OB_SUCCESS, map.create(bucket_num, &allocator)); for (int64_t i = 0; i < 50; ++i) { BadKey key(i); Value value(i); ASSERT_EQ(OB_SUCCESS, map.set(key, value)); } for (int64_t i = 0; i < 50; ++i) { BadKey key(i + 50); Value value; ASSERT_EQ(OB_HASH_NOT_EXIST, map.get(key, value)); } for (int64_t i = 0; i < 50; ++i) { BadKey key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.get(key, value)); ASSERT_EQ(value.value_, i); } // test overwrite for (int64_t i = 0; i < 50; ++i) { BadKey key(i); Value value(i); ASSERT_EQ(OB_HASH_EXIST, map.set(key, value)); } for (int64_t i = 0; i < 50; ++i) { BadKey key(i); Value value(i + 50); ASSERT_EQ(OB_SUCCESS, map.set(key, value, true)); } for (int64_t i = 0; i < 50; ++i) { BadKey key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.get(key, value)); ASSERT_EQ(i + 50, value.value_); } // test erase for (int64_t i = 0; i < 50; ++i) { BadKey key(i + 50); Value value; ASSERT_EQ(OB_HASH_NOT_EXIST, map.erase(key)); } // test erase success for (int64_t i = 0; i < 50; ++i) { BadKey key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.erase(key, &value)); ASSERT_EQ(i + 50, value.value_); } for (int64_t i = 0; i < 50; ++i) { BadKey key(i); Value value; ASSERT_EQ(OB_HASH_NOT_EXIST, map.get(key, value)); } } TEST_F(TestCuckooHashMap, test_bad_hash_big_data) { const int64_t bucket_num = 50; const int64_t insert_count = 10000; hash::ObCuckooHashMap map; ObMalloc allocator(ObModIds::TEST); ASSERT_EQ(OB_SUCCESS, map.create(bucket_num, &allocator)); for (int64_t i = 0; i < insert_count; ++i) { BadKey key(i); Value value(i); ASSERT_EQ(OB_SUCCESS, map.set(key, value)); } for (int64_t i = 0; i < insert_count; ++i) { BadKey key(i); Value value(i); ASSERT_EQ(OB_SUCCESS, map.get(key, value)); ASSERT_EQ(i, value.value_); } for (int64_t i = 0; i < insert_count / 2; ++i) { BadKey key(i); Value value(i + 100); ASSERT_EQ(OB_SUCCESS, map.set(key, value, true)); } for (int64_t i = 0; i < insert_count / 2; ++i) { BadKey key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.get(key, value)); ASSERT_EQ(i + 100, value.value_); } for (int64_t i = 0; i < insert_count / 2; ++i) { BadKey key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.erase(key, &value)); ASSERT_EQ(i + 100, value.value_); } for (int64_t i = 0; i < insert_count / 2; ++i) { BadKey key(i); Value value; ASSERT_EQ(OB_HASH_NOT_EXIST, map.get(key, value)); } for (int64_t i = insert_count / 2; i < insert_count; ++i) { BadKey key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.get(key, value)); ASSERT_EQ(i, value.value_); } for (int64_t i = 0; i < insert_count / 2; ++i) { BadKey key(i); Value value(i); ASSERT_EQ(OB_SUCCESS, map.set(key, value)); } for (int64_t i = 0; i < insert_count; ++i) { BadKey key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.get(key, value)); ASSERT_EQ(i, value.value_); } } TEST_F(TestCuckooHashMap, test_bad_key_iterator) { const int64_t bucket_num = 50; const int64_t insert_count = 100; hash::ObCuckooHashMap map; ObMalloc allocator(ObModIds::TEST); int64_t iter_count = 0; ASSERT_EQ(OB_SUCCESS, map.create(bucket_num, &allocator)); OB_LOG(INFO, "test bad key iterator"); for (int64_t i = 0; i < insert_count; ++i) { BadKey key(i); Value value(i); ASSERT_EQ(OB_SUCCESS, map.set(key, value)); } for (hash::ObCuckooHashMap::iterator iter = map.begin(); iter != map.end(); ++iter) { Value value; ASSERT_EQ(OB_SUCCESS, map.get(iter->first, value)); ASSERT_EQ(value, iter->second); } iter_count = 0; for (int64_t i = 0; i < insert_count / 2; ++i) { BadKey key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.erase(key, &value)); ASSERT_EQ(i, value.value_); } for (hash::ObCuckooHashMap::iterator iter = map.begin(); iter != map.end(); ++iter) { Value value; ASSERT_EQ(OB_SUCCESS, map.get(iter->first, value)); ASSERT_EQ(value, iter->second); ++iter_count; OB_LOG(INFO, "iter data", K(iter->first)); } ASSERT_EQ(iter_count, insert_count / 2); } TEST_F(TestCuckooHashMap, test_normal_key_iterator) { const int64_t bucket_num = 100; hash::ObCuckooHashMap map; ObMalloc allocator; int64_t iter_count = 0; ASSERT_EQ(OB_SUCCESS, map.create(bucket_num, &allocator)); for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value(i); ASSERT_EQ(OB_SUCCESS, map.set(key, value)); } for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.get(key, value)); ASSERT_EQ(value.value_, i); } for (hash::ObCuckooHashMap::iterator iter = map.begin(); iter != map.end(); ++iter) { Value value; ASSERT_EQ(OB_SUCCESS, map.get(iter->first, value)); ASSERT_EQ(value, iter->second); ++iter_count; } ASSERT_EQ(50, iter_count); // test overwrite for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value(i + 50); ASSERT_EQ(OB_SUCCESS, map.set(key, value, true)); } for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value(i + 100); ASSERT_EQ(OB_HASH_EXIST, map.set(key, value, false)); } iter_count = 0; for (hash::ObCuckooHashMap::iterator iter = map.begin(); iter != map.end(); ++iter) { Value value; ASSERT_EQ(OB_SUCCESS, map.get(iter->first, value)); ASSERT_EQ(value, iter->second); ++iter_count; } ASSERT_EQ(50, iter_count); for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.erase(key, &value)); ASSERT_EQ(i + 50, value.value_); } iter_count = 0; for (hash::ObCuckooHashMap::iterator iter = map.begin(); iter != map.end(); ++iter) { Value value; ASSERT_EQ(OB_SUCCESS, map.get(iter->first, value)); ASSERT_EQ(value, iter->second); ++iter_count; } ASSERT_EQ(0, iter_count); } TEST_F(TestCuckooHashMap, test_rehash_iterator) { const int64_t bucket_num = 40; hash::ObCuckooHashMap map; ObMalloc allocator; int64_t iter_count = 0; ASSERT_EQ(OB_SUCCESS, map.create(bucket_num, &allocator)); for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value(i); ASSERT_EQ(OB_SUCCESS, map.set(key, value)); } iter_count = 0; for (hash::ObCuckooHashMap::iterator iter = map.begin(); iter != map.end(); ++iter) { Value value; ASSERT_EQ(OB_SUCCESS, map.get(iter->first, value)); ASSERT_EQ(value, iter->second); ++iter_count; } ASSERT_EQ(50, iter_count); // test overwrite for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value(i + 50); ASSERT_EQ(OB_SUCCESS, map.set(key, value, true)); } iter_count = 0; for (hash::ObCuckooHashMap::iterator iter = map.begin(); iter != map.end(); ++iter) { Value value; ASSERT_EQ(OB_SUCCESS, map.get(iter->first, value)); ASSERT_EQ(value, iter->second); ++iter_count; } ASSERT_EQ(50, iter_count); for (int64_t i = 0; i < 50; ++i) { Key key(i); Value value; ASSERT_EQ(OB_SUCCESS, map.erase(key, &value)); ASSERT_EQ(i + 50, value.value_); } iter_count = 0; for (hash::ObCuckooHashMap::iterator iter = map.begin(); iter != map.end(); ++iter) { Value value; ASSERT_EQ(OB_SUCCESS, map.get(iter->first, value)); ASSERT_EQ(value, iter->second); ++iter_count; } ASSERT_EQ(0, iter_count); } int map_random(const int64_t row_num, hash::ObHashMap& map, ModKey& key) { int ret = OB_SUCCESS; int64_t iter_count = 1; for (hash::ObHashMap::iterator iter = map.begin(); iter != map.end(); ++iter) { if (iter_count == row_num) { key = iter->first; break; } ++iter_count; } return ret; } int map_insert(const ModKey& mod_key, const Value& value, hash::ObCuckooHashMap& map, hash::ObHashMap& right_map) { int ret = OB_SUCCESS; Value got_value; const int64_t original_size = map.size(); const int64_t original_right_size = right_map.size(); if (OB_FAIL(right_map.set_refactored(mod_key, value, true /*overwrite*/))) { OB_LOG(WARN, "fail to set to hashmap", K(ret), K(mod_key), K(value)); } else if (OB_FAIL(map.set(mod_key, value, true /*overwrite*/))) { OB_LOG(WARN, "fail to set to cuckoo hashmap", K(ret), K(mod_key), K(value)); } else if (OB_FAIL(map.get(mod_key, got_value))) { OB_LOG(WARN, "fail to get value", K(ret)); } else if (value != got_value) { ret = OB_ERR_UNEXPECTED; OB_LOG(WARN, "error unexpected, got value is mismatch", K(value), K(got_value)); } else if (map.size() != right_map.size()) { ret = OB_ERR_UNEXPECTED; OB_LOG(WARN, "error unexpected, hash map size not match", K(ret), K(original_size), K(original_right_size), K(map.size()), K(right_map.size())); } return ret; } int map_erase( const ModKey& mod_key, hash::ObCuckooHashMap& map, hash::ObHashMap& right_map) { int ret = OB_SUCCESS; if (OB_FAIL(right_map.erase_refactored(mod_key))) { OB_LOG(WARN, "fail to set to hashmap", K(ret), K(mod_key)); } else if (OB_FAIL(map.erase(mod_key))) { OB_LOG(WARN, "fail to set to cuckoo hashmap", K(ret), K(mod_key)); } else if (map.size() != right_map.size()) { ret = OB_ERR_UNEXPECTED; OB_LOG(WARN, "error unexpected, hash map size not match", K(ret), K(map.size()), K(right_map.size())); } return ret; } int map_iterator(hash::ObCuckooHashMap& map, hash::ObHashMap& right_map) { int ret = OB_SUCCESS; const int64_t map_size = map.size(); const int64_t right_map_size = right_map.size(); if (map_size != right_map_size) { ret = OB_ERR_UNEXPECTED; OB_LOG(WARN, "map size do not match", K(ret), K(map_size), K(right_map_size)); } else { int64_t iter_count = 0; for (hash::ObCuckooHashMap::iterator iter = map.begin(); OB_SUCC(ret) && iter != map.end(); ++iter) { Value value; if (OB_FAIL(right_map.get_refactored(iter->first, value))) { OB_LOG(WARN, "fail to get from right map", K(ret), K(iter->first)); } else if (iter->second != value) { ret = OB_ERR_UNEXPECTED; OB_LOG(WARN, "error unexpected, value not match", K(iter->first), K(iter->second), K(value)); } else { ++iter_count; } } if (OB_SUCC(ret)) { if (iter_count != map_size) { ret = OB_ERR_UNEXPECTED; OB_LOG(WARN, "size not match", K(iter_count), K(map_size)); } else { OB_LOG(INFO, "succeed to check map iterator", K(map_size)); } } } return ret; } TEST_F(TestCuckooHashMap, test_random_run) { const int64_t bucket_num = 2; hash::ObCuckooHashMap map; ObMalloc allocator; int64_t iter_count = 0; ObRandom random; const int64_t start_time = ObTimeUtility::current_time(); // const int64_t RUN_TIME = 3 * 3600L * 1000 * 1000; const int64_t RUN_TIME = 6L * 1000 * 1000; int64_t op_types[4][6] = {{0, 0, 0, 1, 2, 3}, {0, 0, 0, 1, 2, 3}, {1, 1, 1, 0, 2, 3}, {1, 1, 1, 0, 2, 3}}; // 0: insert 1: delete 2: iter 3: get hash::ObHashMap right_map; ASSERT_EQ(OB_SUCCESS, right_map.create(1000000, lib::ObLabel("hashmap"))); ASSERT_EQ(OB_SUCCESS, map.create(bucket_num, &allocator)); while (start_time + RUN_TIME > ObTimeUtility::current_time()) { const int64_t group_type = random.get(0, 3); ModKey key; for (int64_t i = 0; i < 100; ++i) { const int64_t op_index = random.get(0, 5); const int64_t op = op_types[group_type][op_index]; if (0 == op) { key.key_ = random.get(0, 100000); Value value(key.key_); OB_LOG(INFO, "insert key", K(key), K(value)); ASSERT_EQ(OB_SUCCESS, map_insert(key, value, map, right_map)); } else if (1 == op) { if (right_map.size() >= 1) { const int64_t random_row_num = random.get(1, right_map.size()); ASSERT_EQ(OB_SUCCESS, map_random(random_row_num, right_map, key)); OB_LOG(INFO, "erase key", K(key)); ASSERT_EQ(OB_SUCCESS, map_erase(key, map, right_map)); } } else if (2 == op) { ASSERT_EQ(OB_SUCCESS, map_iterator(map, right_map)); } } } } TEST_F(TestCuckooHashMap, test_rehash_bug) { int64_t macro_id_array[] = {121634816, 123731968, 125829120, 127926272, 130023424, 132120576, 134217728, 136314880, 138412032, 140509184, 142606336, 144703488, 146800640, 148897792, 150994944, 153092096, 155189248, 157286400, 159383552, 161480704, 163577856, 165675008, 167772160, 169869312, 171966464, 174063616, 176160768, 178257920, 180355072, 182452224, 184549376, 186646528, 188743680, 190840832, 192937984, 299892736, 301989888, 304087040, 306184192, 308281344, 310378496, 312475648, 314572800, 316669952, 318767104, 320864256, 322961408, 325058560, 327155712, 329252864, 331350016, 333447168, 335544320, 337641472, 339738624, 341835776, 343932928, 346030080, 348127232, 350224384, 352321536, 354418688, 356515840, 358612992, 360710144, 362807296, 364904448, 367001600, 369098752, 488636416, 490733568, 492830720, 494927872, 497025024, 499122176, 501219328, 503316480, 505413632, 507510784, 509607936, 511705088, 513802240, 515899392, 517996544, 520093696, 522190848, 524288000, 526385152, 528482304, 530579456, 532676608, 534773760, 536870912, 538968064, 541065216, 543162368, 545259520, 547356672, 549453824, 551550976, 553648128, 555745280, 557842432, 679477248, 681574400, 683671552, 685768704, 687865856, 689963008, 692060160, 694157312, 696254464, 698351616, 700448768, 702545920, 704643072, 706740224, 708837376, 710934528, 713031680, 715128832, 717225984, 719323136, 721420288, 723517440, 725614592, 727711744, 729808896, 731906048, 734003200, 736100352, 738197504, 740294656, 742391808, 744488960, 746586112, 748683264, 750780416, 868220928, 870318080, 872415232, 874512384, 876609536, 878706688, 880803840, 882900992, 884998144, 887095296, 889192448, 891289600, 893386752, 895483904, 897581056, 899678208, 901775360, 903872512, 905969664, 908066816, 910163968, 912261120, 914358272, 916455424, 918552576, 920649728, 922746880, 924844032, 926941184, 929038336, 931135488, 933232640, 935329792, 937426944, 1054867456, 1056964608, 1059061760, 1061158912, 1063256064, 1065353216, 1067450368, 1069547520, 1071644672, 1073741824, 1075838976, 1077936128, 1080033280, 1082130432, 1084227584, 1086324736, 1088421888, 1090519040, 1092616192, 1094713344, 1096810496, 1098907648, 1101004800, 1103101952, 1105199104, 1107296256, 1109393408, 1111490560, 1113587712, 1115684864, 1117782016, 1119879168, 1231028224, 1233125376, 1235222528, 1237319680, 1239416832, 1241513984, 1243611136, 1245708288, 1247805440, 1249902592, 1251999744, 1254096896, 1256194048, 1258291200, 1260388352, 1262485504, 1264582656, 1266679808, 1268776960, 1270874112, 1272971264, 1275068416, 1277165568, 1279262720, 1281359872, 1283457024, 1285554176, 1287651328, 1289748480, 1291845632, 1293942784, 1296039936, 1298137088, 1300234240, 1302331392, 1419771904, 1421869056, 1423966208, 1426063360, 1428160512, 1430257664, 1432354816, 1434451968, 1436549120, 1438646272, 1440743424, 1442840576, 1444937728, 1447034880, 1449132032, 1451229184, 1453326336, 1455423488, 1457520640, 1459617792, 1461714944, 1463812096, 1465909248, 1468006400, 1470103552, 1472200704, 1474297856, 1476395008, 1478492160, 1480589312, 1482686464, 1484783616, 1486880768, 1589641216, 1591738368, 1593835520, 1595932672, 1598029824, 1600126976, 1602224128, 1604321280, 1606418432, 1608515584, 1610612736, 1612709888, 1614807040, 1616904192, 1619001344, 1621098496, 1623195648, 1625292800, 1627389952, 1629487104, 1631584256, 1633681408, 1635778560, 1637875712, 1639972864, 1642070016, 1644167168, 1646264320, 1648361472, 1650458624, 1652555776, 1654652928, 1656750080, 1765801984, 1767899136, 1769996288, 1772093440, 1774190592, 1776287744, 1778384896, 1780482048, 1782579200, 1784676352, 1786773504, 1788870656, 1790967808, 1793064960, 1795162112, 1797259264, 1799356416, 1801453568, 1803550720, 1805647872, 1807745024, 1809842176, 1811939328, 1814036480, 1816133632, 1818230784, 1820327936, 1822425088, 1824522240, 1826619392, 1828716544, 1830813696, 1832910848, 1944059904, 1946157056, 1948254208, 1950351360, 1952448512, 1954545664, 1956642816, 1958739968, 1960837120, 1962934272, 1965031424, 1967128576, 1969225728, 1971322880, 1973420032, 1975517184, 1977614336, 1979711488, 1981808640, 1983905792, 1986002944, 1988100096, 1990197248, 1992294400, 1994391552, 1996488704, 1998585856, 2000683008, 2002780160, 2004877312, 2006974464, 2009071616, 2011168768, 2124414976, 2126512128, 2128609280, 2130706432, 2132803584, 2134900736, 2136997888, 2139095040, 2141192192, 2143289344, 2145386496, 2147483648, 2149580800, 2151677952, 2153775104, 2155872256, 2157969408, 2160066560, 2162163712, 2164260864, 2166358016, 2168455168, 2170552320, 2172649472, 2174746624, 2176843776, 2178940928, 2181038080, 2183135232, 2185232384, 2187329536, 2189426688, 2191523840, 2313158656, 2315255808, 2317352960, 2319450112, 2321547264, 2323644416, 2325741568, 2327838720, 2329935872, 2332033024, 2334130176, 2336227328, 2338324480, 2340421632, 2342518784, 2344615936, 2346713088, 2348810240, 2350907392, 2353004544, 2355101696, 2357198848, 2359296000, 2361393152, 2363490304, 2365587456, 2367684608, 2369781760, 2371878912, 2373976064, 2376073216, 2378170368, 2380267520, 2382364672, 2384461824, 2386558976, 2388656128, 2518679552, 2520776704, 2522873856, 2524971008, 2527068160, 2529165312, 2531262464, 2533359616, 2535456768, 2537553920, 2539651072, 2541748224, 2543845376, 2545942528, 2548039680, 2550136832, 2552233984, 2554331136, 2556428288, 2558525440, 2560622592, 2562719744, 2564816896, 2566914048, 2569011200, 2571108352, 2573205504, 2575302656, 2577399808, 2579496960, 2581594112, 2583691264, 2585788416, 2587885568, 2589982720, 2592079872, 2594177024, 2596274176, 2717908992, 2720006144, 2722103296, 2724200448, 2726297600, 2728394752, 2730491904, 2732589056, 2734686208, 2736783360, 2738880512, 2740977664, 2743074816, 2745171968, 2747269120, 2749366272, 2751463424, 2753560576, 2755657728, 2757754880, 2759852032, 2761949184, 2764046336, 2766143488, 2768240640, 2770337792, 2772434944, 2774532096, 2776629248, 2778726400, 2780823552, 2782920704, 2785017856, 2787115008, 2789212160, 2791309312, 2910846976, 2912944128, 2915041280, 2917138432, 2919235584, 2921332736, 2923429888, 2925527040, 2927624192, 2929721344, 2931818496, 2933915648, 2936012800, 2938109952, 2940207104, 2942304256, 2944401408, 2946498560, 2948595712, 2950692864, 2952790016, 2954887168, 2956984320, 2959081472, 2961178624, 2963275776, 2965372928, 2967470080, 2969567232, 2971664384, 2973761536, 2975858688, 2977955840, 2980052992, 2982150144, 2984247296, 2986344448, 104987623424, 104989720576, 104991817728, 104993914880, 104996012032, 104998109184, 105000206336, 105002303488, 105004400640, 105006497792, 105008594944, 105010692096, 105012789248, 105014886400, 105016983552, 105019080704, 105021177856, 105023275008, 105025372160, 105027469312, 105029566464, 105031663616, 105033760768, 105035857920, 105037955072, 105040052224, 105042149376, 105044246528, 105046343680, 105048440832, 105050537984, 105052635136, 105054732288, 105056829440, 105058926592, 105061023744, 105063120896, 105065218048, 105067315200}; hash::ObCuckooHashMap map; ObArenaAllocator allocator; const int64_t array_size = sizeof(macro_id_array) / sizeof(macro_id_array[0]); ASSERT_EQ(OB_SUCCESS, map.create(array_size, &allocator)); for (int64_t i = 0; i < array_size; ++i) { int64_t value = 0; ASSERT_EQ(OB_SUCCESS, map.set(MacroKey(macro_id_array[i]), i)); ASSERT_EQ(OB_SUCCESS, map.get(MacroKey(macro_id_array[i]), value)); } ASSERT_EQ(array_size, map.size()); } TEST_F(TestCuckooHashMap, test_clear_and_iterate) { const int64_t bucket_num = 2; hash::ObCuckooHashMap map; hash::ObCuckooHashMap::iterator iter; ObArenaAllocator allocator; ASSERT_EQ(OB_SUCCESS, map.create(bucket_num, &allocator)); ASSERT_EQ(OB_SUCCESS, map.set(0, 0)); iter = map.begin(); ASSERT_TRUE(iter != map.end()); map.clear(); iter = map.begin(); ASSERT_TRUE(iter == map.end()); } int main(int argc, char** argv) { system("rm -f test_cuckoo_hash_map.log*"); OB_LOGGER.set_log_level("DEBUG"); OB_LOGGER.set_file_name("test_cuckoo_hash_map.log", true); testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }