diff options
author | Magnus Ahltorp <map@kth.se> | 2016-07-11 16:52:19 +0200 |
---|---|---|
committer | Magnus Ahltorp <map@kth.se> | 2016-08-19 16:13:50 +0200 |
commit | c97d320d17d9c72a4daa620a43745b7aca3a9bde (patch) | |
tree | aab939e572b836f010d4393a588f231024f089d5 /c_src/permdb.c | |
parent | fadbdedabbc5b8c82f388ffa799a0e2c4958cf10 (diff) |
Better error handling when allocating and freeing permdb objectpermdb-alloc-fix-4
Diffstat (limited to 'c_src/permdb.c')
-rw-r--r-- | c_src/permdb.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/c_src/permdb.c b/c_src/permdb.c index ef25be5..218b8c8 100644 --- a/c_src/permdb.c +++ b/c_src/permdb.c @@ -276,11 +276,12 @@ indexfile_verify_file(buffered_file *file) struct commit_info * read_data_commit_backward(buffered_file *file, node_offset *offset); -int +static int datafile_verify_file(buffered_file *file) { unsigned char *header = bf_read(file, 0, sizeof(data_file_cookie), NULL); if (header == NULL || data_file_cookie != read_be64(header)) { + fprintf(stderr, "not a data file\n"); free(header); return -1; } @@ -294,8 +295,8 @@ datafile_verify_file(buffered_file *file) read_data_commit_backward(file, &offset); if (data_commit == NULL || validate_checksum(data_commit, file) < 0) { - dprintf(READ, (stderr, "commit broken: %llu\n", - (long long unsigned) offset)); + fprintf(stderr, "commit broken: %llu\n", + (long long unsigned) offset); free(data_commit); return -1; } @@ -437,6 +438,9 @@ permdb_alloc(const char *dbpath) state->dirtynodes = NULL; state->error = NULL; + state->datafile = NULL; + state->indexfile = NULL; + state->datafile = bf_open(dbpath, O_RDWR|O_CREAT, "datafile", 1); if (state->datafile == NULL) { permdb_free(state); @@ -462,21 +466,21 @@ permdb_alloc(const char *dbpath) } else if (bf_total_length(state->datafile) > 0 && bf_total_length(state->indexfile) == 0) { if (rebuild_index_file(state) < 0) { - warnx("index file rebuilding failed"); + warnx("index file rebuilding failed: %s", dbpath); permdb_free(state); return NULL; } } if (datafile_verify_file(state->datafile) < 0) { - warnx("data file verification failed"); + warnx("data file verification failed: %s", dbpath); permdb_free(state); return NULL; } if (indexfile_verify_file(state->indexfile) < 0) { - warnx("index file verification failed, rebuilding"); + warnx("index file verification failed, rebuilding: %s", dbpath); if (rebuild_index_file(state) < 0) { - warnx("index file rebuilding failed"); + warnx("index file rebuilding failed: %s", dbpath); permdb_free(state); return NULL; } @@ -487,8 +491,14 @@ permdb_alloc(const char *dbpath) void permdb_free(permdb_object *state) { - bf_close(state->datafile); - bf_close(state->indexfile); + if (state->datafile != NULL) { + bf_close(state->datafile); + } + + if (state->indexfile != NULL) { + bf_close(state->indexfile); + } + delete_all_nodes_in_cache(state); delete_all_dirty_nodes(state); free(state); |