From c97d320d17d9c72a4daa620a43745b7aca3a9bde Mon Sep 17 00:00:00 2001 From: Magnus Ahltorp Date: Mon, 11 Jul 2016 16:52:19 +0200 Subject: Better error handling when allocating and freeing permdb object --- c_src/permdb.c | 28 +++++++++++++++++++--------- c_src/permdbport.c | 1 + c_src/permdbpy.c | 11 ++++++++++- 3 files changed, 30 insertions(+), 10 deletions(-) (limited to 'c_src') 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); diff --git a/c_src/permdbport.c b/c_src/permdbport.c index 39b0b72..f5f151d 100644 --- a/c_src/permdbport.c +++ b/c_src/permdbport.c @@ -31,6 +31,7 @@ main(int argc, char *argv[]) permdb_object *state = permdb_alloc(store); if (state == NULL) { + fprintf(stderr, "permdbport failed to start\n"); write_reply(NULL, 0, 4); return 1; } diff --git a/c_src/permdbpy.c b/c_src/permdbpy.c index beea36a..bfad068 100644 --- a/c_src/permdbpy.c +++ b/c_src/permdbpy.c @@ -45,8 +45,17 @@ PyTypeObject permdb_type = { permdb_object_py * permdb_alloc_py(const char *dbpath) { + struct permdb_object *permdb; + + permdb = permdb_alloc(dbpath); + + if (permdb == NULL) { + PyErr_SetString(PyExc_RuntimeError, "Cannot allocate permdb object"); + return NULL; + } + permdb_object_py *state = PyObject_New(permdb_object_py, &permdb_type); - state->permdb = permdb_alloc(dbpath); + state->permdb = permdb; return state; } -- cgit v1.1