Skip to content

Commit 79181ad

Browse files
author
Mathew
committed
...
1 parent 7cc48f4 commit 79181ad

1 file changed

Lines changed: 39 additions & 22 deletions

File tree

src/core/db.cpp

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,15 @@ db_details* db_get_details() {
8686
return &db;
8787
}
8888

89+
static khiter_t db_table_find_slot(const db_table* target) {
90+
for (khiter_t k = kh_begin(db.tables); k != kh_end(db.tables); ++k) {
91+
if (kh_exist(db.tables, k) && kh_val(db.tables, k) == target) {
92+
return k;
93+
}
94+
}
95+
return kh_end(db.tables);
96+
}
97+
8998
#ifdef DEBUG_BUILD
9099
void db_validate_lru_flags() {
91100
for (khiter_t k = kh_begin(db.tables); k != kh_end(db.tables); ++k) {
@@ -269,11 +278,16 @@ void db_table_actually_delete(db_table* entry) {
269278
DEBUG("[#] Cleaning up table due to refcount == 0\n");
270279

271280
//Remove table from database
272-
khiter_t k = kh_get(table, db.tables, entry->hash);
281+
khiter_t k = db_table_find_slot(entry);
273282
if (k != kh_end(db.tables)) {
274283
kh_del(table, db.tables, k);
275284
}
276285

286+
if (entry->cache_hash_set != NULL) {
287+
kh_destroy(entry, entry->cache_hash_set);
288+
entry->cache_hash_set = NULL;
289+
}
290+
277291
//Free key
278292
free(entry->key);
279293
free(entry);
@@ -703,18 +717,20 @@ static bool db_load_from_save(){
703717
// Test file existance
704718
get_key_path(entry, buffer);
705719

706-
if( access( buffer, F_OK ) == -1 ) {
707-
DEBUG("skipping as file %s does not exist\n", buffer);
708-
free(entry);
709-
continue;
710-
}
711-
}else{
720+
if( access( buffer, F_OK ) == -1 ) {
721+
DEBUG("skipping as file %s does not exist\n", buffer);
722+
free(entry->key);
723+
free(entry);
724+
continue;
725+
}
726+
}else{
712727
// Test size of blockfile
713-
if((uint32_t)d1 >= db.blocks_exist){
714-
DEBUG("skipping as block %d does not exist\n", d1);
715-
free(entry);
716-
continue;
717-
}
728+
if((uint32_t)d1 >= db.blocks_exist){
729+
DEBUG("skipping as block %d does not exist\n", d1);
730+
free(entry->key);
731+
free(entry);
732+
continue;
733+
}
718734
// Mark this block as in-use
719735
if (block_in_use != NULL) {
720736
block_in_use[d1 / 8] |= (1 << (d1 % 8));
@@ -1274,6 +1290,7 @@ bool db_entry_handle_delete(cache_entry* entry) {
12741290
void db_delete_table_entry(db_table* table, khiter_t k, bool actually_delete = true) {
12751291
// Clear key hash table
12761292
kh_destroy(entry, table->cache_hash_set);
1293+
table->cache_hash_set = NULL;
12771294

12781295
// If not fully de-refed remove now, not later
12791296
if (table->refs != 0) {
@@ -1309,7 +1326,7 @@ void db_table_handle_delete(db_table* table, khiter_t k) {
13091326

13101327

13111328
void db_table_handle_delete(db_table* table) {
1312-
khiter_t k = kh_get(table, db.tables, table->hash);
1329+
khiter_t k = db_table_find_slot(table);
13131330

13141331
return db_table_handle_delete(table, k);
13151332
}
@@ -1339,15 +1356,15 @@ bool db_entry_handle_delete(cache_entry* entry, khiter_t k) {
13391356
//If table entry, cleanup table
13401357
if (kh_size(entry->table->cache_hash_set) == 0) {
13411358
// Release the reference taken when the table transitioned from empty
1342-
// to non-empty. db_delete_table_entry() will release the remaining
1343-
// table ownership reference.
1344-
db_table_deref(entry->table);
1345-
assert(!entry->table->deleted);
1346-
entry->table->deleted = true;
1347-
k = kh_get(table, db.tables, entry->table->hash);
1348-
assert (k != kh_end(db.tables));
1349-
db_delete_table_entry(entry->table, k, true);
1350-
entry->table = NULL;
1359+
// to non-empty. db_delete_table_entry() will release the remaining
1360+
// table ownership reference.
1361+
db_table_deref(entry->table);
1362+
assert(!entry->table->deleted);
1363+
entry->table->deleted = true;
1364+
k = db_table_find_slot(entry->table);
1365+
assert (k != kh_end(db.tables));
1366+
db_delete_table_entry(entry->table, k, true);
1367+
entry->table = NULL;
13511368
db_entry_deref(entry, false);
13521369
return true;
13531370
}

0 commit comments

Comments
 (0)