diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-11-12 07:29:45 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-11-12 08:11:07 +0200 |
commit | dc176a5cdc841e05876d5e7b52cfb1b7bac2d333 (patch) | |
tree | 8a12ecb5057e25a8fdd0ebdc436718b19b6d78c6 /src/gdbmerrno.c | |
parent | 4fb2326a4ac0e6f45c21f7651b1c87317567fd82 (diff) | |
download | gdbm-dc176a5cdc841e05876d5e7b52cfb1b7bac2d333.tar.gz gdbm-dc176a5cdc841e05876d5e7b52cfb1b7bac2d333.tar.bz2 |
Rewrite bucket cache
The new bucket cache uses the least recently used replacement
policy (instead of the least recently read, implemented previously).
It also allows for quick bucket lookups by the corresponding
disk address. To this effect the cache entries form a red-black
tree sorted by bucket address.
Additionally, data buckets are also cached.
* README: Describe the new branch.
* src/bucket.c: Rewrite cache support.
* src/cachetree.c: New file.
* src/Makefile.am: Add new file.
* src/findkey.c (_gdbm_read_entry): Use _gdbm_fetch_data.
This ensures data pages are cached as well as buckets.
* src/gdbm.h.in (GDBM_BUCKET_CACHE_CORRUPTED): New error code.
(gdbm_cache_stat): New struct.
(gdbm_get_cache_stats): New proto.
* src/gdbmclose.c (gdbm_close): Call _gdbm_cache_free to dispose
of the cache.
* src/gdbmdefs.h (cache_elem_color): New data type.
(cache_elem): New members: ca_left, ca_right, ca_node, and
ca_hits.
(cache_tree): New typedef.
(gdbm_file_info): Remove bucket_cache and last_read.
New fields: cache_num, cache_tree, cache_mru, cache_lru,
cache_avail, cache_access_count.
* src/gdbmerrno.c: Handle GDBM_BUCKET_CACHE_CORRUPTED.
* src/gdbmopen.c (gdbm_fd_open): Change cache initialization.
(_gdbm_init_cache, _gdbm_cache_entry_invalidate: Remove.
* src/gdbmsetopt.c (setopt_gdbm_setcachesize): Cache can be
re-initialized on the fly.
* src/gdbmtool.c: Change bucket printing routines.
* src/proto.h (_gdbm_read_bucket_at): Remove.
(_gdbm_fetch_data,_gdbm_cache_init,_gdbm_cache_free)
(_gdbm_cache_flush,_gdbm_cache_elem_new)
(_gdbm_cache_tree_alloc,_gdbm_cache_tree_destroy)
(_gdbm_cache_tree_delete,_gdbm_rbt_remove_node)
(_gdbm_cache_tree_lookup): New protos.
(_gdbm_init_cache,_gdbm_cache_entry_invalidate): Remove.
* src/recover.c (_gdbm_finish_transfer): Adapt to the new
cache structure.
* src/update.c: Likewise.
* tests/setopt00.at: Fix second GDBM_SETCACHESIZE test.
Diffstat (limited to 'src/gdbmerrno.c')
-rw-r--r-- | src/gdbmerrno.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/gdbmerrno.c b/src/gdbmerrno.c index 8aa58a4..392f23b 100644 --- a/src/gdbmerrno.c +++ b/src/gdbmerrno.c @@ -139,7 +139,8 @@ const char * const gdbm_errlist[_GDBM_MAX_ERRNO+1] = { [GDBM_BAD_DIR_ENTRY] = N_("Invalid directory entry"), [GDBM_FILE_CLOSE_ERROR] = N_("Error closing file"), [GDBM_FILE_SYNC_ERROR] = N_("Error synchronizing file"), - [GDBM_FILE_TRUNCATE_ERROR] = N_("Error truncating file") + [GDBM_FILE_TRUNCATE_ERROR] = N_("Error truncating file"), + [GDBM_BUCKET_CACHE_CORRUPTED] = N_("Bucket cache corrupted") }; const char * |