Fix handling of timeout conditions from storage backends

This commit is contained in:
Tim Wojtulewicz 2025-03-24 17:43:44 -07:00
parent 046f32a6df
commit 85701e4514
5 changed files with 43 additions and 9 deletions

View file

@ -12,3 +12,7 @@ results of trying to use closed handle: get: Storage::NOT_CONNECTED, put: Storag
open result 2, [code=Storage::OPERATION_FAILED, error_str=Failed to open backend Storage::STORAGEDUMMY: open_fail was set to true, returning error, value=<opaque of BackendHandleVal>]
close result on closed handle, [code=Storage::NOT_CONNECTED, error_str=Backend is closed, value=<uninitialized>]
open result 3, [code=Storage::SUCCESS, error_str=<uninitialized>, value=<opaque of BackendHandleVal>]
put timed out
close result, [code=Storage::SUCCESS, error_str=<uninitialized>, value=<uninitialized>]

View file

@ -21,8 +21,8 @@ BackendPtr StorageDummy::Instantiate(std::string_view tag) { return make_intrusi
* with a corresponding message.
*/
OperationResult StorageDummy::DoOpen(OpenResultCallback* cb, RecordValPtr options) {
RecordValPtr backend_options = options->GetField<RecordVal>("dummy");
bool open_fail = backend_options->GetField<BoolVal>("open_fail")->Get();
RecordValPtr dummy_options = options->GetField<RecordVal>("dummy");
bool open_fail = dummy_options->GetField<BoolVal>("open_fail")->Get();
if ( open_fail )
return {ReturnCode::OPERATION_FAILED, "open_fail was set to true, returning error"};
@ -44,6 +44,11 @@ OperationResult StorageDummy::DoClose(ResultCallback* cb) {
*/
OperationResult StorageDummy::DoPut(ResultCallback* cb, ValPtr key, ValPtr value, bool overwrite,
double expiration_time) {
RecordValPtr dummy_options = backend_options->GetField<RecordVal>("dummy");
bool timeout_put = dummy_options->GetField<BoolVal>("timeout_put")->Get();
if ( timeout_put )
return {ReturnCode::TIMEOUT};
auto json_key = key->ToJSON()->ToStdString();
auto json_value = value->ToJSON()->ToStdString();
data[json_key] = json_value;

View file

@ -8,10 +8,12 @@
# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff output
# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff zeek-stderr
@load base/frameworks/storage/async
@load base/frameworks/storage/sync
type StorageDummyOpts : record {
open_fail: bool;
timeout_put: bool;
};
redef record Storage::BackendOptions += {
@ -20,7 +22,7 @@ redef record Storage::BackendOptions += {
event zeek_init() {
local opts : Storage::BackendOptions;
opts$dummy = [$open_fail = F];
opts$dummy = [$open_fail = F, $timeout_put = F];
local key = "key1234";
local value = "value5678";
@ -60,9 +62,26 @@ event zeek_init() {
print "";
# Test failing to open the handle and test closing an invalid handle.
opts$dummy = [$open_fail = T];
opts$dummy = [$open_fail = T, $timeout_put = F];
res = Storage::Sync::open_backend(Storage::STORAGEDUMMY, opts, string, string);
print "open result 2", res;
res = Storage::Sync::close_backend(res$value);
print "close result on closed handle", res;
print "";
# Test timing out an async put request.
opts$dummy = [$open_fail = F, $timeout_put = T];
res = Storage::Sync::open_backend(Storage::STORAGEDUMMY, opts, string, string);
print "open result 3", res;
b = res$value;
when [b, key, value] ( local res2 = Storage::Async::put(b, [$key=key, $value=value]) ) {
local when_res = Storage::Sync::close_backend(b);
print "FAIL: should not happen: close result", when_res;
}
timeout 5sec {
print "put timed out";
local to_res = Storage::Sync::close_backend(b);
print "close result", to_res;
}
}