@@ -154,18 +154,27 @@ struct ResolutionRequestBuilder {
154
154
for (int idx = 0 ; idx < trIn.read_conflict_ranges .size (); ++idx) {
155
155
const auto & r = trIn.read_conflict_ranges [idx];
156
156
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 );
158
161
for (auto & ir : ranges) {
159
162
auto & version_resolver = ir.value ();
160
163
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
+ }
162
169
if (version_resolver[i].first < trIn.read_snapshot )
163
170
break ;
164
171
}
165
172
}
166
173
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);
169
178
}
170
179
}
171
180
ASSERT (resolvers.size ());
@@ -181,16 +190,24 @@ struct ResolutionRequestBuilder {
181
190
void addWriteConflictRanges (CommitTransactionRef& trIn) {
182
191
for (auto & r : trIn.write_conflict_ranges ) {
183
192
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 );
185
196
for (auto & ir : ranges) {
186
197
auto & version_resolver = ir.value ();
187
198
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
+ }
189
204
}
190
205
}
191
206
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);
194
211
}
195
212
}
196
213
ASSERT (resolvers.size ());
0 commit comments