Aetherance commented on code in PR #3541:
URL: https://github.com/apache/kvrocks/pull/3541#discussion_r3689473915


##########
src/commands/cmd_key.cc:
##########
@@ -372,9 +374,17 @@ class CommandDel : public Commander {
     uint64_t cnt = 0;
     redis::Database redis(srv->storage, conn->GetNamespace());
 
-    auto s = redis.MDel(ctx, keys, &cnt);
+    const bool notify_del = GetAttributes()->name == "del" && 
conn->IsKeyspaceEventEnabled(kNotifyGeneric);
+    std::vector<rocksdb::Slice> deleted_keys;
+    if (notify_del) deleted_keys.reserve(keys.size());
+
+    auto s = redis.MDel(ctx, keys, &cnt, notify_del ? &deleted_keys : nullptr);
     if (!s.ok()) return {Status::RedisExecErr, s.ToString()};
 
+    for (const auto &key : deleted_keys) {
+      conn->AddKeyspaceEvent(kNotifyGeneric, "del", 
std::string_view(key.data(), key.size()));
+    }
+

Review Comment:
   Thank you for the patient explanation.
   
   I considered emitting the notification directly here when I first started 
implementing this PR, since this is indeed the cleanest place to access the 
complete semantics of the operation. I ultimately decided against it for the 
following reasons, which I hope help explain the decision:
   
   The main reason is that this layer has no access to `Server` or 
`Connection`, so it cannot call `PublishMessage`. I also don't think the 
storage layer should be responsible for publishing messages.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to