Skip to content

Commit b9e3013

Browse files
authored
Forget old tx ids (#13051)
1 parent 3899367 commit b9e3013

File tree

1 file changed

+51
-2
lines changed

1 file changed

+51
-2
lines changed

ydb/core/tx/replication/service/service.cpp

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,20 @@
2222
namespace NKikimr::NReplication::NService {
2323

2424
class TSessionInfo {
25+
struct TWorkerInfo {
26+
const TActorId ActorId;
27+
TRowVersion Heartbeat;
28+
29+
explicit TWorkerInfo(const TActorId& actorId)
30+
: ActorId(actorId)
31+
{
32+
}
33+
34+
operator TActorId() const {
35+
return ActorId;
36+
}
37+
};
38+
2539
public:
2640
explicit TSessionInfo(const TActorId& actorId)
2741
: ActorId(actorId)
@@ -180,7 +194,40 @@ class TSessionInfo {
180194
}
181195

182196
void Handle(IActorOps* ops, TEvService::TEvHeartbeat::TPtr& ev) {
183-
GetWorkerId(ev->Sender).Serialize(*ev->Get()->Record.MutableWorker());
197+
const auto id = GetWorkerId(ev->Sender);
198+
if (!Workers.contains(id)) {
199+
return;
200+
}
201+
202+
auto& worker = Workers.at(id);
203+
auto& record = ev->Get()->Record;
204+
const auto version = TRowVersion::FromProto(record.GetVersion());
205+
206+
if (const auto& prevVersion = worker.Heartbeat) {
207+
if (version <= prevVersion) {
208+
return;
209+
}
210+
211+
auto it = WorkersByHeartbeat.find(prevVersion);
212+
if (it != WorkersByHeartbeat.end()) {
213+
it->second.erase(id);
214+
if (it->second.empty()) {
215+
WorkersByHeartbeat.erase(it);
216+
}
217+
}
218+
}
219+
220+
worker.Heartbeat = version;
221+
WorkersWithHeartbeat.insert(id);
222+
WorkersByHeartbeat[version].insert(id);
223+
224+
if (Workers.size() == WorkersWithHeartbeat.size()) {
225+
while (!TxIds.empty() && WorkersByHeartbeat.begin()->first < TxIds.begin()->first) {
226+
TxIds.erase(TxIds.begin());
227+
}
228+
}
229+
230+
id.Serialize(*record.MutableWorker());
184231
ops->Send(ActorId, ev->ReleaseBase().Release(), ev->Flags, ev->Cookie);
185232
}
186233

@@ -206,11 +253,13 @@ class TSessionInfo {
206253
private:
207254
TActorId ActorId;
208255
ui64 Generation;
209-
THashMap<TWorkerId, TActorId> Workers;
256+
THashMap<TWorkerId, TWorkerInfo> Workers;
210257
THashMap<TActorId, TWorkerId> ActorIdToWorkerId;
211258

212259
TMap<TRowVersion, ui64> TxIds;
213260
TMap<TRowVersion, THashSet<TActorId>> PendingTxId;
261+
THashSet<TWorkerId> WorkersWithHeartbeat;
262+
TMap<TRowVersion, THashSet<TWorkerId>> WorkersByHeartbeat;
214263

215264
}; // TSessionInfo
216265

0 commit comments

Comments
 (0)