susumu.yata
null+****@clear*****
Sun Apr 28 10:38:53 JST 2013
susumu.yata 2013-04-28 10:38:53 +0900 (Sun, 28 Apr 2013) New Revision: 0fb6797f7149ace09bccb1fc02b469b1bd409a74 https://github.com/groonga/grnxx/commit/0fb6797f7149ace09bccb1fc02b469b1bd409a74 Message: Add reserve_phantom_node() and implement divide_idle_node(). Modified files: lib/grnxx/storage/storage_impl.cpp lib/grnxx/storage/storage_impl.hpp Modified: lib/grnxx/storage/storage_impl.cpp (+28 -9) =================================================================== --- lib/grnxx/storage/storage_impl.cpp 2013-04-28 01:43:19 +0900 (781b539) +++ lib/grnxx/storage/storage_impl.cpp 2013-04-28 10:38:53 +0900 (aea8875) @@ -403,13 +403,7 @@ NodeHeader *StorageImpl::find_idle_node(uint64_t size) { } NodeHeader *StorageImpl::create_idle_node(uint64_t size) { - // Reserve a phantom node. - NodeHeader *node_header; - if (header_->latest_phantom_node_id != STORAGE_INVALID_NODE_ID) { - node_header = get_node_header(header_->latest_phantom_node_id); - } else { - node_header = create_phantom_node(); - } + NodeHeader * const node_header = reserve_phantom_node(); if (!node_header) { return nullptr; } @@ -436,8 +430,25 @@ NodeHeader *StorageImpl::create_idle_node(uint64_t size) { } bool StorageImpl::divide_idle_node(NodeHeader *node_header, uint64_t size) { - // TODO: Divide the node into nodes of "size" bytes and the remaining. - return false; + NodeHeader * const second_node_header = reserve_phantom_node(); + if (!second_node_header) { + return false; + } + second_node_header->status = STORAGE_NODE_IDLE; + second_node_header->chunk_id = node_header->chunk_id; + second_node_header->offset = node_header->offset + size; + second_node_header->size = node_header->size - size; + second_node_header->modified_time = clock_.now(); + if (!unregister_idle_node(node_header)) { + return false; + } + node_header->size = size; + second_node_header->modified_time = clock_.now(); + if (!register_idle_node(node_header) || + !register_idle_node(second_node_header)) { + return false; + } + return true; } bool StorageImpl::activate_idle_node(NodeHeader *node_header) { @@ -451,6 +462,14 @@ bool StorageImpl::activate_idle_node(NodeHeader *node_header) { return true; } +NodeHeader *StorageImpl::reserve_phantom_node() { + if (header_->latest_phantom_node_id != STORAGE_INVALID_NODE_ID) { + return get_node_header(header_->latest_phantom_node_id); + } else { + return create_phantom_node(); + } +} + NodeHeader *StorageImpl::create_phantom_node() { const uint32_t node_id = header_->num_nodes; ChunkIndex *remainder_chunk_index = nullptr; Modified: lib/grnxx/storage/storage_impl.hpp (+1 -0) =================================================================== --- lib/grnxx/storage/storage_impl.hpp 2013-04-28 01:43:19 +0900 (0df6537) +++ lib/grnxx/storage/storage_impl.hpp 2013-04-28 10:38:53 +0900 (9b2ff61) @@ -86,6 +86,7 @@ class StorageImpl : public Storage { NodeHeader *create_idle_node(uint64_t size); bool divide_idle_node(NodeHeader *node_header, uint64_t size); bool activate_idle_node(NodeHeader *node_header); + NodeHeader *reserve_phantom_node(); NodeHeader *create_phantom_node(); bool associate_node_with_chunk(NodeHeader *node_header, ChunkIndex *chunk_index); -------------- next part -------------- HTML����������������������������...Download