Skip to content
This repository was archived by the owner on Aug 2, 2022. It is now read-only.

kv database #8223

Merged
merged 80 commits into from
Apr 24, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
05d8af9
kv database
tbfleming Nov 15, 2019
1d70cc4
kv database
tbfleming Nov 15, 2019
0ce302f
kv database
tbfleming Nov 18, 2019
02437e6
kv database
tbfleming Nov 18, 2019
1175c1c
kv database: test basic ops
tbfleming Nov 19, 2019
7a28cec
kv database: test iterator scan
tbfleming Nov 19, 2019
a7809de
kv database: test basic ops
tbfleming Nov 19, 2019
43e9060
Rename oob
tbfleming Nov 19, 2019
26ff9f3
rename next, prev
tbfleming Nov 19, 2019
ef8e7df
Switch db id to name
tbfleming Nov 20, 2019
89f12a8
fix key compare
tbfleming Nov 20, 2019
e1a64e9
Switch database_id to name
tbfleming Nov 20, 2019
96d92ad
WASM memory order
tbfleming Nov 20, 2019
01033e1
Change offset checks
tbfleming Nov 20, 2019
249f11e
cleanup
tbfleming Nov 20, 2019
154435a
Bug fixes
tbfleming Nov 22, 2019
5f2468d
Store chainbase iterators instead of doing a key lookup on every iter…
swatanabe-b1 Nov 25, 2019
8b5a9d2
Merge pull request #8248 from EOSIO/kv-iterator
swatanabe-b1 Nov 25, 2019
4d575c4
Bill eosio.kvram as RAM.
swatanabe-b1 Nov 26, 2019
3646315
Merge pull request #8253 from EOSIO/kv-ram
swatanabe-b1 Nov 27, 2019
7be16aa
Implement DISK resource and the eosio.kvdisk table.
swatanabe-b1 Dec 2, 2019
77bd5be
Clamp lowerbound to stay within the prefix.
swatanabe-b1 Dec 3, 2019
1412b10
Use a single intrinsic for managing ram/disk/net/cpu.
swatanabe-b1 Dec 3, 2019
554eaef
Limit the size of the key and value.
swatanabe-b1 Dec 3, 2019
dd4707d
Add intrinsics for setting and getting the kv limits.
swatanabe-b1 Dec 3, 2019
1a23496
Make [set/get]_kv_parameters_packed per database id.
swatanabe-b1 Dec 4, 2019
a1e0c31
Bump snapshot version to 4 and implement support for loading old snap…
swatanabe-b1 Dec 4, 2019
14ab685
Add pre-existing v3 and v4 (current) snapshots to the tests.
swatanabe-b1 Dec 4, 2019
1f43350
Merge pull request #8275 from EOSIO/kv-disk
swatanabe-b1 Dec 5, 2019
e923552
Add tests to verify when the limits are checked.
swatanabe-b1 Dec 5, 2019
015ad83
Check iteration from both the same and different contracts.
swatanabe-b1 Dec 5, 2019
d929a14
Tests for kv_get_data. Also, the offset should be applied to the tem…
swatanabe-b1 Dec 5, 2019
ad0ad0b
Test writing to another contract.
swatanabe-b1 Dec 5, 2019
a1aa6c4
Add compiled wasms for unittests.
swatanabe-b1 Dec 5, 2019
7d301e0
Fix oc.
swatanabe-b1 Dec 6, 2019
68b6519
Limit the maximum number of kv iterators.
swatanabe-b1 Dec 11, 2019
6c5063e
Merge remote-tracking branch 'origin/develop' into kv-database
tbfleming Jan 10, 2020
86802e7
Merge remote-tracking branch 'origin/develop' into kv-database
tbfleming Feb 21, 2020
65639b0
fc::json::to_stream() now needs deadline
tbfleming Feb 21, 2020
65d1426
ship: key_value
tbfleming Feb 21, 2020
5ea0137
Revert changes to the genesis state. This isn't needed without genes…
swatanabe-b1 Feb 26, 2020
da64bfe
Update tests to handle changes to the default kv_config.
swatanabe-b1 Feb 26, 2020
67bd234
Increase the default value size to 1MiB. The current system contract…
swatanabe-b1 Feb 26, 2020
bbdf16b
Fix missing member in comparison operator
swatanabe-b1 Feb 26, 2020
50173ef
Fix bad merge in oc
swatanabe-b1 Feb 26, 2020
0e8e53d
Include account_disk_deltas in the action trace.
swatanabe-b1 Feb 26, 2020
6b81531
Remove unused macro.
swatanabe-b1 Feb 26, 2020
ba59426
Minor cleanup
swatanabe-b1 Feb 26, 2020
df31c9e
Version the kv_parameter intrinsics. Also always return the size fro…
swatanabe-b1 Feb 26, 2020
cd2e2f9
Initialize the members of kv_database_config
swatanabe-b1 Feb 27, 2020
8d34cac
Add account_disk_deltas to SHiP.
swatanabe-b1 Feb 27, 2020
939cce4
Update saved snapshots to account for changing the default kv_config.
swatanabe-b1 Feb 27, 2020
900679d
Update SHiP ABI.
swatanabe-b1 Feb 27, 2020
b842bb9
Always use the latest version of action_trace in SHiP
swatanabe-b1 Feb 27, 2020
b94e4fc
Return resources used from kv_set and kv_erase.
swatanabe-b1 Feb 27, 2020
2a56c0e
Reset the kv_contexts on notifications.
swatanabe-b1 Feb 28, 2020
0334238
Minor changes from review.
swatanabe-b1 Feb 28, 2020
037cbb1
Limit the prefix size
swatanabe-b1 Feb 28, 2020
4bd0a2d
Replace next_prefix with an upper_bound lookup on the prefix.
swatanabe-b1 Mar 2, 2020
f723143
Update resume-from-state commit
swatanabe-b1 Mar 2, 2020
5433a20
Merge remote-tracking branch 'origin/develop' into kv-database
swatanabe-b1 Mar 3, 2020
94abc06
Undo odd code.
swatanabe-b1 Mar 3, 2020
1e84792
Address review feedback.
swatanabe-b1 Mar 4, 2020
f80be50
Update chainbase commit.
swatanabe-b1 Mar 6, 2020
7b18e78
Merge remote-tracking branch 'origin/develop' into kv-database
tbfleming Mar 18, 2020
93efcb3
Merge branch 'develop' into kv-database
arhag Apr 10, 2020
99e6f81
Added deep mind support for KV database branch
Apr 14, 2020
94582f6
Merge branch 'develop' into kv-database
arhag Apr 23, 2020
6fa433f
avoid aliasing in kv_tests/notify
arhag Apr 23, 2020
48e51f8
Merge pull request #8992 from EOSIO/kv-database-merge
arhag Apr 23, 2020
00254f3
Changes based on latest review of deep mind support for KV
Apr 23, 2020
9991734
Add key/value size output parameters to kv_it_next/prev/lowerbound.
swatanabe-b1 Apr 23, 2020
25f0953
add kv_tests/alias unit test
arhag Apr 23, 2020
1248864
fix problems with alias check that improperly handled pointers
arhag Apr 23, 2020
ae4c8b3
Merge pull request #8943 from dfuse-io/feature/deep-mind-kv
larryk85 Apr 23, 2020
c7d2f03
improve is_aliasing implementation
arhag Apr 23, 2020
638639c
Fix build error caused by missed renaming.
swatanabe-b1 Apr 23, 2020
05b7a94
remove unneeded include
arhag Apr 23, 2020
455b157
Workaround for gcc-8 ICE. It seems to get confused by the nested gen…
swatanabe-b1 Apr 24, 2020
b4b04b5
Merge pull request #8996 from EOSIO/kv-database-fix-aliasing
arhag Apr 24, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion libraries/chain/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ set(CHAIN_WEBASSEMBLY_SOURCES
webassembly/console.cpp
webassembly/crypto.cpp
webassembly/database.cpp
webassembly/kv_database.cpp
webassembly/memory.cpp
webassembly/permission.cpp
webassembly/privileged.cpp
Expand Down Expand Up @@ -116,7 +117,8 @@ add_library( eosio_chain
whitelisted_intrinsics.cpp
thread_utils.cpp
platform_timer_accuracy.cpp

kv_context.cpp
kv_context_chainbase.cpp
${PLATFORM_TIMER_IMPL}
${HEADERS}
)
Expand Down
157 changes: 136 additions & 21 deletions libraries/chain/apply_context.cpp

Large diffs are not rendered by default.

68 changes: 58 additions & 10 deletions libraries/chain/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <eosio/chain/genesis_intrinsics.hpp>
#include <eosio/chain/whitelisted_intrinsics.hpp>
#include <eosio/chain/database_header_object.hpp>
#include <eosio/chain/kv_chainbase_objects.hpp>

#include <eosio/chain/protocol_feature_manager.hpp>
#include <eosio/chain/authorization_manager.hpp>
Expand Down Expand Up @@ -50,7 +51,8 @@ using controller_index_set = index_set<
generated_transaction_multi_index,
table_id_multi_index,
code_index,
database_header_multi_index
database_header_multi_index,
kv_index
>;

using contract_database_index_set = index_set<
Expand Down Expand Up @@ -331,6 +333,7 @@ struct controller_impl {
set_activation_handler<builtin_protocol_feature_t::webauthn_key>();
set_activation_handler<builtin_protocol_feature_t::wtmsig_block_signatures>();
set_activation_handler<builtin_protocol_feature_t::action_return_value>();
set_activation_handler<builtin_protocol_feature_t::kv_database>();

self.irreversible_block.connect([this](const block_state_ptr& bsp) {
wasmif.current_lib(bsp->block_num);
Expand Down Expand Up @@ -950,6 +953,7 @@ struct controller_impl {
// special case for in-place upgrade of global_property_object
if (std::is_same<value_t, global_property_object>::value) {
using v2 = legacy::snapshot_global_property_object_v2;
using v3 = legacy::snapshot_global_property_object_v3;

if (std::clamp(header.version, v2::minimum_version, v2::maximum_version) == header.version ) {
fc::optional<genesis_state> genesis = extract_legacy_genesis_state(*snapshot, header.version);
Expand All @@ -961,13 +965,31 @@ struct controller_impl {
section.read_row(legacy_global_properties, db);

db.create<global_property_object>([&legacy_global_properties,&gs_chain_id](auto& gpo ){
gpo.initalize_from(legacy_global_properties, gs_chain_id);
gpo.initalize_from(legacy_global_properties, gs_chain_id, kv_config{});
});
});
return; // early out to avoid default processing
}

if (std::clamp(header.version, v3::minimum_version, v3::maximum_version) == header.version ) {
snapshot->read_section<global_property_object>([&db=this->db]( auto &section ) {
v3 legacy_global_properties;
section.read_row(legacy_global_properties, db);

db.create<global_property_object>([&legacy_global_properties](auto& gpo ){
gpo.initalize_from(legacy_global_properties, kv_config{});
});
});
return; // early out to avoid default processing
}
}

// skip the kv index if the snapshot doesn't contain it
if constexpr (std::is_same_v<value_t, kv_object>) {
if ( header.version < kv_object::minimum_snapshot_version )
return;
}

snapshot->read_section<value_t>([this]( auto& section ) {
bool more = !section.empty();
while(more) {
Expand All @@ -981,7 +1003,7 @@ struct controller_impl {
read_contract_tables_from_snapshot(snapshot);

authorization.read_from_snapshot(snapshot);
resource_limits.read_from_snapshot(snapshot);
resource_limits.read_from_snapshot(snapshot, header.version);

db.set_revision( head->block_num );
db.create<database_header_object>([](const auto& header){
Expand Down Expand Up @@ -1034,10 +1056,10 @@ struct controller_impl {

std::string event_id;
if (get_deep_mind_logger() != nullptr) {
event_id = RAM_EVENT_ID("${name}", ("name", name));
event_id = STORAGE_EVENT_ID("${name}", ("name", name));
}

resource_limits.add_pending_ram_usage(name, ram_delta, ram_trace(0, event_id.c_str(), "account", "add", "newaccount"));
resource_limits.add_pending_ram_usage(name, ram_delta, storage_usage_trace(0, event_id.c_str(), "account", "add", "newaccount"));
resource_limits.verify_account_ram_usage(name);
}

Expand All @@ -1059,6 +1081,7 @@ struct controller_impl {
genesis.initial_configuration.validate();
db.create<global_property_object>([&genesis,&chain_id=this->chain_id](auto& gpo ){
gpo.configuration = genesis.initial_configuration;
gpo.kv_configuration = kv_config{};
gpo.chain_id = chain_id;
});

Expand Down Expand Up @@ -1191,11 +1214,11 @@ struct controller_impl {
int64_t remove_scheduled_transaction( const generated_transaction_object& gto ) {
std::string event_id;
if (get_deep_mind_logger() != nullptr) {
event_id = RAM_EVENT_ID("${id}", ("id", gto.id));
event_id = STORAGE_EVENT_ID("${id}", ("id", gto.id));
}

int64_t ram_delta = -(config::billable_size_v<generated_transaction_object> + gto.packed_trx.size());
resource_limits.add_pending_ram_usage( gto.payer, ram_delta, ram_trace(0, event_id.c_str(), "deferred_trx", "remove", "deferred_trx_removed") );
resource_limits.add_pending_ram_usage( gto.payer, ram_delta, storage_usage_trace(0, event_id.c_str(), "deferred_trx", "remove", "deferred_trx_removed") );
// No need to verify_account_ram_usage since we are only reducing memory

db.remove( gto );
Expand Down Expand Up @@ -3436,7 +3459,7 @@ void controller::replace_account_keys( name account, name permission, const publ
p.auth = authority(key);
});
int64_t new_size = (int64_t)(chain::config::billable_size_v<permission_object> + perm->auth.get_billable_size());
rlm.add_pending_ram_usage(account, new_size - old_size, generic_ram_trace(0));
rlm.add_pending_ram_usage(account, new_size - old_size, generic_storage_usage_trace(0));
rlm.verify_account_ram_usage(account);
}

Expand Down Expand Up @@ -3471,10 +3494,10 @@ void controller_impl::on_activation<builtin_protocol_feature_t::replace_deferred

std::string event_id;
if (get_deep_mind_logger() != nullptr) {
event_id = RAM_EVENT_ID("${id}", ("id", itr->id._id));
event_id = STORAGE_EVENT_ID("${id}", ("id", itr->id._id));
}

resource_limits.add_pending_ram_usage( itr->name, ram_delta, ram_trace(0, event_id.c_str(), "deferred_trx", "correction", "deferred_trx_ram_correction") );
resource_limits.add_pending_ram_usage( itr->name, ram_delta, storage_usage_trace(0, event_id.c_str(), "deferred_trx", "correction", "deferred_trx_ram_correction") );
db.remove( *itr );
}
}
Expand All @@ -3500,6 +3523,31 @@ void controller_impl::on_activation<builtin_protocol_feature_t::action_return_va
} );
}

template<>
void controller_impl::on_activation<builtin_protocol_feature_t::kv_database>() {
db.modify( db.get<protocol_state_object>(), [&]( auto& ps ) {
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_erase" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_set" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_get" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_get_data" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_it_create" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_it_destroy" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_it_status" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_it_compare" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_it_key_compare" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_it_move_to_end" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_it_next" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_it_prev" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_it_lower_bound" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_it_key" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "kv_it_value" );
// resource management
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "set_resource_limit" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "get_resource_limit" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "set_kv_parameters_packed" );
add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "get_kv_parameters_packed" );
} );
}


/// End of protocol feature activation handlers
Expand Down
32 changes: 16 additions & 16 deletions libraries/chain/eosio_contract.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,10 @@ void apply_eosio_newaccount(apply_context& context) {

std::string event_id;
if (context.control.get_deep_mind_logger() != nullptr) {
event_id = RAM_EVENT_ID("${name}", ("name", create.name));
event_id = STORAGE_EVENT_ID("${name}", ("name", create.name));
}

context.add_ram_usage(create.name, ram_delta, ram_trace(context.get_action_id(), event_id.c_str(), "account", "add", "newaccount"));
context.add_ram_usage(create.name, ram_delta, storage_usage_trace(context.get_action_id(), event_id.c_str(), "account", "add", "newaccount"));

} FC_CAPTURE_AND_RETHROW( (create) ) }

Expand Down Expand Up @@ -206,10 +206,10 @@ void apply_eosio_setcode(apply_context& context) {
operation = "remove";
}

event_id = RAM_EVENT_ID("${account}", ("account", act.account));
event_id = STORAGE_EVENT_ID("${account}", ("account", act.account));
}

context.add_ram_usage( act.account, new_size - old_size, ram_trace(context.get_action_id(), event_id.c_str(), "code", operation.c_str(), "setcode") );
context.add_ram_usage( act.account, new_size - old_size, storage_usage_trace(context.get_action_id(), event_id.c_str(), "code", operation.c_str(), "setcode") );
}
}

Expand Down Expand Up @@ -246,10 +246,10 @@ void apply_eosio_setabi(apply_context& context) {
operation = "remove";
}

event_id = RAM_EVENT_ID("${account}", ("account", act.account));
event_id = STORAGE_EVENT_ID("${account}", ("account", act.account));
}

context.add_ram_usage( act.account, new_size - old_size, ram_trace(context.get_action_id(), event_id.c_str(), "abi", operation.c_str(), "setabi") );
context.add_ram_usage( act.account, new_size - old_size, storage_usage_trace(context.get_action_id(), event_id.c_str(), "abi", operation.c_str(), "setabi") );
}
}

Expand Down Expand Up @@ -309,21 +309,21 @@ void apply_eosio_updateauth(apply_context& context) {

std::string event_id;
if (context.control.get_deep_mind_logger() != nullptr) {
event_id = RAM_EVENT_ID("${id}", ("id", permission->id));
event_id = STORAGE_EVENT_ID("${id}", ("id", permission->id));
}

context.add_ram_usage( permission->owner, new_size - old_size, ram_trace(context.get_action_id(), event_id.c_str(), "auth", "update", "updateauth_update") );
context.add_ram_usage( permission->owner, new_size - old_size, storage_usage_trace(context.get_action_id(), event_id.c_str(), "auth", "update", "updateauth_update") );
} else {
const auto& p = authorization.create_permission( update.account, update.permission, parent_id, update.auth, context.get_action_id() );

int64_t new_size = (int64_t)(config::billable_size_v<permission_object> + p.auth.get_billable_size());

std::string event_id;
if (context.control.get_deep_mind_logger() != nullptr) {
event_id = RAM_EVENT_ID("${id}", ("id", p.id));
event_id = STORAGE_EVENT_ID("${id}", ("id", p.id));
}

context.add_ram_usage( update.account, new_size, ram_trace(context.get_action_id(), event_id.c_str(), "auth", "add", "updateauth_create") );
context.add_ram_usage( update.account, new_size, storage_usage_trace(context.get_action_id(), event_id.c_str(), "auth", "add", "updateauth_create") );
}
}

