aboutsummaryrefslogtreecommitdiff
path: root/src/bucket.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2016-07-20 14:40:08 +0300
committerSergey Poznyakoff <gray@gnu.org>2016-07-20 14:50:21 +0300
commitde7834e96602695db1cb6efd6238398b84d2ca60 (patch)
tree2fc49853a76d68a8db11aab24017843102fd22a8 /src/bucket.c
parentfbb0df69ca498a4fb4689a6d12c2f05e2cfaf175 (diff)
downloadgdbm-de7834e96602695db1cb6efd6238398b84d2ca60.tar.gz
gdbm-de7834e96602695db1cb6efd6238398b84d2ca60.tar.bz2
Introduce debug hooks.
* configure.ac: New option --enable-debug Print feature summary at the end of the run. * src/debug.c: New file. * src/Makefile.am [GDBM_COND_DEBUG_ENABLE]: Build debug.o Define GDBM_DEBUG_ENABLE. * src/gdbmdefs.h [GDBM_DEBUG_ENABLE] (_gdbm_debug_hook_install) (_gdbm_debug_hook_remove,_gdbm_debug_hook_check) (_gdbm_debug_hook_val): New protos. (GDBM_DEBUG_HOOK, GDBM_DEBUG_OVERRIDE) (GDBM_DEBUG_ALLOC): New defines. * src/gdbm.h.in (GDBM_RCVR_FORCE): New flag. * src/recover.c (gdbm_recover): Check database before attempting recovery, unless GDBM_RCVR_FORCE flag is set. * doc/gdbm.texi: Document GDBM_RCVR_FORCE * src/gdbmreorg.c (gdbm_reorganize): Use GDBM_RCVR_FORCE. * src/gdbmtool.c (main): Always allocate file_name. * src/bucket.c: Put GDBM_DEBUG_OVERRIDE and GDBM_DEBUG_ALLOC in critical places. * src/falloc.c: Likewise. * src/findkey.c: Likewise. * src/gdbmopen.c: Likewise. * src/gdbmstore.c: Likewise. * src/update.c: Likewise. * tests/Makefile.am [GDBM_COND_DEBUG_ENABLE]: Define GDBM_DEBUG_ENABLE. * tests/gtload.c: New options -hook, -recover, -verbose, -backup, -max-failures, -max-failed-keys, and -max-failed-buckets. Attempt recovery after errors.
Diffstat (limited to 'src/bucket.c')
-rw-r--r--src/bucket.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/bucket.c b/src/bucket.c
index 7eb3898..cd9575c 100644
--- a/src/bucket.c
+++ b/src/bucket.c
@@ -98,7 +98,8 @@ _gdbm_get_bucket (GDBM_FILE dbf, int dir_index)
dbf->cache_entry->ca_changed = FALSE;
/* Read the bucket. */
- file_pos = __lseek (dbf, bucket_adr, SEEK_SET);
+ file_pos = GDBM_DEBUG_OVERRIDE ("_gdbm_get_bucket:seek-failure",
+ __lseek (dbf, bucket_adr, SEEK_SET));
if (file_pos != bucket_adr)
{
_gdbm_fatal (dbf, _("lseek error"));
@@ -106,7 +107,8 @@ _gdbm_get_bucket (GDBM_FILE dbf, int dir_index)
return -1;
}
- rc = _gdbm_full_read (dbf, dbf->bucket, dbf->header->bucket_size);
+ rc = GDBM_DEBUG_OVERRIDE ("_gdbm_get_bucket:read-failure",
+ _gdbm_full_read (dbf, dbf->bucket, dbf->header->bucket_size));
if (rc)
{
_gdbm_fatal (dbf, gdbm_strerror (rc));
@@ -248,7 +250,8 @@ _gdbm_split_bucket (GDBM_FILE dbf, int next_insert)
dir_adr = _gdbm_alloc (dbf, dir_size);
if (dir_adr == 0)
return -1;
- new_dir = (off_t *) malloc (dir_size);
+ new_dir = GDBM_DEBUG_ALLOC ("_gdbm_split_bucket:malloc-failure",
+ malloc (dir_size));
if (new_dir == NULL)
{
gdbm_set_errno (dbf, GDBM_MALLOC_ERROR, TRUE);
@@ -286,7 +289,7 @@ _gdbm_split_bucket (GDBM_FILE dbf, int next_insert)
while (bucket[select]->h_table[elem_loc].hash_value != -1)
elem_loc = (elem_loc + 1) % dbf->header->bucket_elems;
bucket[select]->h_table[elem_loc] = *old_el;
- bucket[select]->count += 1;
+ bucket[select]->count++;
}
/* Allocate avail space for the bucket[1]. */
@@ -378,15 +381,17 @@ _gdbm_write_bucket (GDBM_FILE dbf, cache_elem *ca_entry)
{
int rc;
off_t file_pos; /* The return value for lseek. */
-
- file_pos = __lseek (dbf, ca_entry->ca_adr, SEEK_SET);
+
+ file_pos = GDBM_DEBUG_OVERRIDE ("_gdbm_write_bucket:seek-failure",
+ __lseek (dbf, ca_entry->ca_adr, SEEK_SET));
if (file_pos != ca_entry->ca_adr)
{
gdbm_set_errno (dbf, GDBM_FILE_SEEK_ERROR, TRUE);
_gdbm_fatal (dbf, _("lseek error"));
return -1;
}
- rc = _gdbm_full_write (dbf, ca_entry->ca_bucket, dbf->header->bucket_size);
+ rc = GDBM_DEBUG_OVERRIDE ("_gdbm_write_bucket:write-failure",
+ _gdbm_full_write (dbf, ca_entry->ca_bucket, dbf->header->bucket_size));
if (rc)
{
gdbm_set_errno (dbf, rc, TRUE);

Return to:

Send suggestions and report system problems to the System administrator.