susumu.yata
null+****@clear*****
Thu Jul 4 10:38:22 JST 2013
susumu.yata 2013-07-04 10:38:22 +0900 (Thu, 04 Jul 2013) New Revision: 2aa120131adf9572d266b4ac1a720f34eb7c7f4f https://github.com/groonga/grnxx/commit/2aa120131adf9572d266b4ac1a720f34eb7c7f4f Message: Use grnxx::Exception for error hangling and fix a bug. Modified files: lib/grnxx/map/bytes_store.cpp Modified: lib/grnxx/map/bytes_store.cpp (+19 -63) =================================================================== --- lib/grnxx/map/bytes_store.cpp 2013-07-04 10:23:43 +0900 (bb8ee4f) +++ lib/grnxx/map/bytes_store.cpp 2013-07-04 10:38:22 +0900 (22c5462) @@ -161,10 +161,10 @@ class BytesStoreImpl : public BytesStore { void create_store(Storage *storage, uint32_t storage_node_id); void open_store(Storage *storage, uint32_t storage_node_id); - bool reserve_active_page(uint32_t *page_id, + void reserve_active_page(uint32_t *page_id, BytesStorePageHeader **page_header); - bool make_page_empty(uint32_t page_id, BytesStorePageHeader *page_header); - bool make_page_idle(uint32_t page_id, BytesStorePageHeader *page_header); + void make_page_empty(uint32_t page_id, BytesStorePageHeader *page_header); + void make_page_idle(uint32_t page_id, BytesStorePageHeader *page_header); static uint64_t get_bytes_id(uint64_t offset, uint32_t size) { return (offset << BYTES_STORE_OFFSET_SHIFT) | size; @@ -236,12 +236,9 @@ bool BytesStoreImpl::get(uint64_t bytes_id, Value *bytes) { << ", page_id = " << page_id << ", max_size = " << BYTES_STORE_MAX_SIZE << ", max_page_id = " << header_->max_page_id; - return false; + throw LogicError(); } const uint8_t * const page = pages_->get_page(page_id); - if (!page) { - return false; - } if (bytes) { const uint32_t offset_in_page = get_offset_in_page(offset); *bytes = Value(&page[offset_in_page], size); @@ -259,23 +256,20 @@ bool BytesStoreImpl::unset(uint64_t bytes_id) { << ", page_id = " << page_id << ", max_size = " << BYTES_STORE_MAX_SIZE << ", max_page_id = " << header_->max_page_id; - return false; + throw LogicError(); } BytesStorePageHeader * const page_header = page_headers_->get_pointer(page_id); - if (!page_header) { - return false; - } if ((page_header->status != BYTES_STORE_PAGE_ACTIVE) && (page_header->status != BYTES_STORE_PAGE_IN_USE)) { GRNXX_ERROR() << "invalid argument: page_id = " << page_id << ", status = " << page_header->status; - return false; + throw LogicError(); } if (size > page_header->size_in_use) { GRNXX_ERROR() << "invalid argument: size = " << size << ", size_in_use = " << page_header->size_in_use; - return false; + throw LogicError(); } if ((page_header->status == BYTES_STORE_PAGE_ACTIVE) || (size < page_header->size_in_use)) { @@ -283,9 +277,7 @@ bool BytesStoreImpl::unset(uint64_t bytes_id) { page_header->size_in_use -= size; } else { // This operation makes the page EMPTY. - if (!make_page_empty(page_id, page_header)) { - return false; - } + make_page_empty(page_id, page_header); } return true; } @@ -293,30 +285,23 @@ bool BytesStoreImpl::unset(uint64_t bytes_id) { bool BytesStoreImpl::add(ValueArg bytes, uint64_t *bytes_id) { if (bytes.size() > BYTES_STORE_MAX_SIZE) { GRNXX_ERROR() << "invalid argument: size = " << bytes.size(); - return false; + throw LogicError(); } uint64_t offset = header_->next_offset; uint32_t size = static_cast<uint32_t>(bytes.size()); uint32_t page_id = get_page_id(offset); BytesStorePageHeader *page_header = page_headers_->get_pointer(page_id); - if (!page_header) { - return false; - } uint32_t offset_in_page = get_offset_in_page(offset); const uint32_t size_left = BYTES_STORE_PAGE_SIZE - offset_in_page; if (size >= size_left) { uint32_t next_page_id; BytesStorePageHeader *next_page_header; - if (!reserve_active_page(&next_page_id, &next_page_header)) { - return false; - } + reserve_active_page(&next_page_id, &next_page_header); if (size > size_left) { // Skip the remaining space of the previous ACTIVE page. if (page_header->size_in_use == 0) { // Change the page status from ACTIVE to EMPTY. - if (!make_page_empty(page_id, page_header)) { - return false; - } + make_page_empty(page_id, page_header); } else { // Change the page status from ACTIVE to IN_USE. page_header->status = BYTES_STORE_PAGE_IN_USE; @@ -336,9 +321,6 @@ bool BytesStoreImpl::add(ValueArg bytes, uint64_t *bytes_id) { } } uint8_t * const page = pages_->get_page(page_id); - if (!page) { - return false; - } std::memcpy(page + offset_in_page, bytes.data(), size); *bytes_id = get_bytes_id(offset, size); page_header->size_in_use += size; @@ -355,22 +337,16 @@ bool BytesStoreImpl::sweep(Duration lifetime) { } BytesStorePageHeader * const latest_empty_page_header = page_headers_->get_pointer(header_->latest_empty_page_id); - if (!latest_empty_page_header) { - return false; - } const Time threshold = clock_.now() - lifetime; do { const uint32_t oldest_empty_page_id = latest_empty_page_header->next_page_id; BytesStorePageHeader * const oldest_empty_page_header = page_headers_->get_pointer(oldest_empty_page_id); - if (!oldest_empty_page_header) { - return false; - } if (oldest_empty_page_header->status != BYTES_STORE_PAGE_EMPTY) { GRNXX_ERROR() << "status conflict: status = " << oldest_empty_page_header->status; - return false; + throw LogicError(); } if (oldest_empty_page_header->modified_time > threshold) { // The remaining empty pages are not ready. @@ -378,9 +354,7 @@ bool BytesStoreImpl::sweep(Duration lifetime) { } const uint32_t next_oldest_empty_page_id = oldest_empty_page_header->next_page_id; - if (!make_page_idle(oldest_empty_page_id, oldest_empty_page_header)) { - return false; - } + make_page_idle(oldest_empty_page_id, oldest_empty_page_header); if (oldest_empty_page_header != latest_empty_page_header) { latest_empty_page_header->next_page_id = next_oldest_empty_page_id; } else { @@ -418,7 +392,7 @@ void BytesStoreImpl::open_store(Storage *storage, uint32_t storage_node_id) { PageHeaderArray::open(storage, header_->page_headers_storage_node_id)); } -bool BytesStoreImpl::reserve_active_page(uint32_t *page_id, +void BytesStoreImpl::reserve_active_page(uint32_t *page_id, BytesStorePageHeader **page_header) { BytesStorePageHeader *latest_idle_page_header = nullptr; uint32_t next_page_id; @@ -426,9 +400,6 @@ bool BytesStoreImpl::reserve_active_page(uint32_t *page_id, // Use the oldest IDLE page. latest_idle_page_header = page_headers_->get_pointer(header_->latest_idle_page_id); - if (!latest_idle_page_header) { - return false; - } next_page_id = latest_idle_page_header->next_page_id; } else { // Create a new page. @@ -436,14 +407,11 @@ bool BytesStoreImpl::reserve_active_page(uint32_t *page_id, if (next_page_id > BYTES_STORE_MAX_PAGE_ID) { GRNXX_ERROR() << "too many pages: next_page_id = " << next_page_id << ", max_page_id = " << BYTES_STORE_MAX_PAGE_ID; - return false; + throw LogicError(); } } BytesStorePageHeader * const next_page_header = page_headers_->get_pointer(next_page_id); - if (!next_page_header) { - return false; - } if (latest_idle_page_header) { if (next_page_id != header_->latest_idle_page_id) { latest_idle_page_header->next_page_id = next_page_header->next_page_id; @@ -457,18 +425,14 @@ bool BytesStoreImpl::reserve_active_page(uint32_t *page_id, next_page_header->modified_time = clock_.now(); *page_id = next_page_id; *page_header = next_page_header; - return true; } -bool BytesStoreImpl::make_page_empty(uint32_t page_id, +void BytesStoreImpl::make_page_empty(uint32_t page_id, BytesStorePageHeader *page_header) { BytesStorePageHeader *latest_empty_page_header = nullptr; if (header_->latest_empty_page_id != BYTES_STORE_INVALID_PAGE_ID) { latest_empty_page_header = page_headers_->get_pointer(header_->latest_empty_page_id); - if (!latest_empty_page_header) { - return false; - } } page_header->status = BYTES_STORE_PAGE_EMPTY; if (latest_empty_page_header) { @@ -479,18 +443,14 @@ bool BytesStoreImpl::make_page_empty(uint32_t page_id, } page_header->modified_time = clock_.now(); header_->latest_empty_page_id = page_id; - return true; } -bool BytesStoreImpl::make_page_idle(uint32_t page_id, +void BytesStoreImpl::make_page_idle(uint32_t page_id, BytesStorePageHeader *page_header) { BytesStorePageHeader *latest_idle_page_header = nullptr; if (header_->latest_idle_page_id != BYTES_STORE_INVALID_PAGE_ID) { - BytesStorePageHeader * const latest_idle_page_header = + latest_idle_page_header = page_headers_->get_pointer(header_->latest_idle_page_id); - if (!latest_idle_page_header) { - return false; - } } page_header->status = BYTES_STORE_PAGE_IDLE; if (latest_idle_page_header) { @@ -501,7 +461,6 @@ bool BytesStoreImpl::make_page_idle(uint32_t page_id, } page_header->modified_time = clock_.now(); header_->latest_idle_page_id = page_id; - return true; } } // namespace @@ -520,13 +479,10 @@ BytesStore *BytesStore::open(Storage *storage, uint32_t storage_node_id) { bool BytesStore::unlink(Storage *storage, uint32_t storage_node_id) { if (!storage) { GRNXX_ERROR() << "invalid argument: storage == nullptr"; - return nullptr; + throw LogicError(); } std::unique_ptr<BytesStore> store( BytesStore::open(storage, storage_node_id)); - if (!store) { - return false; - } return storage->unlink_node(storage_node_id); } -------------- next part -------------- HTML����������������������������...Download