Expand Down Expand Up @@ -354,12 +354,12 @@ void apply_eosio_deleteauth(apply_context& context) {

std::string event_id;
if (context.control.get_deep_mind_logger() != nullptr) {
event_id = RAM_EVENT_ID("${id}", ("id", permission.id));
event_id = STORAGE_EVENT_ID("${id}", ("id", permission.id));
}

authorization.remove_permission( permission, context.get_action_id() );

context.add_ram_usage( remove.account, -old_size, ram_trace(context.get_action_id(), event_id.c_str(), "auth", "remove", "deleteauth") );
context.add_ram_usage( remove.account, -old_size, storage_usage_trace(context.get_action_id(), event_id.c_str(), "auth", "remove", "deleteauth") );
}

void apply_eosio_linkauth(apply_context& context) {
Expand Down Expand Up @@ -411,13 +411,13 @@ void apply_eosio_linkauth(apply_context& context) {

std::string event_id;
if (context.control.get_deep_mind_logger() != nullptr) {
event_id = RAM_EVENT_ID("${id}", ("id", l.id));
event_id = STORAGE_EVENT_ID("${id}", ("id", l.id));
}

context.add_ram_usage(
l.account,
(int64_t)(config::billable_size_v<permission_link_object>),
ram_trace(context.get_action_id(), event_id.c_str(), "auth_link", "add", "linkauth")
storage_usage_trace(context.get_action_id(), event_id.c_str(), "auth_link", "add", "linkauth")
);
}

Expand All @@ -438,13 +438,13 @@ void apply_eosio_unlinkauth(apply_context& context) {

std::string event_id;
if (context.control.get_deep_mind_logger() != nullptr) {
event_id = RAM_EVENT_ID("${id}", ("id", link->id));
event_id = STORAGE_EVENT_ID("${id}", ("id", link->id));
}

context.add_ram_usage(
link->account,
-(int64_t)(config::billable_size_v<permission_link_object>),
ram_trace(context.get_action_id(), event_id.c_str(), "auth_link", "remove", "unlinkauth")
storage_usage_trace(context.get_action_id(), event_id.c_str(), "auth_link", "remove", "unlinkauth")
);

db.remove(*link);
Expand Down
Loading