[Groonga-commit] groonga/groonga [master] grn_ii_buffer: support rollback operation.

Back to archive index

null+****@clear***** null+****@clear*****
2012年 2月 23日 (木) 19:47:06 JST


Daijiro MORI	2012-02-23 19:47:06 +0900 (Thu, 23 Feb 2012)

  New Revision: 742399e93a249668c94a5dc7fd53586c87b99431

  Log:
    grn_ii_buffer: support rollback operation.

  Modified files:
    lib/ii.c

  Modified: lib/ii.c (+37 -12)
===================================================================
--- lib/ii.c    2012-02-23 19:48:40 +0900 (7ccdf63)
+++ lib/ii.c    2012-02-23 19:47:06 +0900 (84b1b7a)
@@ -7085,6 +7085,11 @@ grn_ii_buffer_open(grn_ctx *ctx, grn_ii *ii, uint64_t update_buffer_size)
       ii_buffer->update_buffer_size = update_buffer_size;
       ii_buffer->counters = GRN_CALLOC(ii_buffer->ncounters *
                                        sizeof(ii_buffer_counter));
+      ii_buffer->term_buffer = NULL;
+      ii_buffer->packed_buf = NULL;
+      ii_buffer->packed_len = 0;
+      ii_buffer->packed_buf_size = 0;
+      ii_buffer->total_chunk_size = 0;
       if (ii_buffer->counters) {
         ii_buffer->block_buf = GRN_MALLOCN(grn_id, II_BUFFER_BLOCK_SIZE);
         if (ii_buffer->block_buf) {
@@ -7099,7 +7104,7 @@ grn_ii_buffer_open(grn_ctx *ctx, grn_ii *ii, uint64_t update_buffer_size)
           ii_buffer->tmpfd = mkostemp(ii_buffer->tmpfpath,
                                       O_WRONLY|O_CREAT|O_TRUNC);
 #endif /* WIN32 */
-          if (ii_buffer->tmpfd) {
+          if (ii_buffer->tmpfd != -1) {
             grn_obj_flags flags;
             grn_table_get_info(ctx, ii->lexicon, &flags, NULL, NULL);
             if (flags & GRN_OBJ_TABLE_PAT_KEY) {
@@ -7108,7 +7113,7 @@ grn_ii_buffer_open(grn_ctx *ctx, grn_ii *ii, uint64_t update_buffer_size)
             }
             return ii_buffer;
           } else {
-            ERR(GRN_INVALID_ARGUMENT, "temporary file open failed");
+            SERR("mkostemp");
           }
           GRN_FREE(ii_buffer->block_buf);
         }
@@ -7136,10 +7141,17 @@ grn_ii_buffer_commit(grn_ctx *ctx, grn_ii_buffer *ii_buffer)
   if (ii_buffer->block_pos) {
     grn_ii_buffer_flush(ctx, ii_buffer);
   }
-
-  close(ii_buffer->tmpfd);
-  GRN_FREE(ii_buffer->block_buf);
-  GRN_FREE(ii_buffer->counters);
+  if (ii_buffer->tmpfd != -1) {
+    close(ii_buffer->tmpfd);
+  }
+  if (ii_buffer->block_buf) {
+    GRN_FREE(ii_buffer->block_buf);
+    ii_buffer->block_buf = NULL;
+  }
+  if (ii_buffer->counters) {
+    GRN_FREE(ii_buffer->counters);
+    ii_buffer->counters = NULL;
+  }
 
   if (ii_buffer->update_buffer_size &&
       ii_buffer->update_buffer_size < 20) {
@@ -7155,17 +7167,16 @@ grn_ii_buffer_commit(grn_ctx *ctx, grn_ii_buffer *ii_buffer)
   GRN_LOG(ctx, GRN_LOG_NOTICE, "nblocks=%d, update_buffer_size=%zu",
           ii_buffer->nblocks, ii_buffer->update_buffer_size);
 
-  ii_buffer->term_buffer = NULL;
-  ii_buffer->packed_buf = NULL;
-  ii_buffer->packed_len = 0;
-  ii_buffer->packed_buf_size = 0;
-  ii_buffer->total_chunk_size = 0;
+  datavec_init(ctx, ii_buffer->data_vectors, ii_buffer->ii->n_elements, 0, 0);
 #ifdef WIN32
   ii_buffer->tmpfd = open(ii_buffer->tmpfpath, O_RDONLY|O_BINARY);
 #else /* WIN32 */
   ii_buffer->tmpfd = open(ii_buffer->tmpfpath, O_RDONLY);
 #endif /* WIN32 */
-  datavec_init(ctx, ii_buffer->data_vectors, ii_buffer->ii->n_elements, 0, 0);
+  if (ii_buffer->tmpfd == -1) {
+    SERR("oepn");
+    return ctx->rc;
+  }
   {
     uint32_t i;
     for (i = 0; i < ii_buffer->nblocks; i++) {
@@ -7204,6 +7215,7 @@ grn_ii_buffer_commit(grn_ctx *ctx, grn_ii_buffer *ii_buffer)
           ii_buffer->filepos, ii_buffer->total_chunk_size);
   close(ii_buffer->tmpfd);
   unlink(ii_buffer->tmpfpath);
+  ii_buffer->tmpfd = -1;
   return ctx->rc;
 }
 
@@ -7216,6 +7228,19 @@ grn_ii_buffer_close(grn_ctx *ctx, grn_ii_buffer *ii_buffer)
   if (flags & GRN_OBJ_TABLE_PAT_KEY) {
     grn_pat_cache_disable(ctx, (grn_pat *)ii_buffer->ii->lexicon);
   }
+  if (ii_buffer->tmp_lexicon) {
+    grn_obj_close(ctx, ii_buffer->tmp_lexicon);
+  }
+  if (ii_buffer->tmpfd != -1) {
+    close(ii_buffer->tmpfd);
+    unlink(ii_buffer->tmpfpath);
+  }
+  if (ii_buffer->block_buf) {
+    GRN_FREE(ii_buffer->block_buf);
+  }
+  if (ii_buffer->counters) {
+    GRN_FREE(ii_buffer->counters);
+  }
   if (ii_buffer->blocks) {
     for (i = 0; i < ii_buffer->nblocks; i++) {
       if (ii_buffer->blocks[i].buffer) {




Groonga-commit メーリングリストの案内
Back to archive index