[Groonga-commit] groonga/grnxx at 0fb6797 [master] Add reserve_phantom_node() and implement divide_idle_node().

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index