mirror of
https://github.com/dragonflydb/dragonfly.git
synced 2025-05-11 02:15:45 +02:00
refactor client tracking, fix atomicity, squashing and multi/exec (#2970)
* add partial support for CLIENT CACHING TRUE (only to be used with TRACKING OPTIN) * add OPTIN to CLIENT TRACKING command * refactor client tracking to respect transactional atomicity * fixed multi/exec and disabled squashing with client tracking * add tests
This commit is contained in:
parent
6e6c91aeaf
commit
b1063f7823
11 changed files with 351 additions and 87 deletions
|
@ -1423,24 +1423,29 @@ void DbSlice::SendInvalidationTrackingMessage(std::string_view key) {
|
|||
return;
|
||||
|
||||
auto it = client_tracking_map_.find(key);
|
||||
if (it != client_tracking_map_.end()) {
|
||||
// notify all the clients.
|
||||
auto& client_set = it->second;
|
||||
auto cb = [key, client_set = std::move(client_set)](unsigned idx, util::ProactorBase*) {
|
||||
for (auto it = client_set.begin(); it != client_set.end(); ++it) {
|
||||
if ((unsigned int)it->Thread() != idx)
|
||||
continue;
|
||||
facade::Connection* conn = it->Get();
|
||||
if ((conn != nullptr) && conn->IsTrackingOn()) {
|
||||
std::string key_str = {key.begin(), key.end()};
|
||||
conn->SendInvalidationMessageAsync({key_str});
|
||||
}
|
||||
}
|
||||
};
|
||||
shard_set->pool()->DispatchBrief(std::move(cb));
|
||||
// remove this key from the tracking table as the key no longer exists
|
||||
client_tracking_map_.erase(key);
|
||||
if (it == client_tracking_map_.end()) {
|
||||
return;
|
||||
}
|
||||
auto& client_set = it->second;
|
||||
// Notify all the clients. We copy key because we dispatch briefly below and
|
||||
// we need to preserve its lifetime
|
||||
// TODO this key is further copied within DispatchFiber. Fix this.
|
||||
auto cb = [key = std::string(key), client_set = std::move(client_set)](unsigned idx,
|
||||
util::ProactorBase*) {
|
||||
for (auto& client : client_set) {
|
||||
if (client.IsExpired() || (client.Thread() != idx)) {
|
||||
continue;
|
||||
}
|
||||
auto* conn = client.Get();
|
||||
auto* cntx = static_cast<ConnectionContext*>(conn->cntx());
|
||||
if (cntx && cntx->conn_state.tracking_info_.IsTrackingOn()) {
|
||||
conn->SendInvalidationMessageAsync({key});
|
||||
}
|
||||
}
|
||||
};
|
||||
shard_set->pool()->DispatchBrief(std::move(cb));
|
||||
// remove this key from the tracking table as the key no longer exists
|
||||
client_tracking_map_.erase(key);
|
||||
}
|
||||
|
||||
void DbSlice::PerformDeletion(PrimeIterator del_it, DbTable* table) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue