[Groonga-commit] groonga/groonga [master] check: detect index corruption

アーカイブの一覧に戻る

Daijiro MORI null+****@clear*****
Thu Nov 1 17:15:18 JST 2012


Daijiro MORI	2012-11-01 17:15:18 +0900 (Thu, 01 Nov 2012)

  New Revision: 08269da4698fd77038e6c72e9c8a39ee9a78497c
  https://github.com/groonga/groonga/commit/08269da4698fd77038e6c72e9c8a39ee9a78497c

  Log:
    check: detect index corruption

  Modified files:
    lib/ii.c

  Modified: lib/ii.c (+38 -1)
===================================================================
--- lib/ii.c    2012-11-01 16:26:59 +0900 (3d49396)
+++ lib/ii.c    2012-11-01 17:15:18 +0900 (56d6cad)
@@ -2966,6 +2966,8 @@ grn_ii_buffer_check(grn_ctx *ctx, grn_ii *ii, uint32_t seg)
   int nterms_void = 0;
   int size_in_buffer = 0;
   grn_obj buf;
+  size_t lower_bound;
+  int64_t nloops = 0, nviolations = 0;
   if (ii->header->binfo[seg] == NOT_ASSIGNED) {
     GRN_OUTPUT_BOOL(GRN_FALSE);
     return;
@@ -2975,6 +2977,9 @@ grn_ii_buffer_check(grn_ctx *ctx, grn_ii *ii, uint32_t seg)
     GRN_OUTPUT_BOOL(GRN_FALSE);
     return;
   }
+  lower_bound =
+    (sb->header.buffer_free + sizeof(buffer_term) * sb->header.nterms)
+    / sizeof(buffer_rec);
   datavec_init(ctx, rdv, ii->n_elements, 0, 0);
   if ((ii->header->flags & GRN_OBJ_WITH_POSITION)) {
     rdv[ii->n_elements - 1].flags = ODD;
@@ -3009,7 +3014,7 @@ grn_ii_buffer_check(grn_ctx *ctx, grn_ii *ii, uint32_t seg)
     docinfo bid = {0, 0};
     uint32_t sdf = 0, snn = 0;
     uint32_t *srp = NULL, *ssp = NULL, *stp = NULL, *sop = NULL, *snp = NULL;
-    if (!bt->tid) {
+    if (!bt->tid && !bt->pos_in_buffer && !bt->size_in_buffer) {
       nterms_void++;
       continue;
     }
@@ -3068,6 +3073,30 @@ grn_ii_buffer_check(grn_ctx *ctx, grn_ii *ii, uint32_t seg)
         nterm_with_chunk++;
       }
     }
+    {
+      uint16_t pos;
+      grn_id rid, sid, rid_ = 0, sid_ = 0;
+      uint8_t *p;
+      buffer_rec *r;
+      for (pos = bt->pos_in_buffer; pos; pos = r->step) {
+        if (pos < lower_bound) {
+          nviolations++;
+        }
+        r = BUFFER_REC_AT(sb, pos);
+        p = NEXT_ADDR(r);
+        GRN_B_DEC(rid, p);
+        if ((ii->header->flags & GRN_OBJ_WITH_SECTION)) {
+          GRN_B_DEC(sid, p);
+        } else {
+          sid = 1;
+        }
+        if (rid < rid_ || (rid == rid_ && sid < sid_)) {
+          nloops++;
+        }
+        rid_ = rid;
+        sid_ = sid;
+      }
+    }
     GRN_OUTPUT_ARRAY_CLOSE();
     if (cinfo) { GRN_FREE(cinfo); }
   }
@@ -3094,6 +3123,14 @@ grn_ii_buffer_check(grn_ctx *ctx, grn_ii *ii, uint32_t seg)
     GRN_OUTPUT_CSTR("number of deleted terms with value");
     GRN_OUTPUT_INT64(ndeleted_terms_with_value);
   }
+  if (nloops) {
+    GRN_OUTPUT_CSTR("number of loops");
+    GRN_OUTPUT_INT64(nloops);
+  }
+  if (nviolations) {
+    GRN_OUTPUT_CSTR("number of violations");
+    GRN_OUTPUT_INT64(nviolations);
+  }
   GRN_OUTPUT_MAP_CLOSE();
   datavec_fin(ctx, rdv);
   if (sc) { grn_io_win_unmap2(&sw); }
-------------- next part --------------
HTML����������������������������...
ダウンロード 



More information about the Groonga-commit mailing list
アーカイブの一覧に戻る