Commit 58798295 authored by Rusty Russell's avatar Rusty Russell

tdb2: simplify logging levels, rename TDB_DEBUG_* to TDB_LOG_*

It was never clear to me which levels should be used for what cases.
I can only usefully distinguish three at the moment:
(1) TDB errors, which render the TDB unreliable.
(2) TDB user errors, caused by API misuse.
(3) TDB notifications of strange behaviour, from which we have recovered.
parent 0aa58f6e
This diff is collapsed.
......@@ -118,7 +118,7 @@ static int remove_from_list(struct tdb_context *tdb,
#ifdef CCAN_TDB2_DEBUG
if (tdb_read_off(tdb, off) != r_off) {
tdb_logerr(tdb, TDB_ERR_CORRUPT, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_CORRUPT, TDB_LOG_ERROR,
"remove_from_list: %llu bad prev in list %llu",
(long long)r_off, (long long)b_off);
return -1;
......@@ -136,7 +136,7 @@ static int remove_from_list(struct tdb_context *tdb,
#ifdef CCAN_TDB2_DEBUG
if (tdb_read_off(tdb, off) & TDB_OFF_MASK != r_off) {
tdb_logerr(tdb, TDB_ERR_CORRUPT, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_CORRUPT, TDB_LOG_ERROR,
"remove_from_list: %llu bad list %llu",
(long long)r_off, (long long)b_off);
return -1;
......@@ -176,7 +176,7 @@ static int enqueue_in_free(struct tdb_context *tdb,
new.next + offsetof(struct tdb_free_record,
magic_and_prev))
!= magic) {
tdb_logerr(tdb, TDB_ERR_CORRUPT, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_CORRUPT, TDB_LOG_ERROR,
"enqueue_in_free: %llu bad head"
" prev %llu",
(long long)new.next, (long long)b_off);
......@@ -333,7 +333,7 @@ static int coalesce(struct tdb_context *tdb,
goto err;
if (frec_len(&rec) != data_len) {
tdb_logerr(tdb, TDB_ERR_CORRUPT, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_CORRUPT, TDB_LOG_ERROR,
"coalesce: expected data len %zu not %zu",
(size_t)data_len, (size_t)frec_len(&rec));
goto err;
......@@ -414,7 +414,7 @@ again:
if (frec_magic(r) != TDB_FREE_MAGIC) {
tdb_access_release(tdb, r);
tdb_logerr(tdb, TDB_ERR_CORRUPT, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_CORRUPT, TDB_LOG_ERROR,
"lock_and_alloc: %llu non-free 0x%llx",
(long long)off, (long long)r->magic_and_prev);
goto unlock_err;
......@@ -567,7 +567,7 @@ int set_header(struct tdb_context *tdb,
if (rec_key_length(rec) != keylen
|| rec_data_length(rec) != datalen
|| rec_extra_padding(rec) != actuallen - (keylen + datalen)) {
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"Could not encode k=%llu,d=%llu,a=%llu",
(long long)keylen, (long long)datalen,
(long long)actuallen);
......@@ -588,7 +588,7 @@ static int tdb_expand(struct tdb_context *tdb, tdb_len_t size)
/* Need to hold a hash lock to expand DB: transactions rely on it. */
if (!(tdb->flags & TDB_NOLOCK)
&& !tdb->allrecord_lock.count && !tdb_has_hash_locks(tdb)) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_expand: must hold lock during expand");
return -1;
}
......
......@@ -704,7 +704,7 @@ int next_in_hash(struct tdb_context *tdb, int ltype,
}
if (rec_magic(&rec) != TDB_USED_MAGIC) {
tdb_logerr(tdb, TDB_ERR_CORRUPT,
TDB_DEBUG_FATAL,
TDB_LOG_ERROR,
"next_in_hash:"
" corrupt record at %llu",
(long long)off);
......
......@@ -56,7 +56,7 @@ void tdb_mmap(struct tdb_context *tdb)
*/
if (tdb->map_ptr == MAP_FAILED) {
tdb->map_ptr = NULL;
tdb_logerr(tdb, TDB_SUCCESS, TDB_DEBUG_WARNING,
tdb_logerr(tdb, TDB_SUCCESS, TDB_LOG_WARNING,
"tdb_mmap failed for size %lld (%s)",
(long long)tdb->map_size, strerror(errno));
}
......@@ -80,7 +80,7 @@ static int tdb_oob(struct tdb_context *tdb, tdb_off_t len, bool probe)
return 0;
if (tdb->flags & TDB_INTERNAL) {
if (!probe) {
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_oob len %lld beyond internal"
" malloc size %lld",
(long long)len,
......@@ -93,7 +93,7 @@ static int tdb_oob(struct tdb_context *tdb, tdb_off_t len, bool probe)
return -1;
if (fstat(tdb->fd, &st) != 0) {
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"Failed to fstat file: %s", strerror(errno));
tdb_unlock_expand(tdb, F_RDLCK);
return -1;
......@@ -103,7 +103,7 @@ static int tdb_oob(struct tdb_context *tdb, tdb_off_t len, bool probe)
if (st.st_size < (size_t)len) {
if (!probe) {
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_oob len %zu beyond eof at %zu",
(size_t)len, st.st_size);
}
......@@ -211,7 +211,7 @@ static int tdb_write(struct tdb_context *tdb, tdb_off_t off,
const void *buf, tdb_len_t len)
{
if (tdb->read_only) {
tdb_logerr(tdb, TDB_ERR_RDONLY, TDB_DEBUG_WARNING,
tdb_logerr(tdb, TDB_ERR_RDONLY, TDB_LOG_USE_ERROR,
"Write to read-only database");
return -1;
}
......@@ -234,7 +234,7 @@ static int tdb_write(struct tdb_context *tdb, tdb_off_t off,
if (ret >= 0)
errno = ENOSPC;
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_write: %zi at %zu len=%zu (%s)",
ret, (size_t)off, (size_t)len,
strerror(errno));
......@@ -257,7 +257,7 @@ static int tdb_read(struct tdb_context *tdb, tdb_off_t off, void *buf,
} else {
ssize_t r = pread(tdb->fd, buf, len, off);
if (r != len) {
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_read failed with %zi at %zu "
"len=%zu (%s) map_size=%zu",
r, (size_t)off, (size_t)len,
......@@ -276,7 +276,7 @@ int tdb_write_convert(struct tdb_context *tdb, tdb_off_t off,
if (unlikely((tdb->flags & TDB_CONVERT))) {
void *conv = malloc(len);
if (!conv) {
tdb_logerr(tdb, TDB_ERR_OOM, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR,
"tdb_write: no memory converting"
" %zu bytes", len);
return -1;
......@@ -302,7 +302,7 @@ int tdb_read_convert(struct tdb_context *tdb, tdb_off_t off,
int tdb_write_off(struct tdb_context *tdb, tdb_off_t off, tdb_off_t val)
{
if (tdb->read_only) {
tdb_logerr(tdb, TDB_ERR_RDONLY, TDB_DEBUG_WARNING,
tdb_logerr(tdb, TDB_ERR_RDONLY, TDB_LOG_USE_ERROR,
"Write to read-only database");
return -1;
}
......@@ -326,7 +326,7 @@ static void *_tdb_alloc_read(struct tdb_context *tdb, tdb_off_t offset,
/* some systems don't like zero length malloc */
buf = malloc(prefix + len ? prefix + len : 1);
if (!buf) {
tdb_logerr(tdb, TDB_ERR_OOM, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_USE_ERROR,
"tdb_alloc_read malloc failed len=%zu",
(size_t)(prefix + len));
} else if (unlikely(tdb->methods->tread(tdb, offset, buf+prefix, len)
......@@ -354,7 +354,7 @@ static int fill(struct tdb_context *tdb,
if (ret >= 0)
errno = ENOSPC;
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"fill failed: %zi at %zu len=%zu (%s)",
ret, (size_t)off, (size_t)len,
strerror(errno));
......@@ -373,7 +373,7 @@ static int tdb_expand_file(struct tdb_context *tdb, tdb_len_t addition)
char buf[8192];
if (tdb->read_only) {
tdb_logerr(tdb, TDB_ERR_RDONLY, TDB_DEBUG_WARNING,
tdb_logerr(tdb, TDB_ERR_RDONLY, TDB_LOG_USE_ERROR,
"Expand on read-only database");
return -1;
}
......@@ -381,7 +381,7 @@ static int tdb_expand_file(struct tdb_context *tdb, tdb_len_t addition)
if (tdb->flags & TDB_INTERNAL) {
char *new = realloc(tdb->map_ptr, tdb->map_size + addition);
if (!new) {
tdb_logerr(tdb, TDB_ERR_OOM, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR,
"No memory to expand database");
return -1;
}
......@@ -438,7 +438,7 @@ void *tdb_access_write(struct tdb_context *tdb,
void *ret = NULL;
if (tdb->read_only) {
tdb_logerr(tdb, TDB_ERR_RDONLY, TDB_DEBUG_WARNING,
tdb_logerr(tdb, TDB_ERR_RDONLY, TDB_LOG_USE_ERROR,
"Write to read-only database");
return NULL;
}
......
......@@ -135,7 +135,7 @@ static int tdb_brlock(struct tdb_context *tdb,
}
if (rw_type == F_WRLCK && tdb->read_only) {
tdb_logerr(tdb, TDB_ERR_RDONLY, TDB_DEBUG_WARNING,
tdb_logerr(tdb, TDB_ERR_RDONLY, TDB_LOG_USE_ERROR,
"Write lock attempted on read-only database");
return -1;
}
......@@ -143,7 +143,7 @@ static int tdb_brlock(struct tdb_context *tdb,
/* A 32 bit system cannot open a 64-bit file, but it could have
* expanded since then: check here. */
if ((size_t)(offset + len) != offset + len) {
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_brlock: lock on giant offset %llu",
(long long)(offset + len));
return -1;
......@@ -160,7 +160,7 @@ static int tdb_brlock(struct tdb_context *tdb,
* EAGAIN is an expected return from non-blocking
* locks. */
if (!(flags & TDB_LOCK_PROBE) && errno != EAGAIN) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_brlock failed (fd=%d) at"
" offset %zu rw_type=%d flags=%d len=%zu:"
" %s",
......@@ -186,7 +186,7 @@ static int tdb_brunlock(struct tdb_context *tdb,
} while (ret == -1 && errno == EINTR);
if (ret == -1) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_brunlock failed (fd=%d) at offset %zu"
" rw_type=%d len=%zu",
tdb->fd, (size_t)offset, rw_type, (size_t)len);
......@@ -205,14 +205,14 @@ int tdb_allrecord_upgrade(struct tdb_context *tdb)
int count = 1000;
if (tdb->allrecord_lock.count != 1) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_allrecord_upgrade failed: count %u too high",
tdb->allrecord_lock.count);
return -1;
}
if (tdb->allrecord_lock.off != 1) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_allrecord_upgrade failed: already upgraded?");
return -1;
}
......@@ -234,7 +234,7 @@ int tdb_allrecord_upgrade(struct tdb_context *tdb)
tv.tv_usec = 1;
select(0, NULL, NULL, NULL, &tv);
}
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_allrecord_upgrade failed");
return -1;
}
......@@ -280,7 +280,7 @@ static int tdb_nest_lock(struct tdb_context *tdb, tdb_off_t offset, int ltype,
struct tdb_lock_type *new_lck;
if (offset > TDB_HASH_LOCK_START + TDB_HASH_LOCK_RANGE + tdb->map_size / 8) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_nest_lock: invalid offset %zu ltype=%d",
(size_t)offset, ltype);
return -1;
......@@ -294,7 +294,7 @@ static int tdb_nest_lock(struct tdb_context *tdb, tdb_off_t offset, int ltype,
new_lck = find_nestlock(tdb, offset);
if (new_lck) {
if (new_lck->ltype == F_RDLCK && ltype == F_WRLCK) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_nest_lock: offset %zu has read lock",
(size_t)offset);
return -1;
......@@ -307,7 +307,7 @@ static int tdb_nest_lock(struct tdb_context *tdb, tdb_off_t offset, int ltype,
if (tdb->num_lockrecs
&& offset >= TDB_HASH_LOCK_START
&& offset < TDB_HASH_LOCK_START + TDB_HASH_LOCK_RANGE) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_nest_lock: already have a hash lock?");
return -1;
}
......@@ -316,7 +316,7 @@ static int tdb_nest_lock(struct tdb_context *tdb, tdb_off_t offset, int ltype,
tdb->lockrecs,
sizeof(*tdb->lockrecs) * (tdb->num_lockrecs+1));
if (new_lck == NULL) {
tdb_logerr(tdb, TDB_ERR_OOM, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR,
"tdb_nest_lock: unable to allocate %zu lock struct",
tdb->num_lockrecs + 1);
errno = ENOMEM;
......@@ -363,7 +363,7 @@ static int tdb_nest_unlock(struct tdb_context *tdb, tdb_off_t off, int ltype)
lck = find_nestlock(tdb, off);
if ((lck == NULL) || (lck->count == 0)) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_nest_unlock: no lock for %zu", (size_t)off);
return -1;
}
......@@ -449,7 +449,7 @@ int tdb_allrecord_lock(struct tdb_context *tdb, int ltype,
{
/* FIXME: There are no locks on read-only dbs */
if (tdb->read_only) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_USE_ERROR,
"tdb_allrecord_lock: read-only");
return -1;
}
......@@ -462,7 +462,7 @@ int tdb_allrecord_lock(struct tdb_context *tdb, int ltype,
if (tdb->allrecord_lock.count) {
/* a global lock of a different type exists */
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_USE_ERROR,
"tdb_allrecord_lock: already have %s lock",
tdb->allrecord_lock.ltype == F_RDLCK
? "read" : "write");
......@@ -471,14 +471,14 @@ int tdb_allrecord_lock(struct tdb_context *tdb, int ltype,
if (tdb_has_hash_locks(tdb)) {
/* can't combine global and chain locks */
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_USE_ERROR,
"tdb_allrecord_lock: already have chain lock");
return -1;
}
if (upgradable && ltype != F_RDLCK) {
/* tdb error: you can't upgrade a write lock! */
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_allrecord_lock: can't upgrade a write lock");
return -1;
}
......@@ -489,7 +489,7 @@ again:
if (tdb_lock_gradual(tdb, ltype, flags, TDB_HASH_LOCK_START,
TDB_HASH_LOCK_RANGE)) {
if (!(flags & TDB_LOCK_PROBE)) {
tdb_logerr(tdb, tdb->ecode, TDB_DEBUG_ERROR,
tdb_logerr(tdb, tdb->ecode, TDB_LOG_ERROR,
"tdb_allrecord_lock hashes failed");
}
return -1;
......@@ -499,7 +499,7 @@ again:
if (tdb_brlock(tdb, ltype, TDB_HASH_LOCK_START + TDB_HASH_LOCK_RANGE,
0, flags)) {
if (!(flags & TDB_LOCK_PROBE)) {
tdb_logerr(tdb, tdb->ecode, TDB_DEBUG_ERROR,
tdb_logerr(tdb, tdb->ecode, TDB_LOG_ERROR,
"tdb_allrecord_lock freetables failed");
}
tdb_brunlock(tdb, ltype, TDB_HASH_LOCK_START,
......@@ -556,7 +556,7 @@ void tdb_unlock_expand(struct tdb_context *tdb, int ltype)
int tdb_allrecord_unlock(struct tdb_context *tdb, int ltype)
{
if (tdb->allrecord_lock.count == 0) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_USE_ERROR,
"tdb_allrecord_unlock: not locked!");
return -1;
}
......@@ -564,7 +564,7 @@ int tdb_allrecord_unlock(struct tdb_context *tdb, int ltype)
/* Upgradable locks are marked as write locks. */
if (tdb->allrecord_lock.ltype != ltype
&& (!tdb->allrecord_lock.off || ltype != F_RDLCK)) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_allrecord_unlock: have %s lock",
tdb->allrecord_lock.ltype == F_RDLCK
? "read" : "write");
......@@ -628,7 +628,7 @@ int tdb_lock_hashes(struct tdb_context *tdb,
}
if (tdb->allrecord_lock.count) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_USE_ERROR,
"tdb_lock_hashes: already have %s allrecordlock",
tdb->allrecord_lock.ltype == F_RDLCK
? "read" : "write");
......@@ -636,13 +636,13 @@ int tdb_lock_hashes(struct tdb_context *tdb,
}
if (tdb_has_free_lock(tdb)) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_lock_hashes: already have free lock");
return -1;
}
if (tdb_has_expansion_lock(tdb)) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_lock_hashes: already have expansion lock");
return -1;
}
......@@ -661,7 +661,7 @@ int tdb_unlock_hashes(struct tdb_context *tdb,
if (tdb->allrecord_lock.count) {
if (tdb->allrecord_lock.ltype == F_RDLCK
&& ltype == F_WRLCK) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_unlock_hashes RO allrecord!");
return -1;
}
......@@ -691,14 +691,14 @@ int tdb_lock_free_bucket(struct tdb_context *tdb, tdb_off_t b_off,
if (tdb->allrecord_lock.count) {
if (tdb->allrecord_lock.ltype == F_WRLCK)
return 0;
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_lock_free_bucket with RO allrecordlock!");
return -1;
}
#if 0 /* FIXME */
if (tdb_has_expansion_lock(tdb)) {
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_LOCK, TDB_LOG_ERROR,
"tdb_lock_free_bucket: already have expansion lock");
return -1;
}
......
......@@ -331,7 +331,10 @@ struct tdb_context {
uint32_t flags;
/* Logging function */
tdb_logfn_t logfn;
void (*logfn)(struct tdb_context *tdb,
enum tdb_log_level level,
void *log_private,
const char *message);
void *log_private;
/* Hash function. */
......@@ -550,7 +553,7 @@ bool tdb_needs_recovery(struct tdb_context *tdb);
/* tdb.c: */
void COLD tdb_logerr(struct tdb_context *tdb,
enum TDB_ERROR ecode,
enum tdb_debug_level level,
enum tdb_log_level level,
const char *fmt, ...);
#ifdef TDB_TRACE
......
......@@ -175,7 +175,7 @@ char *tdb_summary(struct tdb_context *tdb, enum tdb_summary_flags flags)
chains = tally_new(HISTO_HEIGHT);
if (!ftables || !hashes || !freet || !keys || !data || !extra
|| !uncoal || !buckets || !chains) {
tdb_logerr(tdb, TDB_ERR_OOM, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR,
"tdb_summary: failed to allocate tally structures");
goto unlock;
}
......
......@@ -49,8 +49,6 @@ static uint64_t random_number(struct tdb_context *tdb)
fd = open("/dev/urandom", O_RDONLY);
if (fd >= 0) {
if (read_all(fd, &ret, sizeof(ret))) {
tdb_logerr(tdb, TDB_SUCCESS, TDB_DEBUG_TRACE,
"tdb_open: random from /dev/urandom");
close(fd);
return ret;
}
......@@ -65,9 +63,6 @@ static uint64_t random_number(struct tdb_context *tdb)
char reply[1 + sizeof(uint64_t)];
int r = read(fd, reply, sizeof(reply));
if (r > 1) {
tdb_logerr(tdb, TDB_SUCCESS, TDB_DEBUG_TRACE,
"tdb_open: %u random bytes from"
" /dev/egd-pool", r-1);
/* Copy at least some bytes. */
memcpy(&ret, reply+1, r - 1);
if (reply[0] == sizeof(uint64_t)
......@@ -83,7 +78,7 @@ static uint64_t random_number(struct tdb_context *tdb)
/* Fallback: pid and time. */
gettimeofday(&now, NULL);
ret = getpid() * 100132289ULL + now.tv_sec * 1000000ULL + now.tv_usec;
tdb_logerr(tdb, TDB_SUCCESS, TDB_DEBUG_TRACE,
tdb_logerr(tdb, TDB_SUCCESS, TDB_LOG_WARNING,
"tdb_open: random from getpid and time");
return ret;
}
......@@ -141,7 +136,7 @@ static int tdb_new_database(struct tdb_context *tdb,
tdb->map_size = sizeof(newdb);
tdb->map_ptr = malloc(tdb->map_size);
if (!tdb->map_ptr) {
tdb_logerr(tdb, TDB_ERR_OOM, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR,
"tdb_new_database: failed to allocate");
return -1;
}
......@@ -158,7 +153,7 @@ static int tdb_new_database(struct tdb_context *tdb,
if (rlen != sizeof(newdb)) {
if (rlen >= 0)
errno = ENOSPC;
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_new_database: %zi writing header: %s",
rlen, strerror(errno));
return -1;
......@@ -220,7 +215,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
tdb->stats->size = sizeof(attr->stats);
break;
default:
tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR,
"tdb_open: unknown attribute type %u",
attr->base.attr);
goto fail;
......@@ -229,7 +224,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
}
if ((open_flags & O_ACCMODE) == O_WRONLY) {
tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR,
"tdb_open: can't open tdb %s write-only", name);
goto fail;
}
......@@ -259,7 +254,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
if ((tdb->fd = open(name, open_flags, mode)) == -1) {
/* errno set by open(2) */
saved_errno = errno;
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: could not open file %s: %s",
name, strerror(errno));
goto fail;
......@@ -283,13 +278,13 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
goto fail;
}
} else if (rlen < 0) {
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: error %s reading %s",
strerror(errno), name);
goto fail;
} else if (rlen < sizeof(hdr)
|| strcmp(hdr.magic_food, TDB_MAGIC_FOOD) != 0) {
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: %s is not a tdb file", name);
goto fail;
}
......@@ -299,7 +294,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
tdb->flags |= TDB_CONVERT;
else {
/* wrong version */
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: %s is unknown version 0x%llx",
name, (long long)hdr.version);
goto fail;
......@@ -312,7 +307,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
hash_test = tdb_hash(tdb, &hash_test, sizeof(hash_test));
if (hdr.hash_test != hash_test) {
/* wrong hash variant */
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: %s uses a different hash function",
name);
goto fail;
......@@ -320,7 +315,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
if (fstat(tdb->fd, &st) == -1) {
saved_errno = errno;
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: could not stat open %s: %s",
name, strerror(errno));
goto fail;
......@@ -329,7 +324,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
/* Is it already in the open list? If so, fail. */
if (tdb_already_open(st.st_dev, st.st_ino)) {
/* FIXME */
tdb_logerr(tdb, TDB_ERR_NESTING, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_NESTING, TDB_LOG_USE_ERROR,
"tdb_open: %s (%d,%d) is already open in this"
" process",
name, (int)st.st_dev, (int)st.st_ino);
......@@ -338,7 +333,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
tdb->name = strdup(name);
if (!tdb->name) {
tdb_logerr(tdb, TDB_ERR_OOM, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR,
"tdb_open: failed to allocate name");
goto fail;
}
......@@ -401,9 +396,9 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
free((char *)tdb->name);
if (tdb->fd != -1)
if (close(tdb->fd) != 0)
tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: failed to close tdb->fd"
" on error!");
" on error: %s", strerror(errno));
free(tdb);
errno = saved_errno;
return NULL;
......@@ -562,7 +557,7 @@ int tdb_append(struct tdb_context *tdb,
/* Slow path. */
newdata = malloc(key.dsize + old_dlen + dbuf.dsize);
if (!newdata) {
tdb_logerr(tdb, TDB_ERR_OOM, TDB_DEBUG_FATAL,
tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR,
"tdb_append: failed to allocate %zu bytes",
(size_t)(key.dsize+old_dlen+dbuf.dsize));
goto fail;
......@@ -717,7 +712,7 @@ const char *tdb_errorstr(const struct tdb_context *tdb)
void COLD tdb_logerr(struct tdb_context *tdb,
enum TDB_ERROR ecode,
enum tdb_debug_level level,
enum tdb_log_level level,
const char *fmt, ...)
{
char *message;
......@@ -738,7 +733,7 @@ void COLD tdb_logerr(struct tdb_context *tdb,
message = malloc(len + 1);
if (!message) {
tdb->logfn(tdb, TDB_DEBUG_ERROR, tdb->log_private,
tdb->logfn(tdb, TDB_LOG_ERROR, tdb->log_private,
"out of memory formatting message:");
tdb->logfn(tdb, level, tdb->log_private, fmt);
return;
......
......@@ -68,8 +68,7 @@ enum TDB_ERROR {TDB_SUCCESS=0, TDB_ERR_CORRUPT, TDB_ERR_IO, TDB_ERR_LOCK,
enum tdb_summary_flags { TDB_SUMMARY_HISTOGRAMS = 1 };
/* logging uses one of the following levels */
enum tdb_debug_level {TDB_DEBUG_FATAL = 0, TDB_DEBUG_ERROR,
TDB_DEBUG_WARNING, TDB_DEBUG_TRACE};
enum tdb_log_level {TDB_LOG_ERROR = 0, TDB_LOG_USE_ERROR, TDB_LOG_WARNING};
typedef struct tdb_data {
unsigned char *dptr;
......@@ -80,7 +79,6 @@ struct tdb_context;
/* FIXME: Make typesafe */
typedef int (*tdb_traverse_func)(struct tdb_context *, TDB_DATA, TDB_DATA, void *);
typedef void (*tdb_logfn_t)(struct tdb_context *, enum tdb_debug_level, void *, const char *);
typedef uint64_t (*tdb_hashfn_t)(const void *key, size_t len, uint64_t seed,
void *priv);
......@@ -98,7 +96,10 @@ struct tdb_attribute_base {
struct tdb_attribute_log {
struct tdb_attribute_base base; /* .attr = TDB_ATTRIBUTE_LOG */
tdb_logfn_t log_fn;
void (*log_fn)(struct tdb_context *tdb,
enum tdb_log_level level,
void *log_private,
const char *message);
void *log_private;
};
......
......@@ -13,14 +13,13 @@ union tdb_attribute tap_log_attr = {
};
void tap_log_fn(struct tdb_context *tdb,
enum tdb_debug_level level, void *priv,
enum tdb_log_level level, void *priv,
const char *message)
{
if (suppress_logging)
return;
diag("tdb log level %u: %s%s", level, log_prefix, message);
if (level != TDB_DEBUG_TRACE)
tap_log_messages++;
tap_log_messages++;
}
......@@ -10,7 +10,7 @@ extern unsigned tap_log_messages;
extern union tdb_attribute tap_log_attr;
void tap_log_fn(struct tdb_context *tdb,
enum tdb_debug_level level, void *priv,
enum tdb_log_level level, void *priv,
const char *message);
static inline bool data_equal(struct tdb_data a, struct tdb_data b)
......
......@@ -11,8 +11,8 @@
#include "logging.h"
/* FIXME: Check these! */
#define INITIAL_TDB_MALLOC "tdb.c", 182, FAILTEST_MALLOC
#define LOGGING_MALLOC "tdb.c", 739, FAILTEST_MALLOC
#define INITIAL_TDB_MALLOC "tdb.c", 177, FAILTEST_MALLOC
#define LOGGING_MALLOC "tdb.c", 734, FAILTEST_MALLOC
#define URANDOM_OPEN "tdb.c", 49, FAILTEST_OPEN
#define URANDOM_READ "tdb.c", 29, FAILTEST_READ
......
......@@ -12,7 +12,7 @@ static int log_count = 0;
/* Normally we get a log when setting random seed. */
static void my_log_fn(struct tdb_context *tdb,
enum tdb_debug_level level, void *priv,
enum tdb_log_level level, void *priv,
const char *message)
{
log_count++;
......
......@@ -50,15 +50,12 @@ static void tdb_log(struct tdb_context *tdb, enum tdb_debug_level level, void *p
{
va_list ap;
if (level != TDB_DEBUG_TRACE)
error_count++;
va_start(ap, format);
vfprintf(stdout, format, ap);
va_end(ap);
fflush(stdout);
#if 0
if (level != TDB_DEBUG_TRACE) {
{
char *ptr;
signal(SIGUSR1, SIG_IGN);
asprintf(&ptr,"xterm -e gdb /proc/%d/exe %d", getpid(), getpid());
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment