susumu.yata
null+****@clear*****
Thu Jul 4 11:34:33 JST 2013
susumu.yata 2013-07-04 11:34:33 +0900 (Thu, 04 Jul 2013) New Revision: ad1b506416d3e55444af4d17953698d379093110 https://github.com/groonga/grnxx/commit/ad1b506416d3e55444af4d17953698d379093110 Message: Use grnxx::Exception for error handling. Modified files: lib/grnxx/map/array_map.cpp lib/grnxx/map/bytes_array.cpp lib/grnxx/map/hash_table.cpp lib/grnxx/map/hash_table.hpp lib/grnxx/map/hash_table/key_id_array.hpp lib/grnxx/map/key_store.cpp lib/grnxx/map/patricia.cpp test/test_map.cpp Modified: lib/grnxx/map/array_map.cpp (+21 -52) =================================================================== --- lib/grnxx/map/array_map.cpp 2013-07-04 10:38:22 +0900 (763b9fc) +++ lib/grnxx/map/array_map.cpp 2013-07-04 11:34:33 +0900 (2ed6067) @@ -90,25 +90,19 @@ bool ArrayMap<T>::get(int64_t key_id, Key *key) { return false; } bool bit; - if (!keys_->get_bit(key_id, &bit)) { - // Error. - return false; - } + keys_->get_bit(key_id, &bit); if (!bit) { // Not found. return false; } - if (!keys_->get_key(key_id, key)) { - // Error. - return false; - } + keys_->get_key(key_id, key); return true; } template <typename T> bool ArrayMap<T>::unset(int64_t key_id) { if (!keys_->unset(key_id)) { - // Not found or error. + // Not found. return false; } return true; @@ -117,17 +111,14 @@ bool ArrayMap<T>::unset(int64_t key_id) { template <typename T> bool ArrayMap<T>::reset(int64_t key_id, KeyArg dest_key) { if (!get(key_id)) { - // Not found or error. + // Not found. return false; } if (find(dest_key)) { // Found. return false; } - if (!keys_->reset(key_id, Helper<T>::normalize(dest_key))) { - // Error. - return false; - } + keys_->reset(key_id, Helper<T>::normalize(dest_key)); return true; } @@ -136,16 +127,10 @@ bool ArrayMap<T>::find(KeyArg key, int64_t *key_id) { const Key normalized_key = map::Helper<T>::normalize(key); for (int64_t i = MAP_MIN_KEY_ID; i <= max_key_id(); ++i) { bool bit; - if (!keys_->get_bit(i, &bit)) { - // Error. - return false; - } + keys_->get_bit(i, &bit); if (bit) { Key stored_key; - if (!keys_->get_key(i, &stored_key)) { - // Error. - return false; - } + keys_->get_key(i, &stored_key); if (Helper<T>::equal_to(normalized_key, stored_key)) { // Found. if (key_id) { @@ -163,16 +148,10 @@ bool ArrayMap<T>::add(KeyArg key, int64_t *key_id) { const Key normalized_key = Helper<T>::normalize(key); for (int64_t i = MAP_MIN_KEY_ID; i <= max_key_id(); ++i) { bool bit; - if (!keys_->get_bit(i, &bit)) { - // Error. - return false; - } + keys_->get_bit(i, &bit); if (bit) { Key stored_key; - if (!keys_->get_key(i, &stored_key)) { - // Error. - return false; - } + keys_->get_key(i, &stored_key); if (Helper<T>::equal_to(normalized_key, stored_key)) { // Found. if (key_id) { @@ -182,10 +161,7 @@ bool ArrayMap<T>::add(KeyArg key, int64_t *key_id) { } } } - if (!keys_->add(normalized_key, key_id)) { - // Error. - return false; - } + keys_->add(normalized_key, key_id); return true; } @@ -193,12 +169,13 @@ template <typename T> bool ArrayMap<T>::remove(KeyArg key) { int64_t key_id; if (!find(key, &key_id)) { - // Not found or error. + // Not found. return false; } if (!keys_->unset(key_id)) { - // Error. - return false; + GRNXX_ERROR() << "failed to remove: key = " << key + << ", key_id = " << key_id; + throw LogicError(); } return true; } @@ -210,22 +187,16 @@ bool ArrayMap<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { int64_t src_key_id = MAP_INVALID_KEY_ID; for (int64_t i = MAP_MIN_KEY_ID; i <= max_key_id(); ++i) { bool bit; - if (!keys_->get_bit(i, &bit)) { - // Error. - return false; - } + keys_->get_bit(i, &bit); if (bit) { Key stored_key; - if (!keys_->get_key(i, &stored_key)) { - // Error. - return false; - } + keys_->get_key(i, &stored_key); if (Helper<T>::equal_to(normalized_src_key, stored_key)) { - // Found. + // Source key found. src_key_id = i; } if (Helper<T>::equal_to(normalized_dest_key, stored_key)) { - // Found. + // Destination key found. return false; } } @@ -234,10 +205,7 @@ bool ArrayMap<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { // Not found. return false; } - if (!keys_->reset(src_key_id, normalized_dest_key)) { - // Error. - return false; - } + keys_->reset(src_key_id, normalized_dest_key); if (key_id) { *key_id = src_key_id; } @@ -246,7 +214,8 @@ bool ArrayMap<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { template <typename T> bool ArrayMap<T>::truncate() { - return keys_->truncate(); + keys_->truncate(); + return true; } template <typename T> Modified: lib/grnxx/map/bytes_array.cpp (+7 -13) =================================================================== --- lib/grnxx/map/bytes_array.cpp 2013-07-04 10:38:22 +0900 (eb7963f) +++ lib/grnxx/map/bytes_array.cpp 2013-07-04 11:34:33 +0900 (1a812bd) @@ -83,14 +83,12 @@ bool BytesArray::unlink(Storage *storage, uint32_t storage_node_id) { bool BytesArray::get(uint64_t value_id, Value *value) { uint64_t bytes_id; - if (!ids_->get(value_id, &bytes_id)) { - return false; - } + ids_->get(value_id, &bytes_id); if (value) { if (bytes_id == BYTES_STORE_INVALID_BYTES_ID) { *value = default_value_; } else { - return store_->get(bytes_id, value); + store_->get(bytes_id, value); } } return true; @@ -98,18 +96,14 @@ bool BytesArray::get(uint64_t value_id, Value *value) { bool BytesArray::set(uint64_t value_id, ValueArg value) { uint64_t *src_bytes_id = ids_->get_pointer(value_id); - if (!src_bytes_id) { - return false; - } uint64_t dest_bytes_id; - if (!store_->add(value, &dest_bytes_id)) { - return false; - } + store_->add(value, &dest_bytes_id); if (*src_bytes_id != BYTES_STORE_INVALID_BYTES_ID) { - if (!store_->unset(*src_bytes_id)) { - // The following unset() may not fail due to the above add(). + try { + store_->unset(*src_bytes_id); + } catch (...) { store_->unset(dest_bytes_id); - return false; + throw; } } *src_bytes_id = dest_bytes_id; Modified: lib/grnxx/map/hash_table.cpp (+60 -134) =================================================================== --- lib/grnxx/map/hash_table.cpp 2013-07-04 10:38:22 +0900 (0bb2fcc) +++ lib/grnxx/map/hash_table.cpp 2013-07-04 11:34:33 +0900 (14dcd63) @@ -102,31 +102,26 @@ bool HashTable<T>::get(int64_t key_id, Key *key) { return false; } bool bit; - if (!keys_->get_bit(key_id, &bit)) { - // Error. - return false; - } + keys_->get_bit(key_id, &bit); if (!bit) { // Not found. return false; } - return keys_->get_key(key_id, key); + keys_->get_key(key_id, key); + return true; } template <typename T> bool HashTable<T>::unset(int64_t key_id) { - if (!refresh_key_ids()) { - // Error. - return false; - } + refresh_key_ids(); int64_t *stored_key_id; if (!find_key_id(key_id, &stored_key_id)) { - // Not found or error. + // Not found. return false; } if (!keys_->unset(key_id)) { - // Error. - return false; + GRNXX_ERROR() << "failed to unset: key_id = " << key_id; + throw LogicError(); } *stored_key_id = -1; return true; @@ -134,30 +129,24 @@ bool HashTable<T>::unset(int64_t key_id) { template <typename T> bool HashTable<T>::reset(int64_t key_id, KeyArg dest_key) { - if (!refresh_key_ids()) { - // Error. - return false; - } + refresh_key_ids(); Key src_key; if (!get(key_id, &src_key)) { - // Not found or error. + // Not found. return false; } int64_t *src_key_id; if (!find_key_id(key_id, &src_key_id)) { - // Not found or error. + // Not found. return false; } const Key dest_normalized_key = Helper<T>::normalize(dest_key); int64_t *dest_key_id; if (find_key(dest_normalized_key, &dest_key_id)) { - // Found or error. - return false; - } - if (!keys_->reset(key_id, dest_normalized_key)) { - // Error. + // Found. return false; } + keys_->reset(key_id, dest_normalized_key); if (*dest_key_id == MAP_INVALID_KEY_ID) { ++header_->num_key_ids; } @@ -168,14 +157,11 @@ bool HashTable<T>::reset(int64_t key_id, KeyArg dest_key) { template <typename T> bool HashTable<T>::find(KeyArg key, int64_t *key_id) { - if (!refresh_key_ids()) { - // Error. - return false; - } + refresh_key_ids(); const Key normalized_key = Helper<T>::normalize(key); int64_t *stored_key_id; if (!find_key(normalized_key, &stored_key_id)) { - // Not found or error. + // Not found. return false; } if (key_id) { @@ -186,17 +172,11 @@ bool HashTable<T>::find(KeyArg key, int64_t *key_id) { template <typename T> bool HashTable<T>::add(KeyArg key, int64_t *key_id) { - if (!refresh_key_ids()) { - // Error. - return false; - } + refresh_key_ids(); // Rebuild the hash table if the filling rate is greater than 62.5%. const uint64_t key_ids_size = key_ids_->mask() + 1; if (header_->num_key_ids > ((key_ids_size + (key_ids_size / 4)) / 2)) { - if (!rebuild()) { - // Error. - return false; - } + rebuild(); } const Key normalized_key = Helper<T>::normalize(key); int64_t *stored_key_id; @@ -211,10 +191,7 @@ bool HashTable<T>::add(KeyArg key, int64_t *key_id) { return false; } int64_t next_key_id; - if (!keys_->add(normalized_key, &next_key_id)) { - // Error. - return false; - } + keys_->add(normalized_key, &next_key_id); if (*stored_key_id == MAP_INVALID_KEY_ID) { ++header_->num_key_ids; } @@ -227,19 +204,17 @@ bool HashTable<T>::add(KeyArg key, int64_t *key_id) { template <typename T> bool HashTable<T>::remove(KeyArg key) { - if (!refresh_key_ids()) { - // Error. - return false; - } + refresh_key_ids(); const Key normalized_key = Helper<T>::normalize(key); int64_t *stored_key_id; if (!find_key(normalized_key, &stored_key_id)) { - // Not found or error. + // Not found. return false; } if (!keys_->unset(*stored_key_id)) { - // Error. - return false; + GRNXX_ERROR() << "failed to remove: key = " << key + << ", key_id = " << *stored_key_id; + throw LogicError(); } *stored_key_id = -1; return true; @@ -247,26 +222,20 @@ bool HashTable<T>::remove(KeyArg key) { template <typename T> bool HashTable<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { - if (!refresh_key_ids()) { - // Error. - return false; - } + refresh_key_ids(); const Key src_normalized_key = Helper<T>::normalize(src_key); int64_t *src_key_id; if (!find_key(src_normalized_key, &src_key_id)) { - // Not found or error. + // Not found. return false; } const Key dest_normalized_key = Helper<T>::normalize(dest_key); int64_t *dest_key_id; if (find_key(dest_normalized_key, &dest_key_id)) { - // Found or error. - return false; - } - if (!keys_->reset(*src_key_id, dest_normalized_key)) { - // Error. + // Found. return false; } + keys_->reset(*src_key_id, dest_normalized_key); if (*dest_key_id == MAP_INVALID_KEY_ID) { ++header_->num_key_ids; } @@ -280,9 +249,7 @@ bool HashTable<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { template <typename T> bool HashTable<T>::truncate() { - if (!refresh_key_ids()) { - return false; - } + refresh_key_ids(); if (max_key_id() == MAP_MIN_KEY_ID) { // Nothing to do. return true; @@ -290,21 +257,15 @@ bool HashTable<T>::truncate() { std::unique_ptr<KeyIDArray> new_key_ids( KeyIDArray::create(storage_, storage_node_id_, KeyIDArray::page_size() - 1)); - if (!new_key_ids) { - // Error. - return false; - } - if (header_->old_key_ids_storage_node_id != STORAGE_INVALID_NODE_ID) { + if (header_->old_key_ids_storage_node_id != STORAGE_INVALID_NODE_ID) try { if (!KeyIDArray::unlink(storage_, header_->old_key_ids_storage_node_id)) { - // Error. - KeyIDArray::unlink(storage_, new_key_ids->storage_node_id()); - return false; + throw LogicError(); } + } catch (...) { + KeyIDArray::unlink(storage_, new_key_ids->storage_node_id()); + throw; } - if (!keys_->truncate()) { - // Error. - return false; - } + keys_->truncate(); header_->num_key_ids = 0; header_->old_key_ids_storage_node_id = header_->key_ids_storage_node_id; header_->key_ids_storage_node_id = new_key_ids->storage_node_id(); @@ -357,16 +318,12 @@ bool HashTable<T>::find_key_id(int64_t key_id, int64_t **stored_key_id) { KeyIDArray * const key_ids = key_ids_.get(); Key stored_key; if (!get(key_id, &stored_key)) { - // Not found or error. + // Not found. return false; } const uint64_t first_hash = Hash<T>()(stored_key); for (uint64_t hash = first_hash; ; ) { *stored_key_id = key_ids->get_pointer(hash); - if (!*stored_key_id) { - // Error. - return false; - } if (**stored_key_id == key_id) { // Found. return true; @@ -375,7 +332,7 @@ bool HashTable<T>::find_key_id(int64_t key_id, int64_t **stored_key_id) { if (hash == first_hash) { // Critical error. GRNXX_ERROR() << "endless loop"; - return false; + throw LogicError(); } } } @@ -387,10 +344,6 @@ bool HashTable<T>::find_key(KeyArg key, int64_t **stored_key_id) { const uint64_t first_hash = Hash<T>()(key); for (uint64_t hash = first_hash; ; ) { int64_t * const key_id = key_ids->get_pointer(hash); - if (!key_id) { - // Error. - return false; - } if (*key_id == MAP_INVALID_KEY_ID) { // Not found. if (!*stored_key_id) { @@ -404,10 +357,7 @@ bool HashTable<T>::find_key(KeyArg key, int64_t **stored_key_id) { } } else { Key stored_key; - if (!keys_->get_key(*key_id, &stored_key)) { - // Error. - return false; - } + keys_->get_key(*key_id, &stored_key); if (Helper<T>::equal_to(stored_key, key)) { // Found. *stored_key_id = key_id; @@ -418,13 +368,13 @@ bool HashTable<T>::find_key(KeyArg key, int64_t **stored_key_id) { if (hash == first_hash) { // Critical error. GRNXX_ERROR() << "endless loop"; - return false; + throw LogicError(); } } } template <typename T> -bool HashTable<T>::rebuild() { +void HashTable<T>::rebuild() { uint64_t new_size = num_keys() * 2; if (new_size < key_ids_->page_size()) { new_size = key_ids_->page_size(); @@ -434,54 +384,36 @@ bool HashTable<T>::rebuild() { // Critical error. GRNXX_ERROR() << "too large table: size = " << new_size << ", max_size = " << key_ids_->size(); - return false; + throw LogicError(); } const uint64_t new_mask = new_size - 1; // Create a new hash table. std::unique_ptr<KeyIDArray> new_key_ids( KeyIDArray::create(storage_, storage_node_id_, new_mask)); - if (!new_key_ids) { - // Error. - return false; - } - // Copy keys from the current hash table to the new one. - int64_t key_id; - for (key_id = MAP_MIN_KEY_ID; key_id <= max_key_id(); ++key_id) { - bool bit; - if (!keys_->get_bit(key_id, &bit)) { - // Error. - break; - } - if (!bit) { - continue; - } - Key stored_key; - if (!keys_->get_key(key_id, &stored_key)) { - // Error. - break; - } - const uint64_t first_hash = Hash<T>()(stored_key); - int64_t *stored_key_id; - for (uint64_t hash = first_hash; ; hash = rehash(hash)) { - stored_key_id = new_key_ids->get_pointer(hash); - if (!stored_key_id) { - // Error. - break; + try { + // Copy keys from the current hash table to the new one. + int64_t key_id; + for (key_id = MAP_MIN_KEY_ID; key_id <= max_key_id(); ++key_id) { + bool bit; + keys_->get_bit(key_id, &bit); + if (!bit) { + continue; } - if (*stored_key_id == MAP_INVALID_KEY_ID) { - *stored_key_id = key_id; - break; + Key stored_key; + keys_->get_key(key_id, &stored_key); + const uint64_t first_hash = Hash<T>()(stored_key); + int64_t *stored_key_id; + for (uint64_t hash = first_hash; ; hash = rehash(hash)) { + stored_key_id = new_key_ids->get_pointer(hash); + if (*stored_key_id == MAP_INVALID_KEY_ID) { + *stored_key_id = key_id; + break; + } } } - if (!stored_key_id) { - // Error. - break; - } - } - if (key_id <= max_key_id()) { - // Error. + } catch (...) { KeyIDArray::unlink(storage_, new_key_ids->storage_node_id()); - return false; + throw; } if (header_->old_key_ids_storage_node_id != STORAGE_INVALID_NODE_ID) { KeyIDArray::unlink(storage_, header_->old_key_ids_storage_node_id); @@ -493,7 +425,6 @@ bool HashTable<T>::rebuild() { old_key_ids_.swap(new_key_ids); key_ids_.swap(old_key_ids_); } - return true; } template <typename T> @@ -502,21 +433,16 @@ uint64_t HashTable<T>::rehash(uint64_t hash) const { } template <typename T> -bool HashTable<T>::refresh_key_ids() { +void HashTable<T>::refresh_key_ids() { if (key_ids_->storage_node_id() != header_->key_ids_storage_node_id) { Lock lock(&header_->mutex); if (key_ids_->storage_node_id() != header_->key_ids_storage_node_id) { std::unique_ptr<KeyIDArray> new_key_ids( KeyIDArray::open(storage_, header_->key_ids_storage_node_id)); - if (!new_key_ids) { - // Error. - return false; - } old_key_ids_.swap(new_key_ids); key_ids_.swap(old_key_ids_); } } - return true; } template class HashTable<int8_t>; Modified: lib/grnxx/map/hash_table.hpp (+2 -2) =================================================================== --- lib/grnxx/map/hash_table.hpp 2013-07-04 10:38:22 +0900 (ffb2fb8) +++ lib/grnxx/map/hash_table.hpp 2013-07-04 11:34:33 +0900 (626c48b) @@ -95,12 +95,12 @@ class HashTable : public Map<T> { bool find_key(KeyArg key, int64_t **stored_key_id); // Rebuild the hash table. - bool rebuild(); + void rebuild(); // Move to the next entry. uint64_t rehash(uint64_t hash) const; // Refresh "key_ids_" if it is old. - bool refresh_key_ids(); + void refresh_key_ids(); }; } // namespace map Modified: lib/grnxx/map/hash_table/key_id_array.hpp (+4 -25) =================================================================== --- lib/grnxx/map/hash_table/key_id_array.hpp 2013-07-04 10:38:22 +0900 (7aafbcd) +++ lib/grnxx/map/hash_table/key_id_array.hpp 2013-07-04 11:34:33 +0900 (228aad0) @@ -91,33 +91,20 @@ class KeyIDArray { static KeyIDArray *create(Storage *storage, uint32_t storage_node_id, uint64_t mask) { std::unique_ptr<KeyIDArray> array(create_instance()); - if (!array) { - return nullptr; - } - if (!array->create_array(storage, storage_node_id, mask)) { - return nullptr; - } + array->create_array(storage, storage_node_id, mask); return array.release(); } // Open an array. static KeyIDArray *open(Storage *storage, uint32_t storage_node_id) { std::unique_ptr<KeyIDArray> array(create_instance()); - if (!array) { - return nullptr; - } - if (!array->open_array(storage, storage_node_id)) { - return nullptr; - } + array->open_array(storage, storage_node_id); return array.release(); } // Unlink an array. static bool unlink(Storage *storage, uint32_t storage_node_id) { std::unique_ptr<KeyIDArray> array(open(storage, storage_node_id)); - if (!array) { - return false; - } return storage->unlink_node(storage_node_id); } @@ -181,14 +168,11 @@ class KeyIDArray { return array; } - bool create_array(Storage *storage, uint32_t storage_node_id, + void create_array(Storage *storage, uint32_t storage_node_id, uint64_t mask) { storage_ = storage; StorageNode storage_node = storage_->create_node(storage_node_id, sizeof(KeyIDArrayHeader)); - if (!storage_node) { - return false; - } storage_node_id_ = storage_node.id(); try { header_ = static_cast<KeyIDArrayHeader *>(storage_node.body()); @@ -201,20 +185,15 @@ class KeyIDArray { storage_->unlink_node(storage_node_id_); throw; } - return true; } - bool open_array(Storage *storage, uint32_t storage_node_id) { + void open_array(Storage *storage, uint32_t storage_node_id) { storage_ = storage; StorageNode storage_node = storage_->open_node(storage_node_id); - if (!storage_node) { - return false; - } storage_node_id_ = storage_node.id(); header_ = static_cast<KeyIDArrayHeader *>(storage_node.body()); impl_.open(storage, header_->impl_storage_node_id); mask_ = header_->mask; - return true; } }; Modified: lib/grnxx/map/key_store.cpp (+2 -24) =================================================================== --- lib/grnxx/map/key_store.cpp 2013-07-04 10:38:22 +0900 (a194a79) +++ lib/grnxx/map/key_store.cpp 2013-07-04 11:34:33 +0900 (0a03291) @@ -82,10 +82,6 @@ bool KeyStore<T>::unset(int64_t key_id) { const uint64_t unit_id = key_id / bits_->unit_size(); const uint64_t unit_bit = 1ULL << (key_id % bits_->unit_size()); BitArrayUnit * const unit = bits_->get_unit(unit_id); - if (!unit) { - // Error. - return false; - } if ((*unit & unit_bit) == 0) { // Not found. return false; @@ -94,10 +90,6 @@ bool KeyStore<T>::unset(int64_t key_id) { uint64_t *link = nullptr; if (*unit == ~BitArrayUnit(0)) { link = links_->get_pointer(unit_id); - if (!link) { - // Error. - return false; - } } *unit &= ~unit_bit; if (link) { @@ -119,33 +111,19 @@ bool KeyStore<T>::add(KeyArg key, int64_t *key_id) { unit_id = header_->latest_link; } BitArrayUnit * const unit = bits_->get_unit(unit_id); - if (!unit) { - // Error. - return false; - } const uint8_t unit_bit_id = bit_scan_forward(~*unit); const uint64_t unit_bit = 1ULL << unit_bit_id; const int64_t next_key_id = (unit_id * bits_->unit_size()) + unit_bit_id; uint64_t *link = nullptr; if (is_new_unit) { - if (!links_->set(unit_id, INVALID_LINK)) { - // Error. - return false; - } + links_->set(unit_id, INVALID_LINK); *unit = 0; header_->latest_link = (header_->max_key_id + 1) / bits_->unit_size(); } else if ((*unit | unit_bit) == ~BitArrayUnit(0)) { // The unit will be removed from "links_" if it becomes full. link = links_->get_pointer(header_->latest_link); - if (!link) { - // Error. - return false; - } - } - if (!keys_->set(next_key_id, key)) { - // Error. - return false; } + keys_->set(next_key_id, key); if (link) { header_->latest_link = *link; } Modified: lib/grnxx/map/patricia.cpp (+44 -293) =================================================================== --- lib/grnxx/map/patricia.cpp 2013-07-04 10:38:22 +0900 (aba2098) +++ lib/grnxx/map/patricia.cpp 2013-07-04 11:34:33 +0900 (9981020) @@ -61,7 +61,7 @@ Patricia<T> *Patricia<T>::create(Storage *storage, std::unique_ptr<Patricia> map(new (std::nothrow) Patricia); if (!map) { GRNXX_ERROR() << "new grnxx::map::Patricia failed"; - return nullptr; + throw MemoryError(); } map->create_map(storage, storage_node_id, options); return map.release(); @@ -73,7 +73,7 @@ Patricia<T> *Patricia<T>::open(Storage *storage, std::unique_ptr<Patricia> map(new (std::nothrow) Patricia); if (!map) { GRNXX_ERROR() << "new grnxx::map::Patricia failed"; - return nullptr; + throw MemoryError(); } map->open_map(storage, storage_node_id); return map.release(); @@ -106,18 +106,12 @@ bool Patricia<T>::get(int64_t key_id, Key *key) { return false; } bool bit; - if (!keys_->get_bit(key_id, &bit)) { - // Error. - return false; - } + keys_->get_bit(key_id, &bit); if (!bit) { // Not found. return false; } - if (!keys_->get_key(key_id, key)) { - // Error. - return false; - } + keys_->get_key(key_id, key); return true; } @@ -125,7 +119,7 @@ template <typename T> bool Patricia<T>::unset(int64_t key_id) { Key key; if (!get(key_id, &key)) { - // Not found or error. + // Not found. return false; } // The root node must be a dead node because the above get() has succeeded. @@ -133,10 +127,6 @@ bool Patricia<T>::unset(int64_t key_id) { Node *prev_node = nullptr; for ( ; ; ) { Node * const node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } if (node->status() == NODE_LEAF) { if (node->key_id() != key_id) { // Not found. @@ -161,7 +151,7 @@ bool Patricia<T>::reset(int64_t key_id, KeyArg dest_key) { // Find the source key. Key src_key; if (!get(key_id, &src_key)) { - // Not found or error. + // Not found. return false; } // The root node must be a dead node because the above get() has succeeded. @@ -171,10 +161,6 @@ bool Patricia<T>::reset(int64_t key_id, KeyArg dest_key) { Node *src_sibling_node = nullptr; for ( ; ; ) { src_node = nodes_->get_pointer(node_id); - if (!src_node) { - // Error. - return false; - } if (src_node->status() == NODE_LEAF) { if (src_node->key_id() != key_id) { // Not found. @@ -195,10 +181,6 @@ bool Patricia<T>::reset(int64_t key_id, KeyArg dest_key) { int depth = -1; for ( ; ; ) { Node * const node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } history[++depth] = node; if (node->status() == NODE_LEAF) { break; @@ -208,10 +190,7 @@ bool Patricia<T>::reset(int64_t key_id, KeyArg dest_key) { } // Count the number of the common prefix bits. Key stored_key; - if (!keys_->get_key(history[depth]->key_id(), &stored_key)) { - // Error. - return false; - } + keys_->get_key(history[depth]->key_id(), &stored_key); const uint64_t count = count_common_prefix_bits(dest_normalized_key, stored_key); if (count == (sizeof(Key) * 8)) { @@ -227,13 +206,7 @@ bool Patricia<T>::reset(int64_t key_id, KeyArg dest_key) { } Node * const dest_prev_node = history[depth]; Node * const next_nodes = nodes_->get_pointer(header_->next_node_id); - if (!next_nodes) { - return false; - } - if (!keys_->reset(key_id, dest_normalized_key)) { - // Error. - return false; - } + keys_->reset(key_id, dest_normalized_key); Node *dest_node; Node *dest_sibling_node; if (get_ith_bit(dest_normalized_key, count)) { @@ -262,10 +235,7 @@ bool Patricia<T>::find(KeyArg key, int64_t *key_id) { const Key normalized_key = Helper<T>::normalize(key); uint64_t node_id = ROOT_NODE_ID; Node node; - if (!nodes_->get(node_id, &node)) { - // Error. - return false; - } + nodes_->get(node_id, &node); if (node.status() == NODE_DEAD) { // Not found. return false; @@ -273,10 +243,7 @@ bool Patricia<T>::find(KeyArg key, int64_t *key_id) { for ( ; ; ) { if (node.status() == NODE_LEAF) { Key stored_key; - if (!keys_->get_key(node.key_id(), &stored_key)) { - // Error. - return false; - } + keys_->get_key(node.key_id(), &stored_key); if (!Helper<T>::equal_to(normalized_key, stored_key)) { // Not found. return false; @@ -287,10 +254,7 @@ bool Patricia<T>::find(KeyArg key, int64_t *key_id) { return true; } node_id = node.offset() + get_ith_bit(normalized_key, node.bit_pos()); - if (!nodes_->get(node_id, &node)) { - // Error. - return false; - } + nodes_->get(node_id, &node); } } @@ -299,17 +263,10 @@ bool Patricia<T>::add(KeyArg key, int64_t *key_id) { const Key normalized_key = Helper<T>::normalize(key); uint64_t node_id = ROOT_NODE_ID; Node *node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } if (node->status() == NODE_DEAD) { // The patricia is empty. int64_t next_key_id; - if (!keys_->add(normalized_key, &next_key_id)) { - // Error. - return false; - } + keys_->add(normalized_key, &next_key_id); *node = Node::leaf_node(next_key_id); if (key_id) { *key_id = next_key_id; @@ -322,18 +279,11 @@ bool Patricia<T>::add(KeyArg key, int64_t *key_id) { while (node->status() != NODE_LEAF) { node_id = node->offset() + get_ith_bit(normalized_key, node->bit_pos()); node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } history[++depth] = node; } // Count the number of the common prefix bits. Key stored_key; - if (!keys_->get_key(node->key_id(), &stored_key)) { - // Error. - return false; - } + keys_->get_key(node->key_id(), &stored_key); const uint64_t count = count_common_prefix_bits(normalized_key, stored_key); if (count == (sizeof(Key) * 8)) { // Found. @@ -351,14 +301,8 @@ bool Patricia<T>::add(KeyArg key, int64_t *key_id) { } node = history[depth]; Node * const next_nodes = nodes_->get_pointer(header_->next_node_id); - if (!next_nodes) { - return false; - } int64_t next_key_id; - if (!keys_->add(normalized_key, &next_key_id)) { - // Error. - return false; - } + keys_->add(normalized_key, &next_key_id); if (get_ith_bit(normalized_key, count)) { next_nodes[0] = *node; next_nodes[1] = Node::leaf_node(next_key_id); @@ -379,10 +323,6 @@ bool Patricia<T>::remove(KeyArg key) { const Key normalized_key = Helper<T>::normalize(key); uint64_t node_id = ROOT_NODE_ID; Node *node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } if (node->status() == NODE_DEAD) { // Not found. return false; @@ -391,10 +331,7 @@ bool Patricia<T>::remove(KeyArg key) { for ( ; ; ) { if (node->status() == NODE_LEAF) { Key stored_key; - if (!keys_->get_key(node->key_id(), &stored_key)) { - // Error. - return false; - } + keys_->get_key(node->key_id(), &stored_key); if (!Helper<T>::equal_to(normalized_key, stored_key)) { // Not found. return false; @@ -411,10 +348,6 @@ bool Patricia<T>::remove(KeyArg key) { prev_node = node; node_id = node->offset() + get_ith_bit(normalized_key, node->bit_pos()); node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } } } @@ -423,10 +356,6 @@ bool Patricia<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { const Key src_normalized_key = Helper<T>::normalize(src_key); uint64_t node_id = ROOT_NODE_ID; Node *src_node = nodes_->get_pointer(node_id); - if (!src_node) { - // Error. - return false; - } if (src_node->status() == NODE_DEAD) { // Not found. return false; @@ -438,10 +367,7 @@ bool Patricia<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { if (src_node->status() == NODE_LEAF) { src_key_id = src_node->key_id(); Key stored_key; - if (!keys_->get_key(src_key_id, &stored_key)) { - // Error. - return false; - } + keys_->get_key(src_key_id, &stored_key); if (!Helper<T>::equal_to(src_normalized_key, stored_key)) { // Not found. return false; @@ -455,10 +381,6 @@ bool Patricia<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { node_id = src_node->offset() + get_ith_bit(src_normalized_key, src_node->bit_pos()); src_node = nodes_->get_pointer(node_id); - if (!src_node) { - // Error. - return false; - } } // Add the destination key. const Key dest_normalized_key = Helper<T>::normalize(dest_key); @@ -467,10 +389,6 @@ bool Patricia<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { int depth = -1; for ( ; ; ) { Node * const node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } history[++depth] = node; if (node->status() == NODE_LEAF) { break; @@ -480,10 +398,7 @@ bool Patricia<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { } // Count the number of the common prefix bits. Key stored_key; - if (!keys_->get_key(history[depth]->key_id(), &stored_key)) { - // Error. - return false; - } + keys_->get_key(history[depth]->key_id(), &stored_key); const uint64_t count = count_common_prefix_bits(dest_normalized_key, stored_key); if (count == (sizeof(Key) * 8)) { @@ -499,13 +414,7 @@ bool Patricia<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { } Node * const dest_prev_node = history[depth]; Node * const next_nodes = nodes_->get_pointer(header_->next_node_id); - if (!next_nodes) { - return false; - } - if (!keys_->reset(src_key_id, dest_normalized_key)) { - // Error. - return false; - } + keys_->reset(src_key_id, dest_normalized_key); Node *dest_node; Node *dest_sibling_node; if (get_ith_bit(dest_normalized_key, count)) { @@ -560,10 +469,6 @@ void Patricia<T>::create_map(Storage *storage, uint32_t storage_node_id, header_->nodes_storage_node_id = nodes_->storage_node_id(); header_->keys_storage_node_id = keys_->storage_node_id(); Node * const root_node = nodes_->get_pointer(ROOT_NODE_ID); - if (!root_node) { - // TODO - throw LogicError(); - } *root_node = Node::dead_node(); } catch (...) { storage->unlink_node(storage_node_id_); @@ -663,7 +568,7 @@ Patricia<Bytes> *Patricia<Bytes>::create(Storage *storage, std::unique_ptr<Patricia> map(new (std::nothrow) Patricia); if (!map) { GRNXX_ERROR() << "new grnxx::map::Patricia failed"; - return nullptr; + throw MemoryError(); } map->create_map(storage, storage_node_id, options); return map.release(); @@ -674,7 +579,7 @@ Patricia<Bytes> *Patricia<Bytes>::open(Storage *storage, std::unique_ptr<Patricia> map(new (std::nothrow) Patricia); if (!map) { GRNXX_ERROR() << "new grnxx::map::Patricia failed"; - return nullptr; + throw MemoryError(); } map->open_map(storage, storage_node_id); return map.release(); @@ -702,25 +607,19 @@ bool Patricia<Bytes>::get(int64_t key_id, Key *key) { return false; } bool bit; - if (!keys_->get_bit(key_id, &bit)) { - // Error. - return false; - } + keys_->get_bit(key_id, &bit); if (!bit) { // Not found. return false; } - if (!keys_->get_key(key_id, key)) { - // Error. - return false; - } + keys_->get_key(key_id, key); return true; } bool Patricia<Bytes>::unset(int64_t key_id) { Key key; if (!get(key_id, &key)) { - // Not found or error. + // Not found. return false; } const uint64_t bit_size = key.size() * 8; @@ -728,10 +627,6 @@ bool Patricia<Bytes>::unset(int64_t key_id) { Node *prev_node = nullptr; for ( ; ; ) { Node * const node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } switch (node->status()) { case NODE_LEAF: { if (node->key_id() != key_id) { @@ -772,7 +667,7 @@ bool Patricia<Bytes>::reset(int64_t key_id, KeyArg dest_key) { // Find the source key. Key src_key; if (!get(key_id, &src_key)) { - // Not found or error. + // Not found. return false; } const uint64_t src_bit_size = src_key.size() * 8; @@ -782,10 +677,6 @@ bool Patricia<Bytes>::reset(int64_t key_id, KeyArg dest_key) { Node *src_sibling_node = nullptr; for ( ; ; ) { src_node = nodes_->get_pointer(src_node_id); - if (!src_node) { - // Error. - return false; - } if (src_node->status() == NODE_LEAF) { if (src_node->key_id() != key_id) { // Not found. @@ -820,10 +711,6 @@ bool Patricia<Bytes>::reset(int64_t key_id, KeyArg dest_key) { int depth = -1; for ( ; ; ) { Node *node = nodes_->get_pointer(dest_node_id); - if (!node) { - // Error. - return false; - } history[++depth % HISTORY_SIZE] = node; if (node->status() == NODE_LEAF) { break; @@ -843,17 +730,10 @@ bool Patricia<Bytes>::reset(int64_t key_id, KeyArg dest_key) { Node *leaf_node = history[depth % HISTORY_SIZE]; while (leaf_node->status() != NODE_LEAF) { leaf_node = nodes_->get_pointer(leaf_node->offset()); - if (!leaf_node) { - // Error. - return false; - } } // Count the number of the common prefix bits. Key stored_key; - if (!keys_->get_key(leaf_node->key_id(), &stored_key)) { - // Error. - return false; - } + keys_->get_key(leaf_node->key_id(), &stored_key); const uint64_t min_size = (dest_key.size() < stored_key.size()) ? dest_key.size() : stored_key.size(); uint64_t count; @@ -869,13 +749,7 @@ bool Patricia<Bytes>::reset(int64_t key_id, KeyArg dest_key) { } Node * const dest_prev_node = history[depth % HISTORY_SIZE]; Node * const next_nodes = nodes_->get_pointer(header_->next_node_id); - if (!next_nodes) { - return false; - } - if (!keys_->reset(key_id, dest_key)) { - // Error. - return false; - } + keys_->reset(key_id, dest_key); Node *dest_node; Node *dest_sibling_node; if (count == dest_key.size()) { @@ -923,10 +797,6 @@ bool Patricia<Bytes>::reset(int64_t key_id, KeyArg dest_key) { dest_node_id = ROOT_NODE_ID; for ( ; ; ) { dest_prev_node = nodes_->get_pointer(dest_node_id); - if (!dest_prev_node) { - // Error. - return false; - } if (dest_prev_node->status() == NODE_LEAF) { break; } else if (dest_prev_node->status() == NODE_BRANCH) { @@ -944,13 +814,7 @@ bool Patricia<Bytes>::reset(int64_t key_id, KeyArg dest_key) { } } Node * const next_nodes = nodes_->get_pointer(header_->next_node_id); - if (!next_nodes) { - return false; - } - if (!keys_->reset(key_id, dest_key)) { - // Error. - return false; - } + keys_->reset(key_id, dest_key); Node *dest_node; Node *dest_sibling_node; if (get_ith_bit(dest_key, count)) { @@ -978,10 +842,7 @@ bool Patricia<Bytes>::find(KeyArg key, int64_t *key_id) { const uint64_t bit_size = key.size() * 8; uint64_t node_id = ROOT_NODE_ID; Node node; - if (!nodes_->get(node_id, &node)) { - // Error. - return false; - } + nodes_->get(node_id, &node); if (node.status() == NODE_DEAD) { // Not found. return false; @@ -990,10 +851,7 @@ bool Patricia<Bytes>::find(KeyArg key, int64_t *key_id) { switch (node.status()) { case NODE_LEAF: { Key stored_key; - if (!keys_->get_key(node.key_id(), &stored_key)) { - // Error. - return false; - } + keys_->get_key(node.key_id(), &stored_key); if (key != stored_key) { // Not found. return false; @@ -1020,10 +878,7 @@ bool Patricia<Bytes>::find(KeyArg key, int64_t *key_id) { break; } } - if (!nodes_->get(node_id, &node)) { - // Error. - return false; - } + nodes_->get(node_id, &node); } } @@ -1046,17 +901,10 @@ bool Patricia<Bytes>::add(KeyArg key, int64_t *key_id) { // } uint64_t node_id = ROOT_NODE_ID; Node *node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } if (node->status() == NODE_DEAD) { // The patricia is empty. int64_t next_key_id; - if (!keys_->add(key, &next_key_id)) { - // Error. - return false; - } + keys_->add(key, &next_key_id); *node = Node::leaf_node(next_key_id); if (key_id) { *key_id = next_key_id; @@ -1083,27 +931,16 @@ bool Patricia<Bytes>::add(KeyArg key, int64_t *key_id) { node_id = node->offset() + 1; } node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } history[++depth % HISTORY_SIZE] = node; } // Find a leaf node. while (node->status() != NODE_LEAF) { node_id = node->offset(); node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } } // Count the number of the common prefix bits. Key stored_key; - if (!keys_->get_key(node->key_id(), &stored_key)) { - // Error. - return false; - } + keys_->get_key(node->key_id(), &stored_key); const uint64_t min_size = (key.size() < stored_key.size()) ? key.size() : stored_key.size(); uint64_t count; @@ -1125,14 +962,8 @@ bool Patricia<Bytes>::add(KeyArg key, int64_t *key_id) { } node = history[depth % HISTORY_SIZE]; Node * const next_nodes = nodes_->get_pointer(header_->next_node_id); - if (!next_nodes) { - return false; - } int64_t next_key_id; - if (!keys_->add(key, &next_key_id)) { - // Error. - return false; - } + keys_->add(key, &next_key_id); if (count == key.size()) { // "key" is a prefix of "stored_key". next_nodes[0] = Node::leaf_node(next_key_id); @@ -1174,10 +1005,6 @@ bool Patricia<Bytes>::add(KeyArg key, int64_t *key_id) { node_id = ROOT_NODE_ID; for ( ; ; ) { node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } if (node->status() == NODE_LEAF) { break; } else if (node->status() == NODE_BRANCH) { @@ -1194,14 +1021,8 @@ bool Patricia<Bytes>::add(KeyArg key, int64_t *key_id) { } } Node * const next_nodes = nodes_->get_pointer(header_->next_node_id); - if (!next_nodes) { - return false; - } int64_t next_key_id; - if (!keys_->add(key, &next_key_id)) { - // Error. - return false; - } + keys_->add(key, &next_key_id); if (get_ith_bit(key, count)) { next_nodes[0] = *node; next_nodes[1] = Node::leaf_node(next_key_id); @@ -1224,10 +1045,6 @@ bool Patricia<Bytes>::remove(KeyArg key) { const uint64_t bit_size = key.size() * 8; uint64_t node_id = ROOT_NODE_ID; Node *node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } if (node->status() == NODE_DEAD) { // Not found. return false; @@ -1237,10 +1054,7 @@ bool Patricia<Bytes>::remove(KeyArg key) { switch (node->status()) { case NODE_LEAF: { Key stored_key; - if (!keys_->get_key(node->key_id(), &stored_key)) { - // Error. - return false; - } + keys_->get_key(node->key_id(), &stored_key); if (stored_key != key) { // Not found. return false; @@ -1273,10 +1087,6 @@ bool Patricia<Bytes>::remove(KeyArg key) { } prev_node = node; node = nodes_->get_pointer(node_id); - if (!node) { - // Error. - return false; - } } } @@ -1287,10 +1097,6 @@ bool Patricia<Bytes>::replace(KeyArg src_key, KeyArg dest_key, int64_t src_key_id; uint64_t src_node_id = ROOT_NODE_ID; Node *src_node = nodes_->get_pointer(src_node_id); - if (!src_node) { - // Error. - return false; - } if (src_node->status() == NODE_DEAD) { // Not found. return false; @@ -1301,10 +1107,7 @@ bool Patricia<Bytes>::replace(KeyArg src_key, KeyArg dest_key, if (src_node->status() == NODE_LEAF) { src_key_id = src_node->key_id(); Key stored_key; - if (!keys_->get_key(src_key_id, &stored_key)) { - // Error. - return false; - } + keys_->get_key(src_key_id, &stored_key); if (stored_key != src_key) { // Not found. return false; @@ -1333,10 +1136,6 @@ bool Patricia<Bytes>::replace(KeyArg src_key, KeyArg dest_key, } src_prev_node = src_node; src_node = nodes_->get_pointer(src_node_id); - if (!src_node) { - // Error. - return false; - } } // Add the destination key. constexpr std::size_t HISTORY_SIZE = 8; @@ -1346,10 +1145,6 @@ bool Patricia<Bytes>::replace(KeyArg src_key, KeyArg dest_key, int depth = -1; for ( ; ; ) { Node *node = nodes_->get_pointer(dest_node_id); - if (!node) { - // Error. - return false; - } history[++depth % HISTORY_SIZE] = node; if (node->status() == NODE_LEAF) { break; @@ -1369,17 +1164,10 @@ bool Patricia<Bytes>::replace(KeyArg src_key, KeyArg dest_key, Node *leaf_node = history[depth % HISTORY_SIZE]; while (leaf_node->status() != NODE_LEAF) { leaf_node = nodes_->get_pointer(leaf_node->offset()); - if (!leaf_node) { - // Error. - return false; - } } // Count the number of the common prefix bits. Key stored_key; - if (!keys_->get_key(leaf_node->key_id(), &stored_key)) { - // Error. - return false; - } + keys_->get_key(leaf_node->key_id(), &stored_key); const uint64_t min_size = (dest_key.size() < stored_key.size()) ? dest_key.size() : stored_key.size(); uint64_t count; @@ -1395,13 +1183,7 @@ bool Patricia<Bytes>::replace(KeyArg src_key, KeyArg dest_key, } Node * const dest_prev_node = history[depth % HISTORY_SIZE]; Node * const next_nodes = nodes_->get_pointer(header_->next_node_id); - if (!next_nodes) { - return false; - } - if (!keys_->reset(src_key_id, dest_key)) { - // Error. - return false; - } + keys_->reset(src_key_id, dest_key); Node *dest_node; Node *dest_sibling_node; if (count == dest_key.size()) { @@ -1449,10 +1231,6 @@ bool Patricia<Bytes>::replace(KeyArg src_key, KeyArg dest_key, dest_node_id = ROOT_NODE_ID; for ( ; ; ) { dest_prev_node = nodes_->get_pointer(dest_node_id); - if (!dest_prev_node) { - // Error. - return false; - } if (dest_prev_node->status() == NODE_LEAF) { break; } else if (dest_prev_node->status() == NODE_BRANCH) { @@ -1470,13 +1248,7 @@ bool Patricia<Bytes>::replace(KeyArg src_key, KeyArg dest_key, } } Node * const next_nodes = nodes_->get_pointer(header_->next_node_id); - if (!next_nodes) { - return false; - } - if (!keys_->reset(src_key_id, dest_key)) { - // Error. - return false; - } + keys_->reset(src_key_id, dest_key); Node *dest_node; Node *dest_sibling_node; if (get_ith_bit(dest_key, count)) { @@ -1507,10 +1279,7 @@ bool Patricia<Bytes>::find_longest_prefix_match(KeyArg query, int64_t *key_id, uint64_t node_id = ROOT_NODE_ID; for ( ; ; ) { Node node; - if (!nodes_->get(node_id, &node)) { - // Error. - return false; - } + nodes_->get(node_id, &node); switch (node.status()) { case NODE_DEAD: { // Not found. @@ -1518,10 +1287,7 @@ bool Patricia<Bytes>::find_longest_prefix_match(KeyArg query, int64_t *key_id, } case NODE_LEAF: { Key stored_key; - if (!keys_->get_key(node.key_id(), &stored_key)) { - // Error. - return false; - } + keys_->get_key(node.key_id(), &stored_key); if (query.starts_with(stored_key)) { if (key_id) { *key_id = node.key_id(); @@ -1545,15 +1311,9 @@ bool Patricia<Bytes>::find_longest_prefix_match(KeyArg query, int64_t *key_id, return found; } else if (node.bit_size() < bit_size) { Node leaf_node; - if (!nodes_->get(node.offset(), &leaf_node)) { - // Error. - return false; - } + nodes_->get(node.offset(), &leaf_node); Key stored_key; - if (!keys_->get_key(leaf_node.key_id(), &stored_key)) { - // Error. - return false; - } + keys_->get_key(leaf_node.key_id(), &stored_key); if (query.starts_with(stored_key)) { if (key_id) { *key_id = leaf_node.key_id(); @@ -1573,12 +1333,7 @@ bool Patricia<Bytes>::find_longest_prefix_match(KeyArg query, int64_t *key_id, bool Patricia<Bytes>::truncate() { Node * const root_node = nodes_->get_pointer(ROOT_NODE_ID); - if (!root_node) { - return false; - } - if (!keys_->truncate()) { - return false; - } + keys_->truncate(); *root_node = Node::dead_node(); return true; } @@ -1599,10 +1354,6 @@ void Patricia<Bytes>::create_map(Storage *storage, uint32_t storage_node_id, header_->keys_storage_node_id = keys_->storage_node_id(); header_->cache_storage_node_id = cache_->storage_node_id(); Node * const root_node = nodes_->get_pointer(ROOT_NODE_ID); - if (!root_node) { - // TODO - throw LogicError(); - } *root_node = Node::dead_node(); } catch (...) { storage->unlink_node(storage_node_id_); Modified: test/test_map.cpp (+0 -83) =================================================================== --- test/test_map.cpp 2013-07-04 10:38:22 +0900 (e235638) +++ test/test_map.cpp 2013-07-04 11:34:33 +0900 (9d2b602) @@ -146,7 +146,6 @@ void test_bytes_store_create() { std::unique_ptr<grnxx::map::BytesStore> store( grnxx::map::BytesStore::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(store); } void test_bytes_store_open() { @@ -154,10 +153,8 @@ void test_bytes_store_open() { std::unique_ptr<grnxx::map::BytesStore> store( grnxx::map::BytesStore::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(store); const std::uint32_t storage_node_id = store->storage_node_id(); store.reset(grnxx::map::BytesStore::open(storage.get(), storage_node_id)); - assert(store); } void test_bytes_store_unlink() { @@ -165,10 +162,8 @@ void test_bytes_store_unlink() { std::unique_ptr<grnxx::map::BytesStore> store( grnxx::map::BytesStore::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(store); grnxx::StorageNode storage_node = storage->open_node(store->storage_node_id()); - assert(storage_node); assert(grnxx::map::BytesStore::unlink(storage.get(), storage_node.id())); assert(storage_node.status() == grnxx::STORAGE_NODE_UNLINKED); } @@ -178,10 +173,8 @@ void test_bytes_store_storage_node_id() { std::unique_ptr<grnxx::map::BytesStore> store( grnxx::map::BytesStore::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(store); grnxx::StorageNode storage_node = storage->open_node(store->storage_node_id()); - assert(storage_node); assert(storage_node.status() == grnxx::STORAGE_NODE_ACTIVE); } @@ -190,7 +183,6 @@ void test_bytes_store_get() { std::unique_ptr<grnxx::map::BytesStore> store( grnxx::map::BytesStore::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(store); std::vector<grnxx::Bytes> keys; std::vector<std::uint64_t> key_ids; generate_random_keys(BYTES_STORE_NUM_KEYS, &keys); @@ -215,7 +207,6 @@ void test_bytes_store_unset() { std::unique_ptr<grnxx::map::BytesStore> store( grnxx::map::BytesStore::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(store); std::vector<grnxx::Bytes> keys; std::vector<std::uint64_t> key_ids; generate_random_keys(BYTES_STORE_NUM_KEYS, &keys); @@ -240,7 +231,6 @@ void test_bytes_store_add() { std::unique_ptr<grnxx::map::BytesStore> store( grnxx::map::BytesStore::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(store); std::vector<grnxx::Bytes> keys; generate_random_keys(BYTES_STORE_NUM_KEYS, &keys); @@ -255,7 +245,6 @@ void test_bytes_store_sweep() { std::unique_ptr<grnxx::map::BytesStore> store( grnxx::map::BytesStore::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(store); std::vector<grnxx::Bytes> keys; std::vector<std::uint64_t> key_ids; generate_random_keys(BYTES_STORE_NUM_KEYS, &keys); @@ -282,7 +271,6 @@ void test_bytes_array_create() { std::unique_ptr<grnxx::map::BytesArray> array( grnxx::map::BytesArray::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(array); } void test_bytes_array_create_with_default_value() { @@ -291,7 +279,6 @@ void test_bytes_array_create_with_default_value() { grnxx::map::BytesArray::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, "Default")); - assert(array); } void test_bytes_array_open() { @@ -299,10 +286,8 @@ void test_bytes_array_open() { std::unique_ptr<grnxx::map::BytesArray> array( grnxx::map::BytesArray::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(array); const std::uint32_t storage_node_id = array->storage_node_id(); array.reset(grnxx::map::BytesArray::open(storage.get(), storage_node_id)); - assert(array); } void test_bytes_array_unlink() { @@ -310,10 +295,8 @@ void test_bytes_array_unlink() { std::unique_ptr<grnxx::map::BytesArray> array( grnxx::map::BytesArray::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(array); grnxx::StorageNode storage_node = storage->open_node(array->storage_node_id()); - assert(storage_node); assert(grnxx::map::BytesArray::unlink(storage.get(), storage_node.id())); assert(storage_node.status() == grnxx::STORAGE_NODE_UNLINKED); } @@ -323,10 +306,8 @@ void test_bytes_array_storage_node_id() { std::unique_ptr<grnxx::map::BytesArray> array( grnxx::map::BytesArray::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(array); grnxx::StorageNode storage_node = storage->open_node(array->storage_node_id()); - assert(storage_node); assert(storage_node.status() == grnxx::STORAGE_NODE_ACTIVE); } @@ -335,7 +316,6 @@ void test_bytes_array_get() { std::unique_ptr<grnxx::map::BytesArray> array( grnxx::map::BytesArray::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(array); std::vector<grnxx::Bytes> keys; generate_random_keys(MAP_NUM_KEYS, &keys); for (std::uint64_t i = 0; i < MAP_NUM_KEYS; ++i) { @@ -353,7 +333,6 @@ void test_bytes_array_set() { std::unique_ptr<grnxx::map::BytesArray> array( grnxx::map::BytesArray::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID)); - assert(array); std::vector<grnxx::Bytes> keys; generate_random_keys(MAP_NUM_KEYS, &keys); for (std::uint64_t i = 0; i < MAP_NUM_KEYS; ++i) { @@ -367,7 +346,6 @@ void test_map_create(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); } template <typename T> @@ -376,10 +354,8 @@ void test_map_open(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); const std::uint32_t storage_node_id = map->storage_node_id(); map.reset(grnxx::Map<T>::open(storage.get(), storage_node_id)); - assert(map); } template <typename T> @@ -388,9 +364,7 @@ void test_map_unlink(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); grnxx::StorageNode storage_node = storage->open_node(map->storage_node_id()); - assert(storage_node); assert(grnxx::Map<T>::unlink(storage.get(), storage_node.id())); assert(storage_node.status() == grnxx::STORAGE_NODE_UNLINKED); } @@ -401,7 +375,6 @@ void test_map_type(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); assert(map->type() == map_type); } @@ -411,9 +384,7 @@ void test_map_storage_node_id(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); grnxx::StorageNode storage_node = storage->open_node(map->storage_node_id()); - assert(storage_node); assert(storage_node.status() == grnxx::STORAGE_NODE_ACTIVE); } @@ -423,7 +394,6 @@ void test_map_min_key_id(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); assert(map->min_key_id() == grnxx::MAP_MIN_KEY_ID); assert(map->add(generate_random_key<T>())); assert(map->min_key_id() == grnxx::MAP_MIN_KEY_ID); @@ -437,7 +407,6 @@ void test_map_max_key_id(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); assert(map->max_key_id() == (grnxx::MAP_MIN_KEY_ID - 1)); assert(map->add(generate_random_key<T>())); assert(map->max_key_id() == grnxx::MAP_MIN_KEY_ID); @@ -451,7 +420,6 @@ void test_map_num_keys(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); assert(map->num_keys() == 0); assert(map->add(generate_random_key<T>())); assert(map->num_keys() == 1); @@ -465,7 +433,6 @@ void test_map_get(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); std::vector<T> keys; generate_random_keys(MAP_NUM_KEYS, &keys); @@ -487,7 +454,6 @@ void test_map_get_next(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); std::int64_t key_id; std::vector<T> keys; generate_random_keys(MAP_NUM_KEYS, &keys); @@ -524,7 +490,6 @@ void test_map_unset(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); std::vector<T> keys; generate_random_keys(MAP_NUM_KEYS, &keys); @@ -545,7 +510,6 @@ void test_map_reset(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); std::vector<T> keys; generate_random_keys(MAP_NUM_KEYS, &keys); @@ -570,7 +534,6 @@ void test_map_find(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); std::vector<T> keys; generate_random_keys(MAP_NUM_KEYS, &keys); @@ -591,7 +554,6 @@ void test_map_add(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); std::vector<T> keys; generate_random_keys(MAP_NUM_KEYS, &keys); @@ -609,7 +571,6 @@ void test_map_remove(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); std::vector<T> keys; generate_random_keys(MAP_NUM_KEYS, &keys); @@ -630,7 +591,6 @@ void test_map_replace(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); std::vector<T> keys; generate_random_keys(MAP_NUM_KEYS, &keys); @@ -662,7 +622,6 @@ void test_map_find_longest_prefix_match<grnxx::Bytes>(grnxx::MapType map_type) { grnxx::Map<grnxx::Bytes>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); std::vector<grnxx::Bytes> keys; generate_random_keys(MAP_NUM_KEYS, &keys); @@ -684,7 +643,6 @@ void test_map_truncate(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); std::vector<T> keys; generate_random_keys(MAP_NUM_KEYS, &keys); @@ -709,7 +667,6 @@ void test_map_all_keys(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); map->all_keys(); } @@ -720,7 +677,6 @@ void test_map_key_id(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); constexpr std::int64_t min = 10; constexpr std::int64_t max = 100; @@ -751,7 +707,6 @@ void test_map_key(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); const T min = generate_random_key<T>(); const T max = generate_random_key<T>(); @@ -782,11 +737,9 @@ void test_map_create_all_keys_cursor(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); std::unique_ptr<grnxx::MapCursor<T>> cursor; cursor.reset(map->create_cursor(map->all_keys())); - assert(cursor); } template <typename T> @@ -795,54 +748,37 @@ void test_map_create_key_id_range_cursor(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); constexpr std::int64_t min = 10; constexpr std::int64_t max = 100; std::unique_ptr<grnxx::MapCursor<T>> cursor; cursor.reset(map->create_cursor(map->key_id() > min)); - assert(cursor); cursor.reset(map->create_cursor(map->key_id() >= min)); - assert(cursor); cursor.reset(map->create_cursor(map->key_id() < max)); - assert(cursor); cursor.reset(map->create_cursor(map->key_id() <= max)); - assert(cursor); cursor.reset(map->create_cursor(min < map->key_id())); - assert(cursor); cursor.reset(map->create_cursor(min <= map->key_id())); - assert(cursor); cursor.reset(map->create_cursor(max > map->key_id())); - assert(cursor); cursor.reset(map->create_cursor(max >= map->key_id())); - assert(cursor); cursor.reset(map->create_cursor( (map->key_id() > min) && (map->key_id() < max))); - assert(cursor); cursor.reset(map->create_cursor( (map->key_id() > min) && (map->key_id() <= max))); - assert(cursor); cursor.reset(map->create_cursor( (map->key_id() >= min) && (map->key_id() < max))); - assert(cursor); cursor.reset(map->create_cursor( (map->key_id() >= min) && (map->key_id() <= max))); - assert(cursor); cursor.reset(map->create_cursor( (map->key_id() < max) && (map->key_id() > min))); - assert(cursor); cursor.reset(map->create_cursor( (map->key_id() <= max) && (map->key_id() > min))); - assert(cursor); cursor.reset(map->create_cursor( (map->key_id() < max) && (map->key_id() >= min))); - assert(cursor); cursor.reset(map->create_cursor( (map->key_id() <= max) && (map->key_id() >= min))); - assert(cursor); } template <typename T> @@ -851,54 +787,37 @@ void test_map_create_key_range_cursor(grnxx::MapType map_type) { std::unique_ptr<grnxx::Map<T>> map( grnxx::Map<T>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); const T min = generate_random_key<T>(); const T max = generate_random_key<T>(); std::unique_ptr<grnxx::MapCursor<T>> cursor; cursor.reset(map->create_cursor(map->key() > min)); - assert(cursor); cursor.reset(map->create_cursor(map->key() >= min)); - assert(cursor); cursor.reset(map->create_cursor(map->key() < max)); - assert(cursor); cursor.reset(map->create_cursor(map->key() <= max)); - assert(cursor); cursor.reset(map->create_cursor(min < map->key())); - assert(cursor); cursor.reset(map->create_cursor(min <= map->key())); - assert(cursor); cursor.reset(map->create_cursor(max > map->key())); - assert(cursor); cursor.reset(map->create_cursor(max >= map->key())); - assert(cursor); cursor.reset(map->create_cursor( (map->key() > min) && (map->key() < max))); - assert(cursor); cursor.reset(map->create_cursor( (map->key() > min) && (map->key() <= max))); - assert(cursor); cursor.reset(map->create_cursor( (map->key() >= min) && (map->key() < max))); - assert(cursor); cursor.reset(map->create_cursor( (map->key() >= min) && (map->key() <= max))); - assert(cursor); cursor.reset(map->create_cursor( (map->key() < max) && (map->key() > min))); - assert(cursor); cursor.reset(map->create_cursor( (map->key() <= max) && (map->key() > min))); - assert(cursor); cursor.reset(map->create_cursor( (map->key() < max) && (map->key() >= min))); - assert(cursor); cursor.reset(map->create_cursor( (map->key() <= max) && (map->key() >= min))); - assert(cursor); } template <> @@ -918,12 +837,10 @@ void test_map_create_scanner<grnxx::Bytes>(grnxx::MapType map_type) { grnxx::Map<grnxx::Bytes>::create(storage.get(), grnxx::STORAGE_ROOT_NODE_ID, map_type)); - assert(map); const grnxx::Bytes text = generate_random_text<grnxx::Bytes>(); std::unique_ptr<grnxx::MapScanner<grnxx::Bytes>> scanner; scanner.reset(map->create_scanner(text)); - assert(scanner); } template <typename T>