feat(lsm): add valid entry marker to idx entries
parent
2f58d1ee48
commit
d4b21fb84d
|
@ -142,6 +142,7 @@ lsm_error lsm_store_load_db(lsm_store *store) {
|
|||
uint64_t db_dim[2];
|
||||
lsm_str *key;
|
||||
lsm_entry_handle *handle;
|
||||
bool valid_entry;
|
||||
|
||||
rewind(store->idx_file);
|
||||
|
||||
|
@ -152,24 +153,43 @@ lsm_error lsm_store_load_db(lsm_store *store) {
|
|||
for (uint64_t i = 0; i < store->idx_file_block_count; i++) {
|
||||
uint64_t idx_file_offset = store->idx_file_size;
|
||||
|
||||
LSM_RES(lsm_entry_read_str(&key, &store->idx_file_size, store->idx_file));
|
||||
LSM_RES(lsm_fread(&db_dim, &store->idx_file_size, store->idx_file,
|
||||
sizeof(uint64_t), 2));
|
||||
LSM_RES(lsm_store_insert(&handle, store, key));
|
||||
LSM_RES(lsm_fread(&valid_entry, &store->idx_file_size, store->idx_file,
|
||||
sizeof(bool), 1));
|
||||
|
||||
// Read attributes from database file
|
||||
if (fseek(store->db_file, db_dim[0], SEEK_SET) != 0) {
|
||||
return lsm_error_failed_io;
|
||||
if (valid_entry) {
|
||||
LSM_RES(lsm_entry_read_str(&key, &store->idx_file_size, store->idx_file));
|
||||
LSM_RES(lsm_fread(&db_dim, &store->idx_file_size, store->idx_file,
|
||||
sizeof(uint64_t), 2));
|
||||
LSM_RES(lsm_store_insert(&handle, store, key));
|
||||
|
||||
// Read attributes from database file
|
||||
if (fseek(store->db_file, db_dim[0], SEEK_SET) != 0) {
|
||||
return lsm_error_failed_io;
|
||||
}
|
||||
|
||||
LSM_RES(lsm_fread(&handle->wrapper->entry->data_len, NULL, store->db_file,
|
||||
sizeof(uint64_t), 1));
|
||||
LSM_RES(lsm_entry_read_attrs(NULL, handle, store->db_file));
|
||||
|
||||
handle->wrapper->entry->idx_file_offset = idx_file_offset;
|
||||
lsm_entry_close(handle);
|
||||
|
||||
store->db_file_size += db_dim[1];
|
||||
}
|
||||
// Simply skip the invalid entry
|
||||
else {
|
||||
uint64_t key_len;
|
||||
LSM_RES(lsm_fread(&key_len, &store->idx_file_size, store->idx_file,
|
||||
sizeof(uint64_t), 1));
|
||||
|
||||
LSM_RES(lsm_fread(&handle->wrapper->entry->data_len, NULL, store->db_file,
|
||||
sizeof(uint64_t), 1));
|
||||
LSM_RES(lsm_entry_read_attrs(NULL, handle, store->db_file));
|
||||
uint64_t remaining = key_len + 2 * sizeof(uint64_t);
|
||||
|
||||
handle->wrapper->entry->idx_file_offset = idx_file_offset;
|
||||
lsm_entry_close(handle);
|
||||
if (fseek(store->idx_file, remaining, SEEK_CUR) != 0) {
|
||||
return lsm_error_failed_io;
|
||||
}
|
||||
|
||||
store->db_file_size += db_dim[1];
|
||||
store->idx_file_size += remaining;
|
||||
}
|
||||
}
|
||||
|
||||
return lsm_error_ok;
|
||||
|
|
|
@ -65,6 +65,9 @@ lsm_error lsm_write_idx_entry(uint64_t *size, FILE *idx_file, lsm_entry *entry,
|
|||
|
||||
LSM_RES(lsm_fseek(idx_file, pos));
|
||||
|
||||
bool valid_entry_marker = true;
|
||||
LSM_RES(lsm_fwrite(size, idx_file, sizeof(bool), 1, &valid_entry_marker));
|
||||
|
||||
LSM_RES(lsm_write_str(size, idx_file, entry->key));
|
||||
LSM_RES(lsm_fwrite(size, idx_file, sizeof(uint64_t), 1, &offset));
|
||||
LSM_RES(lsm_fwrite(size, idx_file, sizeof(uint64_t), 1, &len));
|
||||
|
|
Loading…
Reference in New Issue