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();
}