Fixed two nasty bugs in isc_merge.
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 6 Mar 1998 13:54:02 +0000 (13:54 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 6 Mar 1998 13:54:02 +0000 (13:54 +0000)
CHANGELOG
index/invstat.c
isamc/isamc.c
isamc/merge.c

index dcdc5c1..449a947 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,5 @@
+Fixed two bugs in ISAMC system.
+
 Changed the way Zebra keeps its maintenance information. Records
 in "SGML" notation using an EXPLAIN schema is now used when
 appropriate.
index 2e14ede..fedd31d 100644 (file)
@@ -1,10 +1,13 @@
 /*
- * Copyright (C) 1994-1997, Index Data I/S 
+ * Copyright (C) 1994-1998, Index Data I/S 
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: invstat.c,v $
- * Revision 1.5  1997-09-17 12:19:13  adam
+ * Revision 1.6  1998-03-06 13:54:02  adam
+ * Fixed two nasty bugs in isc_merge.
+ *
+ * Revision 1.5  1997/09/17 12:19:13  adam
  * Zebra version corresponds to YAZ version 1.4.
  * Changed Zebra server so that it doesn't depend on global common_resource.
  *
@@ -108,7 +111,7 @@ void inv_prstat (BFiles bfs)
         logf (LOG_FATAL, "dict_open fail");
         exit (1);
     }
-    if (res_get_match (common_resource, "isam", "c", NULL))
+    if (!res_get_match (common_resource, "isam", "i", NULL))
     {
         isamc = isc_open (bfs, FNAME_ISAMC, 0, key_isamc_m (common_resource));
         if (!isamc)
index 6d64d79..b1e8fe2 100644 (file)
@@ -1,10 +1,13 @@
 /*
- * Copyright (c) 1995-1996, Index Data.
+ * Copyright (c) 1995-1998, Index Data.
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: isamc.c,v $
- * Revision 1.8  1997-09-17 12:19:20  adam
+ * Revision 1.9  1998-03-06 13:54:02  adam
+ * Fixed two nasty bugs in isc_merge.
+ *
+ * Revision 1.8  1997/09/17 12:19:20  adam
  * Zebra version corresponds to YAZ version 1.4.
  * Changed Zebra server so that it doesn't depend on global common_resource.
  *
 static void release_fc (ISAMC is, int cat);
 static void init_fc (ISAMC is, int cat);
 
+#define SMALL_TEST 0
+
 ISAMC_M isc_getmethod (void)
 {
     static struct ISAMC_filecat_s def_cat[] = {
+#if SMALL_TEST
+        {   32,    28,     0,    3 },
+       {   64,    54,    30,    0 },
+#else
         {   32,    28,     0,    20 },
         {  512,   490,   100,    20 },
         { 4096,  3950,  1000,    20 },
         {32768, 32000, 10000,     0 },
+#endif
     };
     ISAMC_M m = xmalloc (sizeof(*m));
     m->filecat = def_cat;
@@ -334,8 +344,8 @@ ISAMC_PP isc_pp_open (ISAMC is, ISAMC_P ipos)
         pp->offset = src - pp->buf; 
         assert (pp->offset == ISAMC_BLOCK_OFFSET_1);
         if (is->method->debug > 2)
-            logf (LOG_LOG, "isc: read_block size=%d %d %d",
-                 pp->size, pp->cat, pp->pos);
+            logf (LOG_LOG, "isc: read_block size=%d %d %d next=%d",
+                 pp->size, pp->cat, pp->pos, pp->next);
     }
     return pp;
 }
@@ -346,7 +356,11 @@ int isc_pp_read (ISAMC_PP pp, void *buf)
     return isc_read_item (pp, (char **) &buf);
 }
 
-/* returns non-zero if item could be read; 0 otherwise */
+/* read one item from file - decode and store it in *dst.
+   Returns
+     0 if end-of-file
+     1 if item could be read ok and NO boundary
+     2 if item could be read ok and boundary */
 int isc_read_item (ISAMC_PP pp, char **dst)
 {
     ISAMC is = pp->is;
@@ -354,10 +368,12 @@ int isc_read_item (ISAMC_PP pp, char **dst)
 
     if (pp->offset >= pp->size)
     {
+       /* out new block position */
         pp->pos = pp->next;
         if (!pp->pos)
-            return 0;
+            return 0;    /* end of file */
         src = pp->buf;
+       /* read block and save 'next' and 'size' entry */
         isc_read_block (is, pp->cat, pp->pos, src);
         memcpy (&pp->next, src, sizeof(pp->next));
         src += sizeof(pp->next);
@@ -371,8 +387,8 @@ int isc_read_item (ISAMC_PP pp, char **dst)
         (*is->method->code_item)(ISAMC_DECODE, pp->decodeClientData, dst, &src);
         pp->offset = src - pp->buf; 
         if (is->method->debug > 2)
-            logf (LOG_LOG, "isc: read_block size=%d %d %d",
-                 pp->size, pp->cat, pp->pos);
+            logf (LOG_LOG, "isc: read_block size=%d %d %d next=%d",
+                 pp->size, pp->cat, pp->pos, pp->next);
         return 2;
     }
     (*is->method->code_item)(ISAMC_DECODE, pp->decodeClientData, dst, &src);
index c2578a8..b2092c1 100644 (file)
@@ -1,10 +1,13 @@
 /*
- * Copyright (c) 1996, Index Data.
+ * Copyright (c) 1996-1998, Index Data.
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: merge.c,v $
- * Revision 1.5  1997-02-12 20:42:43  adam
+ * Revision 1.6  1998-03-06 13:54:03  adam
+ * Fixed two nasty bugs in isc_merge.
+ *
+ * Revision 1.5  1997/02/12 20:42:43  adam
  * Bug fix: during isc_merge operations, some pages weren't marked dirty
  * even though they should be. At this point the merge operation marks
  * a page dirty if the previous page changed at all. A better approach is
@@ -219,8 +222,7 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I data)
                         if (is->method->debug > 2)
                             logf (LOG_LOG, "isc: flush A %d sections", ptr);
                         flush_blocks (is, mb, ptr-1, r_buf, &firstpos, cat,
-                                      0, &numKeys);
-
+                                      0, &pp->numKeys);
                         mb[0].block = mb[ptr-1].block;
                         mb[0].dirty = mb[ptr-1].dirty;
                         memcpy (r_buf, r_buf + mb[ptr-1].offset,
@@ -333,8 +335,7 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I data)
                     if (is->method->debug > 2)
                         logf (LOG_LOG, "isc: flush B %d sections", ptr-1);
                     flush_blocks (is, mb, ptr-1, r_buf, &firstpos, cat,
-                                  0, &numKeys);
-
+                                  0, &pp->numKeys);
                     mb[0].block = mb[ptr-1].block;
                     mb[0].dirty = mb[ptr-1].dirty;
                     memcpy (r_buf, r_buf + mb[ptr-1].offset,
@@ -409,7 +410,8 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I data)
                 logf (LOG_LOG, "isc: release C");
             isc_release_block (is, pp->cat, mb[ptr].block);
             mb[ptr].block = 0;
-            mb[ptr].dirty = 1;
+           if (ptr > 0)
+               mb[ptr-1].dirty = 1;
         }
     }