Skip to content

Commit 5717d01

Browse files
authored
Optimize resolver collection performance in CommitProxyServer (#12391)
1 parent e5bbe1b commit 5717d01

File tree

1 file changed

+25
-8
lines changed

1 file changed

+25
-8
lines changed

fdbserver/CommitProxyServer.actor.cpp

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,18 +154,27 @@ struct ResolutionRequestBuilder {
154154
for (int idx = 0; idx < trIn.read_conflict_ranges.size(); ++idx) {
155155
const auto& r = trIn.read_conflict_ranges[idx];
156156
auto ranges = self->keyResolvers.intersectingRanges(r);
157-
std::set<int> resolvers;
157+
std::vector<int> resolvers;
158+
resolvers.reserve(self->resolvers.size());
159+
// O(1) de-dup keyed by resolver id (deterministic)
160+
std::vector<unsigned char> seen(self->resolvers.size(), 0);
158161
for (auto& ir : ranges) {
159162
auto& version_resolver = ir.value();
160163
for (int i = version_resolver.size() - 1; i >= 0; i--) {
161-
resolvers.insert(version_resolver[i].second);
164+
const int resolver_id = version_resolver[i].second;
165+
if (!seen[resolver_id]) {
166+
seen[resolver_id] = 1;
167+
resolvers.push_back(resolver_id);
168+
}
162169
if (version_resolver[i].first < trIn.read_snapshot)
163170
break;
164171
}
165172
}
166173
if (SERVER_KNOBS->PROXY_USE_RESOLVER_PRIVATE_MUTATIONS && systemKeys.intersects(r)) {
167-
for (int k = 0; k < self->resolvers.size(); k++) {
168-
resolvers.insert(k);
174+
// All resolvers are eligible; skip per-id de-dup and just fill 0..N-1.
175+
resolvers.clear();
176+
for (int k = 0; k < self->resolvers.size(); ++k) {
177+
resolvers.push_back(k);
169178
}
170179
}
171180
ASSERT(resolvers.size());
@@ -181,16 +190,24 @@ struct ResolutionRequestBuilder {
181190
void addWriteConflictRanges(CommitTransactionRef& trIn) {
182191
for (auto& r : trIn.write_conflict_ranges) {
183192
auto ranges = self->keyResolvers.intersectingRanges(r);
184-
std::set<int> resolvers;
193+
std::vector<int> resolvers;
194+
resolvers.reserve(self->resolvers.size());
195+
std::vector<unsigned char> seen(self->resolvers.size(), 0);
185196
for (auto& ir : ranges) {
186197
auto& version_resolver = ir.value();
187198
if (!version_resolver.empty()) {
188-
resolvers.insert(version_resolver.back().second);
199+
const int resolver_id = version_resolver.back().second;
200+
if (!seen[resolver_id]) {
201+
seen[resolver_id] = 1;
202+
resolvers.push_back(resolver_id);
203+
}
189204
}
190205
}
191206
if (SERVER_KNOBS->PROXY_USE_RESOLVER_PRIVATE_MUTATIONS && systemKeys.intersects(r)) {
192-
for (int k = 0; k < self->resolvers.size(); k++) {
193-
resolvers.insert(k);
207+
// All resolvers are eligible.
208+
resolvers.clear();
209+
for (int k = 0; k < self->resolvers.size(); ++k) {
210+
resolvers.push_back(k);
194211
}
195212
}
196213
ASSERT(resolvers.size());

0 commit comments

Comments
 (0)