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