@@ -38,6 +38,7 @@ struct TDatabaseClients {
38
38
TActorId ActorId;
39
39
NConfig::TComputeDatabaseConfig Config;
40
40
TActorId DatabasesCacheActorId;
41
+ TActorId MonitoringActorId;
41
42
};
42
43
43
44
std::optional<TClientConfig> GetClient (const TString& scope, const TString& endpoint, const TString& database) const {
@@ -306,6 +307,7 @@ class TComputeDatabaseControlPlaneServiceActor : public NActors::TActorBootstrap
306
307
switch (controlPlane.type_case ()) {
307
308
case NConfig::TYdbComputeControlPlane::TYPE_NOT_SET:
308
309
case NConfig::TYdbComputeControlPlane::kSingle :
310
+ CreateSingleClientActors (controlPlane.GetSingle ());
309
311
break ;
310
312
case NConfig::TYdbComputeControlPlane::kCms :
311
313
CreateCmsClientActors (controlPlane.GetCms (), controlPlane.GetDatabasesCacheReloadPeriod ());
@@ -317,6 +319,16 @@ class TComputeDatabaseControlPlaneServiceActor : public NActors::TActorBootstrap
317
319
Become (&TComputeDatabaseControlPlaneServiceActor::StateFunc);
318
320
}
319
321
322
+ static NCloud::TGrpcClientSettings CreateGrpcClientSettings (const NConfig::TYdbStorageConfig& connection) {
323
+ NCloud::TGrpcClientSettings settings;
324
+ settings.Endpoint = connection.GetEndpoint ();
325
+ settings.EnableSsl = connection.GetUseSsl ();
326
+ if (connection.GetCertificateFile ()) {
327
+ settings.CertificateRootCA = StripString (TFileInput (connection.GetCertificateFile ()).ReadAll ());
328
+ }
329
+ return settings;
330
+ }
331
+
320
332
static NCloud::TGrpcClientSettings CreateGrpcClientSettings (const NConfig::TComputeDatabaseConfig& config) {
321
333
NCloud::TGrpcClientSettings settings;
322
334
const auto & connection = config.GetControlPlaneConnection ();
@@ -328,20 +340,45 @@ class TComputeDatabaseControlPlaneServiceActor : public NActors::TActorBootstrap
328
340
return settings;
329
341
}
330
342
343
+ void CreateSingleClientActors (const NConfig::TYdbComputeControlPlane::TSingle& singleConfig) {
344
+ auto globalLoadConfig = Config.GetYdb ().GetLoadControlConfig ();
345
+ if (globalLoadConfig.GetEnable ()) {
346
+ auto clientActor = Register (CreateMonitoringGrpcClientActor (CreateGrpcClientSettings (singleConfig.GetConnection ()), CredentialsProviderFactory (GetYdbCredentialSettings (singleConfig.GetConnection ()))->CreateProvider ()).release ());
347
+ MonitoringActorId = Register (CreateDatabaseMonitoringActor (clientActor, globalLoadConfig, Counters).release ());
348
+ }
349
+ }
350
+
331
351
void CreateCmsClientActors (const NConfig::TYdbComputeControlPlane::TCms& cmsConfig, const TString& databasesCacheReloadPeriod) {
332
352
const auto & mapping = cmsConfig.GetDatabaseMapping ();
353
+ auto globalLoadConfig = Config.GetYdb ().GetLoadControlConfig ();
333
354
for (const auto & config: mapping.GetCommon ()) {
334
355
const auto clientActor = Register (CreateCmsGrpcClientActor (CreateGrpcClientSettings (config), CredentialsProviderFactory (GetYdbCredentialSettings (config.GetControlPlaneConnection ()))->CreateProvider ()).release ());
335
356
const auto cacheActor = Register (CreateComputeDatabasesCacheActor (clientActor, databasesCacheReloadPeriod, Counters).release ());
336
- Clients->CommonDatabaseClients .push_back ({clientActor, config, cacheActor});
357
+ TActorId databaseMonitoringActor;
358
+ const NConfig::TLoadControlConfig& loadConfig = config.GetLoadControlConfig ().GetEnable ()
359
+ ? Config.GetYdb ().GetLoadControlConfig ()
360
+ : globalLoadConfig;
361
+ if (loadConfig.GetEnable ()) {
362
+ auto clientActor = Register (CreateMonitoringGrpcClientActor (CreateGrpcClientSettings (config), CredentialsProviderFactory (GetYdbCredentialSettings (config.GetControlPlaneConnection ()))->CreateProvider ()).release ());
363
+ databaseMonitoringActor = Register (CreateDatabaseMonitoringActor (clientActor, loadConfig, Counters).release ());
364
+ }
365
+ Clients->CommonDatabaseClients .push_back ({clientActor, config, cacheActor, databaseMonitoringActor});
337
366
}
338
367
339
368
Y_ABORT_UNLESS (Clients->CommonDatabaseClients );
340
369
341
370
for (const auto & [scope, config]: mapping.GetScopeToComputeDatabase ()) {
342
371
const auto clientActor = Register (CreateCmsGrpcClientActor (CreateGrpcClientSettings (config), CredentialsProviderFactory (GetYdbCredentialSettings (config.GetControlPlaneConnection ()))->CreateProvider ()).release ());
343
372
const auto cacheActor = Register (CreateComputeDatabasesCacheActor (clientActor, databasesCacheReloadPeriod, Counters).release ());
344
- Clients->ScopeToDatabaseClient [scope] = {clientActor, config, cacheActor};
373
+ TActorId databaseMonitoringActor;
374
+ const NConfig::TLoadControlConfig& loadConfig = config.GetLoadControlConfig ().GetEnable ()
375
+ ? Config.GetYdb ().GetLoadControlConfig ()
376
+ : globalLoadConfig;
377
+ if (loadConfig.GetEnable ()) {
378
+ auto clientActor = Register (CreateMonitoringGrpcClientActor (CreateGrpcClientSettings (config), CredentialsProviderFactory (GetYdbCredentialSettings (config.GetControlPlaneConnection ()))->CreateProvider ()).release ());
379
+ databaseMonitoringActor = Register (CreateDatabaseMonitoringActor (clientActor, loadConfig, Counters).release ());
380
+ }
381
+ Clients->ScopeToDatabaseClient [scope] = {clientActor, config, cacheActor, databaseMonitoringActor};
345
382
}
346
383
}
347
384
@@ -350,20 +387,23 @@ class TComputeDatabaseControlPlaneServiceActor : public NActors::TActorBootstrap
350
387
for (const auto & config: mapping.GetCommon ()) {
351
388
const auto clientActor = Register (CreateYdbcpGrpcClientActor (CreateGrpcClientSettings (config), CredentialsProviderFactory (GetYdbCredentialSettings (config.GetControlPlaneConnection ()))->CreateProvider ()).release ());
352
389
const auto cacheActor = Register (CreateComputeDatabasesCacheActor (clientActor, databasesCacheReloadPeriod, Counters).release ());
353
- Clients->CommonDatabaseClients .push_back ({clientActor, config, cacheActor});
390
+ Clients->CommonDatabaseClients .push_back ({clientActor, config, cacheActor, {} });
354
391
}
355
392
356
393
Y_ABORT_UNLESS (Clients->CommonDatabaseClients );
357
394
358
395
for (const auto & [scope, config]: mapping.GetScopeToComputeDatabase ()) {
359
396
const auto clientActor = Register (CreateYdbcpGrpcClientActor (CreateGrpcClientSettings (config), CredentialsProviderFactory (GetYdbCredentialSettings (config.GetControlPlaneConnection ()))->CreateProvider ()).release ());
360
397
const auto cacheActor = Register (CreateComputeDatabasesCacheActor (clientActor, databasesCacheReloadPeriod, Counters).release ());
361
- Clients->ScopeToDatabaseClient [scope] = {clientActor, config, cacheActor};
398
+ Clients->ScopeToDatabaseClient [scope] = {clientActor, config, cacheActor, {} };
362
399
}
363
400
}
364
401
365
402
STRICT_STFUNC (StateFunc,
366
403
hFunc (TEvYdbCompute::TEvCreateDatabaseRequest, Handle );
404
+ hFunc (TEvYdbCompute::TEvCpuLoadRequest, Handle );
405
+ hFunc (TEvYdbCompute::TEvCpuQuotaRequest, Handle );
406
+ hFunc (TEvYdbCompute::TEvCpuQuotaAdjust, Handle );
367
407
)
368
408
369
409
void Handle (TEvYdbCompute::TEvCreateDatabaseRequest::TPtr& ev) {
@@ -374,7 +414,38 @@ class TComputeDatabaseControlPlaneServiceActor : public NActors::TActorBootstrap
374
414
Register (new TCreateDatabaseRequestActor (Clients, SynchronizationServiceActorId, Config, ev));
375
415
}
376
416
417
+ void Handle (TEvYdbCompute::TEvCpuLoadRequest::TPtr& ev) {
418
+ auto actorId = GetMonitoringActorIdByScope (ev.Get ()->Get ()->Scope );
419
+ if (actorId != TActorId{}) {
420
+ Send (ev->Forward (actorId));
421
+ } else {
422
+ Send (ev->Sender , new TEvYdbCompute::TEvCpuLoadResponse (NYql::TIssues{NYql::TIssue{TStringBuilder{} << " Cluster load monitoring disabled" }}), 0 , ev->Cookie );
423
+ }
424
+ }
425
+
426
+ void Handle (TEvYdbCompute::TEvCpuQuotaRequest::TPtr& ev) {
427
+ auto actorId = GetMonitoringActorIdByScope (ev.Get ()->Get ()->Scope );
428
+ if (actorId != TActorId{}) {
429
+ Send (ev->Forward (actorId));
430
+ } else {
431
+ Send (ev->Sender , new TEvYdbCompute::TEvCpuQuotaResponse (), 0 , ev->Cookie );
432
+ }
433
+ }
434
+
435
+ void Handle (TEvYdbCompute::TEvCpuQuotaAdjust::TPtr& ev) {
436
+ auto actorId = GetMonitoringActorIdByScope (ev.Get ()->Get ()->Scope );
437
+ if (actorId != TActorId{}) {
438
+ Send (ev->Forward (actorId));
439
+ }
440
+ }
441
+
377
442
private:
443
+ TActorId GetMonitoringActorIdByScope (const TString& scope) {
444
+ return Config.GetYdb ().GetControlPlane ().HasSingle ()
445
+ ? MonitoringActorId
446
+ : Clients->GetClient (scope).MonitoringActorId ;
447
+ }
448
+
378
449
TActorId SynchronizationServiceActorId;
379
450
NFq::NConfig::TComputeConfig Config;
380
451
std::shared_ptr<TDatabaseClients> Clients;
@@ -383,6 +454,8 @@ class TComputeDatabaseControlPlaneServiceActor : public NActors::TActorBootstrap
383
454
TYqSharedResources::TPtr YqSharedResources;
384
455
NKikimr::TYdbCredentialsProviderFactory CredentialsProviderFactory;
385
456
::NMonitoring::TDynamicCounterPtr Counters;
457
+ TActorId MonitoringClientActorId;
458
+ TActorId MonitoringActorId;
386
459
};
387
460
388
461
std::unique_ptr<NActors::IActor> CreateComputeDatabaseControlPlaneServiceActor (const NFq::NConfig::TComputeConfig& config,
0 commit comments