[Groonga-commit] groonga/groonga [master] Added grn_ii_buffer_check().

Zurück zum Archiv-Index

null+****@clear***** null+****@clear*****
2010年 7月 8日 (木) 13:49:25 JST


Daijiro MORI	2010-07-08 04:49:25 +0000 (Thu, 08 Jul 2010)

  New Revision: ba75078c2db5bc345ca4163cda756a9ccbe9caf7

  Log:
    Added grn_ii_buffer_check().

  Modified files:
    lib/ii.c
    lib/proc.c

  Modified: lib/ii.c (+131 -0)
===================================================================
--- lib/ii.c    2010-07-07 10:11:46 +0000 (af3af65)
+++ lib/ii.c    2010-07-08 04:49:25 +0000 (27d9f4b)
@@ -25,6 +25,7 @@
 #include "token.h"
 #include "pat.h"
 #include "db.h"
+#include "output.h"
 
 #define MAX_PSEG                 0x20000
 #define S_CHUNK                  (1 << GRN_II_W_CHUNK)
@@ -2932,6 +2933,136 @@ buffer_flush(grn_ctx *ctx, grn_ii *ii, uint32_t seg, grn_hash *h)
   return rc;
 }
 
+void
+grn_ii_buffer_check(grn_ctx *ctx, grn_ii *ii, uint32_t seg)
+{
+  grn_rc rc;
+  grn_io_win sw;
+  buffer *sb;
+  uint8_t *sc;
+  uint32_t pseg, scn;
+  if (ii->header->binfo[seg] == NOT_ASSIGNED) {
+    GRN_OUTPUT_BOOL(GRN_FALSE);
+    return;
+  }
+  pseg = buffer_open(ctx, ii, SEG2POS(seg, 0), NULL, &sb);
+  if (pseg == NOT_ASSIGNED) {
+    GRN_OUTPUT_BOOL(GRN_FALSE);
+    return;
+  }
+  GRN_OUTPUT_CSTR("buffer id");
+  GRN_OUTPUT_INT64(seg);
+
+  GRN_OUTPUT_CSTR("chunk");
+  GRN_OUTPUT_INT64(sb->header.chunk);
+  GRN_OUTPUT_CSTR("chunk size");
+  GRN_OUTPUT_INT64(sb->header.chunk_size);
+  GRN_OUTPUT_CSTR("buffer free");
+  GRN_OUTPUT_INT64(sb->header.buffer_free);
+  GRN_OUTPUT_CSTR("nterms");
+  GRN_OUTPUT_INT64(sb->header.nterms);
+  GRN_OUTPUT_CSTR("nterms void");
+  GRN_OUTPUT_INT64(sb->header.nterms_void);
+
+  if ((scn = sb->header.chunk) != NOT_ASSIGNED &&
+      (sc = WIN_MAP2(ii->chunk, ctx, &sw, scn, 0,
+                     sb->header.chunk_size, grn_io_rdonly))) {
+     buffer_term *bt;
+     uint8_t *sbp = NULL;
+     datavec rdv[MAX_N_ELEMENTS + 1];
+     uint16_t n = sb->header.nterms, nterms_void = 0;
+     datavec_init(ctx, rdv, ii->n_elements, 0, 0);
+     if ((ii->header->flags & GRN_OBJ_WITH_POSITION)) {
+       rdv[ii->n_elements - 1].flags = ODD;
+     }
+     for (bt = sb->terms; n; n--, bt++) {
+       uint16_t nextb;
+       uint64_t spos = 0;
+       uint32_t *ridp, *sidp = NULL, *tfp, *weightp = NULL, *posp, nchunks = 0;
+       chunk_info *cinfo = NULL;
+       grn_id crid = GRN_ID_NIL;
+       docinfo cid = {0, 0, 0, 0, 0}, lid = {0, 0, 0, 0, 0}, bid = {0, 0};
+       uint32_t sdf = 0, snn = 0;
+       uint32_t *srp = NULL, *ssp = NULL, *stp = NULL, *sop = NULL, *snp = NULL;
+       if (!bt->tid) {
+         nterms_void++;
+         continue;
+       }
+       nextb = bt->pos_in_buffer;
+       GETNEXTB();
+       if (sc && bt->size_in_chunk) {
+         uint8_t *scp = sc + bt->pos_in_chunk;
+         uint8_t *sce = scp + bt->size_in_chunk;
+         size_t size = S_SEGMENT * ii->n_elements;
+         if ((bt->tid & CHUNK_SPLIT)) {
+           int i;
+           GRN_B_DEC(nchunks, scp);
+           if (!(cinfo = GRN_MALLOCN(chunk_info, nchunks + 1))) {
+             datavec_fin(ctx, rdv);
+             return;
+           }
+           for (i = 0; i < nchunks; i++) {
+             GRN_B_DEC(cinfo[i].segno, scp);
+             GRN_B_DEC(cinfo[i].size, scp);
+             GRN_B_DEC(cinfo[i].dgap, scp);
+             crid += cinfo[i].dgap;
+           }
+         }
+         if (sce > scp) {
+           size += grn_p_decv(ctx, scp, sce - scp, rdv, ii->n_elements);
+           {
+             int j = 0;
+             sdf = rdv[j].data_size;
+             srp = rdv[j++].data;
+             if ((ii->header->flags & GRN_OBJ_WITH_SECTION)) { ssp = rdv[j++].data; }
+             stp = rdv[j++].data;
+             if ((ii->header->flags & GRN_OBJ_WITH_WEIGHT)) { sop = rdv[j++].data; }
+             snn = rdv[j].data_size;
+             snp = rdv[j].data;
+           }
+         }
+       }
+       GETNEXTC();
+       /*
+       {
+         grn_obj buf;
+         uint32_t rid, sid, tf, i, pos, *pp;
+         GRN_TEXT_INIT(&buf, 0);
+         rid = 0;
+         pp = dv[3].data;
+         for (i = 0; i < ndf; i++) {
+           GRN_BULK_REWIND(&buf);
+           rid += dv[0].data[i];
+           if (dv[0].data[i]) { sid = 0; }
+           sid += dv[1].data[i] + 1;
+           tf = dv[2].data[i] + 1;
+           pos = 0;
+           grn_text_itoa(ctx, &buf, rid);
+           GRN_TEXT_PUTC(ctx, &buf, ':');
+           grn_text_itoa(ctx, &buf, sid);
+           GRN_TEXT_PUTC(ctx, &buf, ':');
+           grn_text_itoa(ctx, &buf, tf);
+           GRN_TEXT_PUTC(ctx, &buf, ':');
+           while (tf--) {
+             pos += *pp++;
+             grn_text_itoa(ctx, &buf, pos);
+             if (tf) { GRN_TEXT_PUTC(ctx, &buf, ','); }
+           }
+           GRN_TEXT_PUTC(ctx, &buf, '\0');
+           GRN_LOG(ctx, GRN_LOG_NOTICE, "Posting:%s", GRN_TEXT_VALUE(&buf));
+         }
+         GRN_OBJ_FIN(ctx, &buf);
+       }
+       */
+
+      if (cinfo) { GRN_FREE(cinfo); }
+    }
+    datavec_fin(ctx, rdv);
+    grn_io_win_unmap2(&sw);
+  }
+  buffer_close(ctx, ii, pseg);
+}
+
 typedef struct {
   buffer_term *bt;
   const char *key;

  Modified: lib/proc.c (+6 -1)
===================================================================
--- lib/proc.c    2010-07-07 10:11:46 +0000 (813885a)
+++ lib/proc.c    2010-07-08 04:49:25 +0000 (c8d7e13)
@@ -1860,6 +1860,8 @@ proc_register(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
   return NULL;
 }
 
+void grn_ii_buffer_check(grn_ctx *ctx, grn_ii *ii, uint32_t seg);
+
 static grn_obj *
 proc_check(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
@@ -1942,11 +1944,14 @@ proc_check(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
           GRN_OUTPUT_CSTR("max id of chunk segments in use");
           GRN_OUTPUT_INT64(max);
           GRN_OUTPUT_CSTR("number of garbage chunk");
-          GRN_OUTPUT_ARRAY_OPEN("NGARBAGES", 1);
+          GRN_OUTPUT_ARRAY_OPEN("NGARBAGES", GRN_II_N_CHUNK_VARIATION);
           for (i = 0; i <= GRN_II_N_CHUNK_VARIATION; i++) {
             GRN_OUTPUT_INT64(h->ngarbages[i]);
           }
           GRN_OUTPUT_ARRAY_CLOSE();
+          for (i = 0; i < GRN_II_MAX_LSEG; i++) {
+            if (h->binfo[i] < 0x20000) { grn_ii_buffer_check(ctx, ii, i); }
+          }
         }
         GRN_OUTPUT_MAP_CLOSE();
       }




Groonga-commit メーリングリストの案内
Zurück zum Archiv-Index