From b067a6e5889870c1621ecaaccabcce977ab092e5 Mon Sep 17 00:00:00 2001 From: Tim Wojtulewicz Date: Mon, 10 Mar 2025 15:06:19 -0700 Subject: [PATCH] Redis: Fix sync erase, add btest for it --- src/storage/backend/redis/Redis.cc | 22 ++++----- .../out | 7 +++ .../base/frameworks/storage/redis-erase.zeek | 48 +++++++++++++++++++ 3 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 testing/btest/Baseline/scripts.base.frameworks.storage.redis-erase/out create mode 100644 testing/btest/scripts/base/frameworks/storage/redis-erase.zeek diff --git a/src/storage/backend/redis/Redis.cc b/src/storage/backend/redis/Redis.cc index 0cd2ca004c..869d89a22a 100644 --- a/src/storage/backend/redis/Redis.cc +++ b/src/storage/backend/redis/Redis.cc @@ -447,21 +447,17 @@ void Redis::HandleGetResult(redisReply* reply, OperationResultCallback* callback void Redis::HandleEraseResult(redisReply* reply, OperationResultCallback* callback) { --active_ops; - if ( callback->IsSyncCallback() ) - reply_queue.push_back(reply); - else { - OperationResult res{ReturnCode::SUCCESS}; + OperationResult res{ReturnCode::SUCCESS}; - if ( ! connected ) - res = {ReturnCode::NOT_CONNECTED}; - else if ( ! reply ) - res = {ReturnCode::OPERATION_FAILED, "Async erase operation returned null reply"}; - else if ( reply && reply->type == REDIS_REPLY_ERROR ) - res = {ReturnCode::OPERATION_FAILED, util::fmt("Async erase operation failed: %s", reply->str)}; + if ( ! connected ) + res = {ReturnCode::NOT_CONNECTED}; + else if ( ! reply ) + res = {ReturnCode::OPERATION_FAILED, "Async erase operation returned null reply"}; + else if ( reply && reply->type == REDIS_REPLY_ERROR ) + res = {ReturnCode::OPERATION_FAILED, util::fmt("Async erase operation failed: %s", reply->str)}; - freeReplyObject(reply); - CompleteCallback(callback, res); - } + freeReplyObject(reply); + CompleteCallback(callback, res); } void Redis::HandleGeneric(redisReply* reply) { diff --git a/testing/btest/Baseline/scripts.base.frameworks.storage.redis-erase/out b/testing/btest/Baseline/scripts.base.frameworks.storage.redis-erase/out new file mode 100644 index 0000000000..c6ddb5d53b --- /dev/null +++ b/testing/btest/Baseline/scripts.base.frameworks.storage.redis-erase/out @@ -0,0 +1,7 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +open_result, [code=Storage::SUCCESS, error_str=, value=] +put result, [code=Storage::SUCCESS, error_str=, value=] +get result, [code=Storage::SUCCESS, error_str=, value=value1234] +get result same as inserted, T +erase result, [code=Storage::SUCCESS, error_str=, value=] +get result 2, [code=Storage::KEY_NOT_FOUND, error_str=, value=] diff --git a/testing/btest/scripts/base/frameworks/storage/redis-erase.zeek b/testing/btest/scripts/base/frameworks/storage/redis-erase.zeek new file mode 100644 index 0000000000..edc3752958 --- /dev/null +++ b/testing/btest/scripts/base/frameworks/storage/redis-erase.zeek @@ -0,0 +1,48 @@ +# @TEST-DOC: Tests basic Redis storage backend functions in sync mode, including overwriting + +# @TEST-REQUIRES: have-redis +# @TEST-PORT: REDIS_PORT + +# @TEST-EXEC: btest-bg-run redis-server run-redis-server ${REDIS_PORT%/tcp} +# @TEST-EXEC: zeek -b %INPUT | sed 's|=[0-9]*/tcp|=xxxx/tcp|g' > out +# @TEST-EXEC: btest-bg-wait -k 0 + +# @TEST-EXEC: btest-diff out + +@load base/frameworks/storage/sync +@load policy/frameworks/storage/backend/redis + +# Create a typename here that can be passed down into open_backend() +type str: string; + +event zeek_init() + { + local opts: Storage::BackendOptions; + opts$redis = [ $server_host="127.0.0.1", $server_port=to_port(getenv( + "REDIS_PORT")), $key_prefix="testing" ]; + + local key = "key1234"; + local value = "value1234"; + + local open_res = Storage::Sync::open_backend(Storage::REDIS, opts, str, str); + print "open_result", open_res; + + local b = open_res$value; + + local res = Storage::Sync::put(b, [ $key=key, $value=value ]); + print "put result", res; + + res = Storage::Sync::get(b, key); + print "get result", res; + if ( res$code == Storage::SUCCESS && res?$value ) + print "get result same as inserted", value == ( res$value as string ); + + res = Storage::Sync::erase(b, key); + print "erase result", res; + + res = Storage::Sync::get(b, key); + if ( res$code != Storage::SUCCESS ) + print "get result 2", res; + + Storage::Sync::close_backend(b); + }