@@ -319,7 +319,7 @@ class TDatabaseResolver: public TActor<TDatabaseResolver>
319
319
// There are two kinds of managed YDBs: serverless and dedicated.
320
320
// While working with dedicated databases, we have to use underlay network.
321
321
// That's why we add `u-` prefix to database fqdn.
322
- if (databaseInfo.GetMap ().contains (" dedicatedDatabase " )) {
322
+ if (databaseInfo.GetMap ().contains (" storageConfig " )) {
323
323
endpoint = " u-" + endpoint;
324
324
host = " u-" + host;
325
325
}
@@ -335,7 +335,7 @@ class TDatabaseResolver: public TActor<TDatabaseResolver>
335
335
{
336
336
auto ret = ydbParser (databaseInfo, mdbEndpointGenerator, useTls, protocol);
337
337
// TODO: Take explicit field from MVP
338
- bool isDedicatedDb = databaseInfo.GetMap ().contains (" dedicatedDatabase " );
338
+ bool isDedicatedDb = databaseInfo.GetMap ().contains (" storageConfig " );
339
339
if (!isDedicatedDb && ret.Endpoint .StartsWith (" ydb." )) {
340
340
// Replace "ydb." -> "yds."
341
341
ret.Endpoint [2 ] = ' s' ;
@@ -457,6 +457,56 @@ class TDatabaseResolver: public TActor<TDatabaseResolver>
457
457
458
458
endpoint = mdbEndpointGenerator->ToEndpoint (params);
459
459
460
+ return TDatabaseDescription{" " , endpoint.first , endpoint.second , " " , useTls};
461
+ };
462
+ Parsers[NYql::EDatabaseType::MySQL] = [](
463
+ NJson::TJsonValue& databaseInfo,
464
+ const NYql::IMdbEndpointGenerator::TPtr& mdbEndpointGenerator,
465
+ bool useTls,
466
+ NConnector::NApi::EProtocol protocol
467
+ ) {
468
+ NYql::IMdbEndpointGenerator::TEndpoint endpoint;
469
+ TVector<TString> aliveHosts;
470
+
471
+ const auto & hostsArray = databaseInfo.GetMap ().at (" hosts" ).GetArraySafe ();
472
+
473
+ for (const auto & host : hostsArray) {
474
+ const auto & hostMap = host.GetMap ();
475
+
476
+ if (!hostMap.contains (" services" )) {
477
+ // indicates that cluster is down
478
+ continue ;
479
+ }
480
+
481
+ const auto & servicesArray = hostMap.at (" services" ).GetArraySafe ();
482
+
483
+ // check if all services of a particular host are alive
484
+ const bool alive = std::all_of (
485
+ servicesArray.begin (),
486
+ servicesArray.end (),
487
+ [](const auto & service) {
488
+ return service[" health" ].GetString () == " ALIVE" ;
489
+ }
490
+ );
491
+
492
+ if (alive) {
493
+ aliveHosts.push_back (host[" name" ].GetString ());
494
+ }
495
+ }
496
+
497
+ if (aliveHosts.empty ()) {
498
+ ythrow TCodeLineException (TIssuesIds::INTERNAL_ERROR) << " No ALIVE MySQL hosts found" ;
499
+ }
500
+
501
+ NYql::IMdbEndpointGenerator::TParams params = {
502
+ .DatabaseType = NYql::EDatabaseType::MySQL,
503
+ .MdbHost = aliveHosts[std::rand () % static_cast <int >(aliveHosts.size ())],
504
+ .UseTls = useTls,
505
+ .Protocol = protocol,
506
+ };
507
+
508
+ endpoint = mdbEndpointGenerator->ToEndpoint (params);
509
+
460
510
return TDatabaseDescription{" " , endpoint.first , endpoint.second , " " , useTls};
461
511
};
462
512
}
@@ -538,7 +588,7 @@ class TDatabaseResolver: public TActor<TDatabaseResolver>
538
588
url = TUrlBuilder (ev->Get ()->YdbMvpEndpoint + " /database" )
539
589
.AddUrlParam (" databaseId" , databaseId)
540
590
.Build ();
541
- } else if (IsIn ({NYql::EDatabaseType::ClickHouse, NYql::EDatabaseType::PostgreSQL}, databaseType)) {
591
+ } else if (IsIn ({NYql::EDatabaseType::ClickHouse, NYql::EDatabaseType::PostgreSQL, NYql::EDatabaseType::MySQL }, databaseType)) {
542
592
YQL_ENSURE (ev->Get ()->MdbGateway , " empty MDB Gateway" );
543
593
url = TUrlBuilder (
544
594
ev->Get ()->MdbGateway + " /managed-" + NYql::DatabaseTypeLowercase (databaseType) + " /v1/clusters/" )
0 commit comments