Skip to content

Commit 7b28bb4

Browse files
committed
clean up the wawaka kvstore table more thoroughly
move kvstore clean up into its own function. this replaces the exception with a more thorough cleanup to ensure that the memory is released. make a few variables in the state extensions constant that should have been constant from the start Signed-off-by: Mic Bowman <mic.bowman@intel.com>
1 parent fcb66f1 commit 7b28bb4

File tree

3 files changed

+47
-22
lines changed

3 files changed

+47
-22
lines changed

common/interpreter/wawaka_wasm/WasmStateExtensions.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,14 @@ extern "C" bool key_value_set_wrapper(
8181
if (state == NULL)
8282
return false;
8383

84-
if (key_buffer == NULL)
84+
if (key_buffer == NULL || key_buffer_length == 0)
8585
return false;
8686

8787
if (val_buffer == NULL)
8888
return false;
8989

90-
ByteArray ba_key(key_buffer, key_buffer + key_buffer_length);
91-
ByteArray ba_val(val_buffer, val_buffer + val_buffer_length);
90+
const ByteArray ba_key(key_buffer, key_buffer + key_buffer_length);
91+
const ByteArray ba_val(val_buffer, val_buffer + val_buffer_length);
9292

9393
state->UnprivilegedPut(ba_key, ba_val);
9494
return true;
@@ -120,10 +120,10 @@ extern "C" bool key_value_get_wrapper(
120120
if (state == NULL)
121121
return false;
122122

123-
if (key_buffer == NULL)
123+
if (key_buffer == NULL || key_buffer_length == 0)
124124
return false;
125125

126-
ByteArray ba_key(key_buffer, key_buffer + key_buffer_length);
126+
const ByteArray ba_key(key_buffer, key_buffer + key_buffer_length);
127127
ByteArray ba_val = state->UnprivilegedGet(ba_key);
128128

129129
if (ba_val.size() == 0)
@@ -162,10 +162,10 @@ extern "C" bool privileged_key_value_get_wrapper(
162162
if (state == NULL)
163163
return false;
164164

165-
if (key_buffer == NULL)
165+
if (key_buffer == NULL || key_buffer_length == 0)
166166
return false;
167167

168-
ByteArray ba_key(key_buffer, key_buffer + key_buffer_length);
168+
const ByteArray ba_key(key_buffer, key_buffer + key_buffer_length);
169169
ByteArray ba_val = state->PrivilegedGet(ba_key);
170170

171171
if (ba_val.size() == 0)
@@ -206,7 +206,7 @@ extern "C" int32 key_value_create_wrapper(
206206
return false;
207207
}
208208

209-
ByteArray ba_encryption_key(aes_key_buffer, aes_key_buffer + aes_key_buffer_length);
209+
const ByteArray ba_encryption_key(aes_key_buffer, aes_key_buffer + aes_key_buffer_length);
210210

211211
// find an empty slot we can use for the kv store
212212
pstate::Basic_KV_Plus** kv_store_pool = (pstate::Basic_KV_Plus**)wasm_runtime_get_custom_data(module_inst);
@@ -258,15 +258,15 @@ extern "C" int32 key_value_open_wrapper(
258258
if (id_hash_buffer == NULL || id_hash_buffer_length <= 0)
259259
return false;
260260

261-
ByteArray ba_id_hash(id_hash_buffer, id_hash_buffer + id_hash_buffer_length);
261+
const ByteArray ba_id_hash(id_hash_buffer, id_hash_buffer + id_hash_buffer_length);
262262

263263
if (aes_key_buffer == NULL || aes_key_buffer_length != pdo::crypto::constants::SYM_KEY_LEN)
264264
{
265265
SAFE_LOG(PDO_LOG_ERROR, "invalid encryption key; %d", aes_key_buffer_length);
266266
return false;
267267
}
268268

269-
ByteArray ba_encryption_key(aes_key_buffer, aes_key_buffer + aes_key_buffer_length);
269+
const ByteArray ba_encryption_key(aes_key_buffer, aes_key_buffer + aes_key_buffer_length);
270270

271271
// find an empty slot we can use for the kv store
272272
pstate::Basic_KV_Plus** kv_store_pool = (pstate::Basic_KV_Plus**)wasm_runtime_get_custom_data(module_inst);
@@ -325,6 +325,7 @@ extern "C" bool key_value_finalize_wrapper(
325325
// Call finalize and cross your fingers
326326
ByteArray ba_val;
327327

328+
SAFE_LOG(PDO_LOG_INFO, "finalizing key/value store");
328329
state->Finalize(ba_val);
329330
if (ba_val.size() == 0)
330331
{

common/interpreter/wawaka_wasm/WawakaInterpreter.cpp

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,36 @@ int wasm_printer(const char *msg)
8686
// Should be defined in WasmExtensions.cpp
8787
extern bool InitializeNativeSymbols(RuntimeInitArgs& init_args);
8888

89+
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
90+
bool WawakaInterpreter::close_kv_store(void)
91+
{
92+
bool result = true;
93+
ByteArray statehash;
94+
95+
for (size_t i = 1; i < kv_store_pool_.size(); i++)
96+
{
97+
if (kv_store_pool_[i] == NULL)
98+
continue;
99+
100+
result = false;
101+
102+
SAFE_LOG(PDO_LOG_WARNING, "kv_store_pool_ slot not finalized: %u", i);
103+
try {
104+
kv_store_pool_[i]->Finalize(statehash);
105+
delete kv_store_pool_[i];
106+
kv_store_pool_[i] = NULL;
107+
}
108+
catch (std::exception& e)
109+
{
110+
// Only log the exception here
111+
SAFE_LOG(PDO_LOG_ERROR, "Exception occured while finalizing outstanding state pool: %s", e.what());
112+
}
113+
}
114+
115+
// returns false if there were any outstanding kv stores
116+
return result;
117+
}
118+
89119
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
90120
void WawakaInterpreter::parse_response_string(
91121
int32 response_app,
@@ -403,12 +433,8 @@ void WawakaInterpreter::create_initial_contract_state(
403433
std::map<std::string,std::string> outDependencies;
404434
parse_response_string(response_app, outMessageResult, outStateChangedFlag, outDependencies);
405435

406-
// We could throw an exception if the store is not finalized
407-
// or we could just finalize and throw away the block id, which
408-
// effectively loses access to the kv store, seems like throwing
409-
// an exception is the right idea
410-
for (size_t i = 1; i < kv_store_pool_.size(); i++)
411-
pe::ThrowIf<pe::RuntimeError>(kv_store_pool_[i] != NULL, "failed to close contract KV store");
436+
// for the moment, not closing the kv store is bad practice but not an error
437+
(void) close_kv_store();
412438

413439
// this should be in finally... later...
414440
wasm_runtime_set_custom_data(wasm_module_inst_, NULL);
@@ -443,12 +469,8 @@ void WawakaInterpreter::send_message_to_contract(
443469
int32 response_app = evaluate_function(inMessage.Message, env);
444470
parse_response_string(response_app, outMessageResult, outStateChangedFlag, outDependencies);
445471

446-
// We could throw an exception if the store is not finalized
447-
// or we could just finalize and throw away the block id, which
448-
// effectively loses access to the kv store, seems like throwing
449-
// an exception is the right idea
450-
for (size_t i = 1; i < kv_store_pool_.size(); i++)
451-
pe::ThrowIf<pe::RuntimeError>(kv_store_pool_[i] != NULL, "failed to close contract KV store");
472+
// for the moment, not closing the kv store is bad practice but not an error
473+
(void) close_kv_store();
452474

453475
// this should be in finally... later...
454476
wasm_runtime_set_custom_data(wasm_module_inst_, NULL);

common/interpreter/wawaka_wasm/WawakaInterpreter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class WawakaInterpreter : public pc::ContractInterpreter
5151
wasm_module_inst_t wasm_module_inst_ = NULL;
5252
wasm_exec_env_t wasm_exec_env_ = NULL;
5353

54+
bool close_kv_store(void);
55+
5456
void parse_response_string(
5557
int32 response_app,
5658
std::string& outResult,

0 commit comments

Comments
 (0)