/*
- * Copyright (C) 1995, Index Data I/S
+ * Copyright (C) 1995-1998, Index Data
* All rights reserved.
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: commit.c,v $
- * Revision 1.11 1996-04-23 12:36:41 adam
+ * Revision 1.14 1998-08-07 15:07:16 adam
+ * Fixed but in cf_commit_flat.
+ *
+ * Revision 1.13 1996/10/29 13:56:16 adam
+ * Include of zebrautl.h instead of alexutil.h.
+ *
+ * Revision 1.12 1996/04/24 13:29:16 adam
+ * Work on optimized on commit operation.
+ *
+ * Revision 1.11 1996/04/23 12:36:41 adam
* Started work on more efficient commit operation.
*
* Revision 1.10 1996/04/18 16:02:56 adam
#include <assert.h>
#include <stdlib.h>
-#include <alexutil.h>
+#include <zebrautl.h>
#include <mfile.h>
#include "cfile.h"
+#define CF_OPTIMIZE_COMMIT 0
+
void cf_unlink (CFile cf)
{
if (cf->bucket_in_memory)
}
+#if CF_OPTIMIZE_COMMIT
struct map_cache_entity {
int from;
int to;
return m_p;
}
-static void map_cache_del (struct map_cache *m_p)
-{
- xfree (m_p->map);
- xfree (m_p->buf);
- xfree (m_p);
-}
-
static int map_cache_cmp_from (const void *p1, const void *p2)
{
return ((struct map_cache_entity*) p1)->from -
int i;
qsort (m_p->map, m_p->no, sizeof(*m_p->map), map_cache_cmp_from);
+ assert (m_p->no < 2 || m_p->map[0].from < m_p->map[1].from);
for (i = 0; i<m_p->no; i++)
{
if (!mf_read (m_p->cf->block_mf, m_p->map[i].from, 0, 0,
m_p->buf + i * m_p->cf->head.block_size))
{
- logf (LOG_FATAL, "read commit block");
+ logf (LOG_FATAL, "read commit block at position %d",
+ m_p->map[i].from);
exit (1);
}
m_p->map[i].from = i;
}
qsort (m_p->map, m_p->no, sizeof(*m_p->map), map_cache_cmp_to);
+ assert (m_p->no < 2 || m_p->map[0].to < m_p->map[1].to);
for (i = 0; i<m_p->no; i++)
{
mf_write (m_p->cf->rmf, m_p->map[i].to, 0, 0,
m_p->buf + m_p->map[i].from * m_p->cf->head.block_size);
}
+ m_p->no = 0;
+}
+
+static void map_cache_del (struct map_cache *m_p)
+{
+ map_cache_flush (m_p);
+ xfree (m_p->map);
+ xfree (m_p->buf);
+ xfree (m_p);
}
static void map_cache_add (struct map_cache *m_p, int from, int to)
if (i == m_p->max)
map_cache_flush (m_p);
}
-
+
+/* CF_OPTIMIZE_COMMIT */
+#endif
+
static void cf_commit_hash (CFile cf)
{
int i, bucket_no;
int hash_bytes;
struct CFile_ph_bucket *p;
+#if CF_OPTIMIZE_COMMIT
+ struct map_cache *m_p;
+#endif
+
+#if CF_OPTIMIZE_COMMIT
+ m_p = map_cache_init (cf);
+#endif
p = xmalloc (sizeof(*p));
hash_bytes = cf->head.hash_size * sizeof(int);
}
for (i = 0; i<HASH_BUCKET && p->vno[i]; i++)
{
+#if CF_OPTIMIZE_COMMIT
+ map_cache_add (m_p, p->vno[i], p->no[i]);
+#else
if (!mf_read (cf->block_mf, p->vno[i], 0, 0, cf->iobuf))
{
logf (LOG_FATAL, "read commit block");
exit (1);
}
mf_write (cf->rmf, p->no[i], 0, 0, cf->iobuf);
+#endif
}
}
+#if CF_OPTIMIZE_COMMIT
+ map_cache_del (m_p);
+#endif
xfree (p);
}
int hno;
int i, vno = 0;
+#if CF_OPTIMIZE_COMMIT
+ struct map_cache *m_p;
+#endif
+
+
+#if CF_OPTIMIZE_COMMIT
+ m_p = map_cache_init (cf);
+#endif
fp = xmalloc (HASH_BSIZE);
for (hno = cf->head.next_bucket; hno < cf->head.flat_bucket; hno++)
{
- if (hno == cf->head.flat_bucket-1)
- {
- for (i = 0; i < (HASH_BSIZE/sizeof(int)); i++)
- fp[i] = 0;
- }
+ for (i = 0; i < (HASH_BSIZE/sizeof(int)); i++)
+ fp[i] = 0;
if (!mf_read (cf->hash_mf, hno, 0, 0, fp) &&
hno != cf->head.flat_bucket-1)
{
{
if (fp[i])
{
+#if CF_OPTIMIZE_COMMIT
+ map_cache_add (m_p, fp[i], vno);
+#else
if (!mf_read (cf->block_mf, fp[i], 0, 0, cf->iobuf))
{
logf (LOG_FATAL, "read data block hno=%d (%d-%d) "
exit (1);
}
mf_write (cf->rmf, vno, 0, 0, cf->iobuf);
+
+#endif
}
vno++;
}
}
+#if CF_OPTIMIZE_COMMIT
+ map_cache_del (m_p);
+#endif
xfree (fp);
}