fix(lsm): write in-memory data to disk when switching to file
This commit is contained in:
parent
f44c512099
commit
f19a8814f5
2 changed files with 21 additions and 6 deletions
|
|
@ -132,7 +132,7 @@ lsm_error lsm_store_open_write(lsm_entry_handle **out, lsm_store *store,
|
|||
sprintf(path, "%s/%s", lsm_str_ptr(store->data_path),
|
||||
lsm_str_ptr(entry->key));
|
||||
|
||||
FILE *f = fopen(path, "wb");
|
||||
FILE *f = fopen(path, "ab");
|
||||
|
||||
if (f == NULL) {
|
||||
free(handle);
|
||||
|
|
@ -184,6 +184,10 @@ lsm_error lsm_store_insert(lsm_entry_handle **out, lsm_store *store,
|
|||
|
||||
lsm_error lsm_entry_data_append(lsm_store *store, lsm_entry_handle *handle,
|
||||
lsm_str *data) {
|
||||
if (lsm_str_len(data) == 0) {
|
||||
return lsm_error_ok;
|
||||
}
|
||||
|
||||
lsm_entry *entry = handle->wrapper->entry;
|
||||
|
||||
uint64_t new_len = entry->data.len + lsm_str_len(data);
|
||||
|
|
@ -199,7 +203,6 @@ lsm_error lsm_entry_data_append(lsm_store *store, lsm_entry_handle *handle,
|
|||
|
||||
memcpy(&buf[entry->data.len], data_s, lsm_str_len(data));
|
||||
entry->data.value.ptr = buf;
|
||||
entry->data.len = new_len;
|
||||
}
|
||||
// Data will end up on disk
|
||||
else {
|
||||
|
|
@ -215,10 +218,19 @@ lsm_error lsm_entry_data_append(lsm_store *store, lsm_entry_handle *handle,
|
|||
return lsm_error_failed_io;
|
||||
}
|
||||
|
||||
size_t written = 0;
|
||||
|
||||
// Write original in-memory data to file
|
||||
while (written < entry->data.len) {
|
||||
written += fwrite(&entry->data.value.ptr[written], sizeof(char),
|
||||
entry->data.len - written, f);
|
||||
}
|
||||
|
||||
free(entry->data.value.ptr);
|
||||
entry->data.value.ptr = NULL;
|
||||
|
||||
handle->f = f;
|
||||
entry->data.on_disk = true;
|
||||
|
||||
// TODO free old buff, write original data to file
|
||||
}
|
||||
|
||||
size_t written = 0;
|
||||
|
|
@ -230,5 +242,7 @@ lsm_error lsm_entry_data_append(lsm_store *store, lsm_entry_handle *handle,
|
|||
}
|
||||
}
|
||||
|
||||
entry->data.len = new_len;
|
||||
|
||||
return lsm_error_ok;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue