2
2
#include " hive_impl.h"
3
3
#include " object_distribution.h"
4
4
5
+ #include < util/datetime/cputimer.h>
5
6
#include < util/stream/null.h>
6
7
7
8
#include < map>
@@ -16,7 +17,7 @@ using namespace NHive;
16
17
#define Ctest Cerr
17
18
#endif
18
19
19
- Y_UNIT_TEST_SUITE (ObjectDistribuiton ) {
20
+ Y_UNIT_TEST_SUITE (ObjectDistribution ) {
20
21
Y_UNIT_TEST (TestImbalanceCalcualtion) {
21
22
static constexpr size_t NUM_NODES = 8 ;
22
23
static constexpr size_t NUM_OBJECTS = 250 ;
@@ -245,4 +246,50 @@ Y_UNIT_TEST_SUITE(ObjectDistribuiton) {
245
246
UNIT_ASSERT_VALUES_EQUAL (imbalance, objectDistributions.GetMaxImbalance ());
246
247
247
248
}
249
+
250
+ Y_UNIT_TEST (TestManyIrrelevantNodes) {
251
+ static constexpr size_t NUM_NODES = 10'000 ;
252
+ static constexpr size_t NUM_OBJECTS = 10'000 ;
253
+ static constexpr TSubDomainKey DOMAIN_A = {1 , 1 };
254
+ static constexpr TSubDomainKey DOMAIN_B = {2 , 2 };
255
+
256
+ TIntrusivePtr<TTabletStorageInfo> hiveStorage = new TTabletStorageInfo;
257
+ hiveStorage->TabletType = TTabletTypes::Hive;
258
+ THive hive (hiveStorage.Get (), TActorId ());
259
+
260
+ std::unordered_map<TNodeId, TNodeInfo> nodes;
261
+ TObjectDistributions objectDistributions (nodes);
262
+ NKikimrLocal::TTabletAvailability dummyTabletAvailability;
263
+ dummyTabletAvailability.SetType (TTabletTypes::Dummy);
264
+ for (TNodeId nodeId = 0 ; nodeId < NUM_NODES; ++nodeId) {
265
+ TNodeInfo& node = nodes.emplace (std::piecewise_construct, std::tuple<TNodeId>(nodeId), std::tuple<TNodeId, THive&>(nodeId, hive)).first ->second ;
266
+ node.ServicedDomains .push_back (nodeId == 0 ? DOMAIN_A : DOMAIN_B);
267
+ node.RegisterInDomains ();
268
+ node.LocationAcquired = true ;
269
+ node.TabletAvailability .emplace (std::piecewise_construct,
270
+ std::tuple<TTabletTypes::EType>(TTabletTypes::Dummy),
271
+ std::tuple<NKikimrLocal::TTabletAvailability>(dummyTabletAvailability));
272
+ }
273
+
274
+ for (size_t i = 0 ; i < NUM_OBJECTS; i++) {
275
+ TLeaderTabletInfo tablet (0 , hive);
276
+ tablet.AssignDomains (DOMAIN_A, {});
277
+ tablet.ObjectId = {1 , i + 1 };
278
+ tablet.SetType (TTabletTypes::Dummy);
279
+ objectDistributions.UpdateCountForTablet (tablet, nodes.at (0 ), +1 );
280
+ }
281
+
282
+ TProfileTimer timer;
283
+ for (const auto & [nodeId, node] : nodes) {
284
+ objectDistributions.AddNode (node);
285
+ }
286
+
287
+ double passed = timer.Get ().SecondsFloat ();
288
+ Cerr << " Took " << passed << " seconds" << Endl;
289
+ #ifndef SANITIZER_TYPE
290
+ #ifdef NDEBUG
291
+ UNIT_ASSERT_GE (NUM_NODES / passed, 1000 );
292
+ #endif
293
+ #endif
294
+ }
248
295
}
0 commit comments