From 8374209906a1ff4f2b0f9a855f67af2b460dfea4 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Mon, 21 Mar 2005 17:20:54 +0000 Subject: [PATCH] Fixed bug #275: Leaf node split problem(s). --- isamb/isamb.c | 22 ++++++++-------------- isamb/tstisamb.c | 27 +++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/isamb/isamb.c b/isamb/isamb.c index 8245f98..af6d202 100644 --- a/isamb/isamb.c +++ b/isamb/isamb.c @@ -1,4 +1,4 @@ -/* $Id: isamb.c,v 1.74 2005-03-18 12:05:11 adam Exp $ +/* $Id: isamb.c,v 1.75 2005-03-21 17:20:54 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -839,6 +839,7 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item, int cut_item_size = 0; int no_items = 0; /* number of items (total) */ int no_items_1 = 0; /* number of items (first half) */ + int inserted_dst_bytes = 0; if (p && p->size) { @@ -852,6 +853,7 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item, { const char *dst_item = 0; /* resulting item to be inserted */ char *lookahead_next; + char *dst_0 = dst; int d = -1; if (lookahead_item) @@ -877,7 +879,6 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item, else dst_item = file_item_buf; - if (!*lookahead_mode && d == 0) { /* it's a deletion and they match so there is nothing to be @@ -914,7 +915,8 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item, { /* we must move the lookahead pointer */ - if (dst > maxp) + inserted_dst_bytes += (dst - dst_0); + if (inserted_dst_bytes >= quater) /* no more room. Mark lookahead as "gone".. */ lookahead_item = 0; else @@ -971,17 +973,7 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item, either it's empty (new) or all file items have been read in previous loop */ - /* determine maximum ptr for tail */ - if (half2) - { - /* split already. No more splits - fill up to one full (Extra) block */ - maxp = half2 + b->file[b->no_cat-1].head.block_max; - } - else - { - /* no split. Fill up to 1+1/4 block */ - maxp = dst_buf + b->file[b->no_cat-1].head.block_max + quater; - } + maxp = dst_buf + b->file[b->no_cat-1].head.block_max + quater; while (lookahead_item) { char *dst_item; @@ -1066,6 +1058,7 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item, /* first half */ p->size = half1 - dst_buf; + assert(p->size <= b->file[p->cat].head.block_max); memcpy (p->bytes, dst_buf, half1 - dst_buf); p->no_items = no_items_1; @@ -1081,6 +1074,7 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item, memcpy (first_dst, half2, dst - half2); (*sp2)->size = (first_dst - (*sp2)->bytes) + (dst - half2); + assert((*sp2)->size <= b->file[p->cat].head.block_max); (*sp2)->no_items = no_items - no_items_1; (*sp2)->dirty = 1; p->dirty = 1; diff --git a/isamb/tstisamb.c b/isamb/tstisamb.c index 5a07f57..5adb3e8 100644 --- a/isamb/tstisamb.c +++ b/isamb/tstisamb.c @@ -1,4 +1,4 @@ -/* $Id: tstisamb.c,v 1.18 2005-03-18 12:05:11 adam Exp $ +/* $Id: tstisamb.c,v 1.19 2005-03-21 17:20:54 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -229,6 +229,27 @@ void tst_forward(ISAMB isb, int n) isamb_unlink(isb, isamc_p); } +void tst_x(ISAMB isb) +{ + ISAMC_I isamc_i; + ISAMB_P isamb_p = 0; + struct read_info ri; + + isamc_i.clientData = &ri; + isamc_i.read_item = code_read; + ri.no = 1000; + ri.step = 1; + ri.max = 1500; + + isamb_p = isamb_merge (isb, isamb_p , &isamc_i); + + ri.no = 1; + ri.step = 1; + ri.max = 500; + + isamb_p = isamb_merge (isb, isamb_p , &isamc_i); +} + void tst_append(ISAMB isb, int n) { ISAMC_I isamc_i; @@ -296,7 +317,9 @@ int main(int argc, char **argv) tst_forward(isb, 10000); - tst_append(isb, 10000); + tst_x(isb); + + tst_append(isb, 1000); /* close isam handle */ isamb_close(isb); -- 1.7.10.4