[Groonga-commit] groonga/groonga at 69aeabf [master] ii: fix too much chunk free

Back to archive index
Kouhei Sutou null+****@clear*****
Thu Mar 28 10:21:38 JST 2019


Kouhei Sutou	2019-03-28 10:21:38 +0900 (Thu, 28 Mar 2019)

  Revision: 69aeabf445601e7a7209ee4b8dbb7a01e22909ab
  https://github.com/groonga/groonga/commit/69aeabf445601e7a7209ee4b8dbb7a01e22909ab

  Message:
    ii: fix too much chunk free
    
    We should not free using chunk.

  Modified files:
    lib/ii.c

  Modified: lib/ii.c (+24 -9)
===================================================================
--- lib/ii.c    2019-03-27 13:17:47 +0900 (98498148d)
+++ lib/ii.c    2019-03-28 10:21:38 +0900 (24b4e5582)
@@ -4488,8 +4488,12 @@ buffer_flush(grn_ctx *ctx, grn_ii *ii, uint32_t seg, grn_hash *h)
         buffer_merge(ctx, ii, seg, h, sb, sc, db, &dc);
         if (ctx->rc == GRN_SUCCESS) {
           const uint32_t actual_chunk_size = db->header.chunk_size;
+          bool need_chunk_free = true;
           if (actual_chunk_size > 0) {
             chunk_new(ctx, ii, &dcn, actual_chunk_size);
+            if (ctx->rc == GRN_SUCCESS) {
+              need_chunk_free = true;
+            }
           }
           if (ctx->rc == GRN_SUCCESS) {
             grn_rc rc;
@@ -4501,6 +4505,7 @@ buffer_flush(grn_ctx *ctx, grn_ii *ii, uint32_t seg, grn_hash *h)
               dc = NULL;
               buffer_segment_update(ii, seg, ds);
               ii->header->total_chunk_size += actual_chunk_size;
+              need_chunk_free = false;
               if (scn != GRN_II_PSEG_NOT_ASSIGNED) {
                 chunk_free(ctx, ii, scn, 0, sb->header.chunk_size);
                 ii->header->total_chunk_size -= sb->header.chunk_size;
@@ -4516,9 +4521,9 @@ buffer_flush(grn_ctx *ctx, grn_ii *ii, uint32_t seg, grn_hash *h)
                   dcn,
                   actual_chunk_size);
             }
-            if (actual_chunk_size > 0) {
-              chunk_free(ctx, ii, dcn, 0, actual_chunk_size);
-            }
+          }
+          if (need_chunk_free) {
+            chunk_free(ctx, ii, dcn, 0, actual_chunk_size);
           }
           if (dc) {
             GRN_FREE(dc);
@@ -4878,8 +4883,12 @@ buffer_split(grn_ctx *ctx, grn_ii *ii, uint32_t seg, grn_hash *h)
           buffer_merge(ctx, ii, seg, h, sb, sc, db0, &dc0);
           if (ctx->rc == GRN_SUCCESS) {
             const uint32_t actual_db0_chunk_size = db0->header.chunk_size;
+            bool need_db0_chunk_free = false;
             if (actual_db0_chunk_size > 0) {
               chunk_new(ctx, ii, &dcn0, actual_db0_chunk_size);
+              if (ctx->rc == GRN_SUCCESS) {
+                need_db0_chunk_free = true;
+              }
             }
             if (ctx->rc == GRN_SUCCESS) {
               grn_rc rc;
@@ -4893,8 +4902,12 @@ buffer_split(grn_ctx *ctx, grn_ii *ii, uint32_t seg, grn_hash *h)
                 buffer_merge(ctx, ii, seg, h, sb, sc, db1, &dc1);
                 if (ctx->rc == GRN_SUCCESS) {
                   const uint32_t actual_db1_chunk_size = db1->header.chunk_size;
+                  bool need_db1_chunk_free = false;
                   if (actual_db1_chunk_size > 0) {
                     chunk_new(ctx, ii, &dcn1, actual_db1_chunk_size);
+                    if (ctx->rc == GRN_SUCCESS) {
+                      need_db1_chunk_free = true;
+                    }
                   }
                   if (ctx->rc == GRN_SUCCESS) {
                     fake_map(ctx, ii->chunk, &dw1, dc1, dcn1,
@@ -4913,6 +4926,8 @@ buffer_split(grn_ctx *ctx, grn_ii *ii, uint32_t seg, grn_hash *h)
                       buffer_segment_clear(ii, seg);
                       ii->header->total_chunk_size += actual_db0_chunk_size;
                       ii->header->total_chunk_size += actual_db1_chunk_size;
+                      need_db0_chunk_free = false;
+                      need_db1_chunk_free = false;
                       if (scn != GRN_II_PSEG_NOT_ASSIGNED) {
                         chunk_free(ctx, ii, scn, 0, sb->header.chunk_size);
                         ii->header->total_chunk_size -= sb->header.chunk_size;
@@ -4935,9 +4950,9 @@ buffer_split(grn_ctx *ctx, grn_ii *ii, uint32_t seg, grn_hash *h)
                           actual_db0_chunk_size,
                           actual_db1_chunk_size);
                     }
-                    if (actual_db1_chunk_size > 0) {
-                      chunk_free(ctx, ii, dcn1, 0, actual_db1_chunk_size);
-                    }
+                  }
+                  if (need_db1_chunk_free) {
+                    chunk_free(ctx, ii, dcn1, 0, actual_db1_chunk_size);
                   }
                   if (dc1) {
                     GRN_FREE(dc1);
@@ -4957,9 +4972,9 @@ buffer_split(grn_ctx *ctx, grn_ii *ii, uint32_t seg, grn_hash *h)
                     dcn0,
                     actual_db0_chunk_size);
               }
-              if (actual_db0_chunk_size > 0) {
-                chunk_free(ctx, ii, dcn0, 0, actual_db0_chunk_size);
-              }
+            }
+            if (need_db0_chunk_free) {
+              chunk_free(ctx, ii, dcn0, 0, actual_db0_chunk_size);
             }
             if (dc0) {
               GRN_FREE(dc0);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20190328/5aebf24f/attachment-0001.html>


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