|
6 | 6 | #include <ydb/core/mind/hive/hive_events.h>
|
7 | 7 | #include <ydb/core/node_whiteboard/node_whiteboard.h>
|
8 | 8 | #include <ydb/core/blobstorage/base/blobstorage_events.h>
|
| 9 | +#include <ydb/core/protos/config.pb.h> |
9 | 10 | #include <ydb/core/tx/schemeshard/schemeshard.h>
|
10 | 11 | #include "health_check.cpp"
|
11 | 12 |
|
@@ -1961,5 +1962,156 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
|
1961 | 1962 |
|
1962 | 1963 | UNIT_ASSERT(HasDeadTabletIssue(result));
|
1963 | 1964 | }
|
| 1965 | + |
| 1966 | + void SendHealthCheckConfigUpdate(TTestActorRuntime &runtime, const TActorId& sender, const NKikimrConfig::THealthCheckConfig &cfg) { |
| 1967 | + auto *event = new NConsole::TEvConsole::TEvConfigureRequest; |
| 1968 | + |
| 1969 | + event->Record.AddActions()->MutableRemoveConfigItems()->MutableCookieFilter()->AddCookies("cookie"); |
| 1970 | + |
| 1971 | + auto &item = *event->Record.AddActions()->MutableAddConfigItem()->MutableConfigItem(); |
| 1972 | + item.MutableConfig()->MutableHealthCheckConfig()->CopyFrom(cfg); |
| 1973 | + item.SetCookie("cookie"); |
| 1974 | + |
| 1975 | + runtime.SendToPipe(MakeConsoleID(), sender, event, 0, GetPipeConfigWithRetries()); |
| 1976 | + |
| 1977 | + TAutoPtr<IEventHandle> handle; |
| 1978 | + auto record = runtime.GrabEdgeEvent<NConsole::TEvConsole::TEvConfigureResponse>(handle)->Record; |
| 1979 | + UNIT_ASSERT_VALUES_EQUAL(record.MutableStatus()->GetCode(), Ydb::StatusIds::SUCCESS); |
| 1980 | + } |
| 1981 | + |
| 1982 | + void ChangeNodeRestartsPerPeriod(TTestActorRuntime &runtime, const TActorId& sender, const ui32 restartsYellow, const ui32 restartsOrange) { |
| 1983 | + NKikimrConfig::TAppConfig ext; |
| 1984 | + auto &cfg = *ext.MutableHealthCheckConfig(); |
| 1985 | + cfg.SetNodeRestartsPerPeriodYellowThreshold(restartsYellow); |
| 1986 | + cfg.SetNodeRestartsPerPeriodOrangeThreshold(restartsOrange); |
| 1987 | + SendHealthCheckConfigUpdate(runtime, sender, cfg); |
| 1988 | + } |
| 1989 | + |
| 1990 | + void TestConfigUpdateNodeRestartsPerPeriod(TTestActorRuntime &runtime, const TActorId& sender, const ui32 restartsYellow, const ui32 restartsOrange, const ui32 nodeId, Ydb::Monitoring::StatusFlag::Status expectedStatus) { |
| 1991 | + ChangeNodeRestartsPerPeriod(runtime, sender, restartsYellow, restartsOrange); |
| 1992 | + |
| 1993 | + TAutoPtr<IEventHandle> handle; |
| 1994 | + auto *request = new NHealthCheck::TEvSelfCheckRequest; |
| 1995 | + request->Request.set_return_verbose_status(true); |
| 1996 | + request->Database = "/Root/database"; |
| 1997 | + |
| 1998 | + runtime.Send(new IEventHandle(NHealthCheck::MakeHealthCheckID(), sender, request, 0)); |
| 1999 | + auto result = runtime.GrabEdgeEvent<NHealthCheck::TEvSelfCheckResult>(handle)->Result; |
| 2000 | + Ctest << result.ShortDebugString() << Endl; |
| 2001 | + |
| 2002 | + const auto &database_status = result.database_status(0); |
| 2003 | + UNIT_ASSERT_VALUES_EQUAL(database_status.name(), "/Root/database"); |
| 2004 | + UNIT_ASSERT_VALUES_EQUAL(database_status.compute().overall(), expectedStatus); |
| 2005 | + UNIT_ASSERT_VALUES_EQUAL(database_status.compute().nodes()[0].id(), ToString(nodeId)); |
| 2006 | + } |
| 2007 | + |
| 2008 | + Y_UNIT_TEST(HealthCheckConfigUpdate) { |
| 2009 | + TPortManager tp; |
| 2010 | + ui16 port = tp.GetPort(2134); |
| 2011 | + ui16 grpcPort = tp.GetPort(2135); |
| 2012 | + auto settings = TServerSettings(port) |
| 2013 | + .SetNodeCount(1) |
| 2014 | + .SetDynamicNodeCount(1) |
| 2015 | + .SetUseRealThreads(false) |
| 2016 | + .SetDomainName("Root"); |
| 2017 | + |
| 2018 | + TServer server(settings); |
| 2019 | + server.EnableGRpc(grpcPort); |
| 2020 | + TClient client(settings); |
| 2021 | + TTestActorRuntime& runtime = *server.GetRuntime(); |
| 2022 | + TActorId sender = runtime.AllocateEdgeActor(); |
| 2023 | + |
| 2024 | + const ui32 nodeRestarts = 10; |
| 2025 | + const ui32 nodeId = runtime.GetNodeId(1); |
| 2026 | + auto observerFunc = [&](TAutoPtr<IEventHandle>& ev) { |
| 2027 | + switch (ev->GetTypeRewrite()) { |
| 2028 | + case NConsole::TEvConsole::EvGetTenantStatusResponse: { |
| 2029 | + auto *x = reinterpret_cast<NConsole::TEvConsole::TEvGetTenantStatusResponse::TPtr*>(&ev); |
| 2030 | + ChangeGetTenantStatusResponse(x, "/Root/database"); |
| 2031 | + break; |
| 2032 | + } |
| 2033 | + case TEvTxProxySchemeCache::EvNavigateKeySetResult: { |
| 2034 | + auto *x = reinterpret_cast<TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr*>(&ev); |
| 2035 | + TSchemeCacheNavigate::TEntry& entry((*x)->Get()->Request->ResultSet.front()); |
| 2036 | + const TString path = CanonizePath(entry.Path); |
| 2037 | + if (path == "/Root/database" || entry.TableId.PathId == SUBDOMAIN_KEY) { |
| 2038 | + entry.Status = TSchemeCacheNavigate::EStatus::Ok; |
| 2039 | + entry.Kind = TSchemeCacheNavigate::EKind::KindExtSubdomain; |
| 2040 | + entry.Path = {"Root", "database"}; |
| 2041 | + entry.DomainInfo = MakeIntrusive<TDomainInfo>(SUBDOMAIN_KEY, SUBDOMAIN_KEY); |
| 2042 | + auto domains = runtime.GetAppData().DomainsInfo; |
| 2043 | + ui64 hiveId = domains->GetHive(); |
| 2044 | + entry.DomainInfo->Params.SetHive(hiveId); |
| 2045 | + } |
| 2046 | + break; |
| 2047 | + } |
| 2048 | + case TEvHive::EvResponseHiveNodeStats: { |
| 2049 | + auto *x = reinterpret_cast<TEvHive::TEvResponseHiveNodeStats::TPtr*>(&ev); |
| 2050 | + auto &record = (*x)->Get()->Record; |
| 2051 | + record.ClearNodeStats(); |
| 2052 | + auto *nodeStats = record.MutableNodeStats()->Add(); |
| 2053 | + nodeStats->SetNodeId(nodeId); |
| 2054 | + nodeStats->SetRestartsPerPeriod(nodeRestarts); |
| 2055 | + nodeStats->MutableNodeDomain()->SetSchemeShard(SUBDOMAIN_KEY.OwnerId); |
| 2056 | + nodeStats->MutableNodeDomain()->SetPathId(SUBDOMAIN_KEY.LocalPathId); |
| 2057 | + break; |
| 2058 | + } |
| 2059 | + case TEvSchemeShard::EvDescribeSchemeResult: { |
| 2060 | + auto *x = reinterpret_cast<NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult::TPtr*>(&ev); |
| 2061 | + auto record = (*x)->Get()->MutableRecord(); |
| 2062 | + if (record->path() == "/Root/database") { |
| 2063 | + record->set_status(NKikimrScheme::StatusSuccess); |
| 2064 | + // no pools |
| 2065 | + } |
| 2066 | + break; |
| 2067 | + } |
| 2068 | + case TEvBlobStorage::EvControllerConfigResponse: { |
| 2069 | + auto *x = reinterpret_cast<TEvBlobStorage::TEvControllerConfigResponse::TPtr*>(&ev); |
| 2070 | + AddGroupVSlotInControllerConfigResponseWithStaticGroup(x, NKikimrBlobStorage::TGroupStatus::FULL, TVDisks(1)); |
| 2071 | + break; |
| 2072 | + } |
| 2073 | + case NSysView::TEvSysView::EvGetVSlotsResponse: { |
| 2074 | + auto* x = reinterpret_cast<NSysView::TEvSysView::TEvGetVSlotsResponse::TPtr*>(&ev); |
| 2075 | + AddVSlotsToSysViewResponse(x, 1, TVDisks(1)); |
| 2076 | + break; |
| 2077 | + } |
| 2078 | + case NSysView::TEvSysView::EvGetGroupsResponse: { |
| 2079 | + auto* x = reinterpret_cast<NSysView::TEvSysView::TEvGetGroupsResponse::TPtr*>(&ev); |
| 2080 | + AddGroupsToSysViewResponse(x); |
| 2081 | + break; |
| 2082 | + } |
| 2083 | + case NSysView::TEvSysView::EvGetStoragePoolsResponse: { |
| 2084 | + auto* x = reinterpret_cast<NSysView::TEvSysView::TEvGetStoragePoolsResponse::TPtr*>(&ev); |
| 2085 | + AddStoragePoolsToSysViewResponse(x); |
| 2086 | + break; |
| 2087 | + } |
| 2088 | + case TEvWhiteboard::EvSystemStateResponse: { |
| 2089 | + auto *x = reinterpret_cast<TEvWhiteboard::TEvSystemStateResponse::TPtr*>(&ev); |
| 2090 | + ClearLoadAverage(x); |
| 2091 | + break; |
| 2092 | + } |
| 2093 | + case TEvInterconnect::EvNodesInfo: { |
| 2094 | + auto *x = reinterpret_cast<TEvInterconnect::TEvNodesInfo::TPtr*>(&ev); |
| 2095 | + auto nodes = MakeIntrusive<TIntrusiveVector<TEvInterconnect::TNodeInfo>>((*x)->Get()->Nodes); |
| 2096 | + if (!nodes->empty()) { |
| 2097 | + nodes->erase(nodes->begin() + 1, nodes->end()); |
| 2098 | + nodes->begin()->NodeId = nodeId; |
| 2099 | + } |
| 2100 | + auto newEv = IEventHandle::Downcast<TEvInterconnect::TEvNodesInfo>( |
| 2101 | + new IEventHandle((*x)->Recipient, (*x)->Sender, new TEvInterconnect::TEvNodesInfo(nodes)) |
| 2102 | + ); |
| 2103 | + x->Swap(newEv); |
| 2104 | + break; |
| 2105 | + } |
| 2106 | + } |
| 2107 | + |
| 2108 | + return TTestActorRuntime::EEventAction::PROCESS; |
| 2109 | + }; |
| 2110 | + runtime.SetObserverFunc(observerFunc); |
| 2111 | + |
| 2112 | + TestConfigUpdateNodeRestartsPerPeriod(runtime, sender, nodeRestarts + 5, nodeRestarts + 10, nodeId, Ydb::Monitoring::StatusFlag::GREEN); |
| 2113 | + TestConfigUpdateNodeRestartsPerPeriod(runtime, sender, nodeRestarts / 2, nodeRestarts + 5, nodeId, Ydb::Monitoring::StatusFlag::YELLOW); |
| 2114 | + TestConfigUpdateNodeRestartsPerPeriod(runtime, sender, nodeRestarts / 5, nodeRestarts / 2, nodeId, Ydb::Monitoring::StatusFlag::ORANGE); |
| 2115 | + } |
1964 | 2116 | }
|
1965 | 2117 | }
|
0 commit comments