- track block versions correctly - per inode block (128kb) instead of tree block (4kb) - prevent multiple parallel CAS writes of the same inode block - add logging for EILSEQ which means invalid data in the tree - fix get_block updated flag which was true for blocks already in cache and was leading to infinite loops on "unrelated block" errors - apply changes to blocks in cache only after successful writes (using "virtual changes") - do not replace cached block with an older version from disk - recheck "unrelated blocks" (read/update collisions) until data stops changing - track tree path correctly - do not treat split block as parent of its right half - correctly move blocks when finding new empty place on disk - restart updates from the beginning when one of blocks is changed by a parallel update - fix delete using SET opcode and setting key to the empty value instead - prevent changing the same key more than 1 time in parallel - fix listing verification - resume continue_updates in update_find (required because it uses continue_update itself) - add allow_old_cached parameter to get()
37 lines
1.2 KiB
C++
37 lines
1.2 KiB
C++
// Copyright (c) Vitaliy Filippov, 2019+
|
|
// License: VNPL-1.1 (see README.md for details)
|
|
//
|
|
// Vitastor shared key/value database
|
|
// Parallel optimistic B-Tree O:-)
|
|
|
|
#pragma once
|
|
|
|
#include "cluster_client.h"
|
|
|
|
struct kv_db_t;
|
|
|
|
struct kv_dbw_t
|
|
{
|
|
kv_dbw_t(cluster_client_t *cli);
|
|
~kv_dbw_t();
|
|
|
|
void open(inode_t inode_id, json11::Json cfg, std::function<void(int)> cb);
|
|
void set_config(json11::Json cfg);
|
|
void close(std::function<void()> cb);
|
|
|
|
uint64_t get_size();
|
|
|
|
void get(const std::string & key, std::function<void(int res, const std::string & value)> cb,
|
|
bool allow_old_cached = false);
|
|
void set(const std::string & key, const std::string & value, std::function<void(int res)> cb,
|
|
std::function<bool(int res, const std::string & value)> cas_compare = NULL);
|
|
void del(const std::string & key, std::function<void(int res)> cb,
|
|
std::function<bool(int res, const std::string & value)> cas_compare = NULL);
|
|
|
|
void* list_start(const std::string & start);
|
|
void list_next(void *handle, std::function<void(int res, const std::string & key, const std::string & value)> cb);
|
|
void list_close(void *handle);
|
|
|
|
kv_db_t *db;
|
|
};
|