Skip to content

Commit 8ee19de

Browse files
CyberROFLblinkov
authored andcommitted
Test with backup & restore rate limiter's properties (#14510)
1 parent a5537ca commit 8ee19de

File tree

4 files changed

+83
-38
lines changed

4 files changed

+83
-38
lines changed

ydb/library/backup/backup.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -645,28 +645,31 @@ std::vector<std::string> ListRateLimiters(NRateLimiter::TRateLimiterClient& clie
645645
return status.GetResourcePaths();
646646
}
647647

648-
NRateLimiter::TDescribeResourceResult::THierarchicalDrrProps DescribeRateLimiter(
648+
NRateLimiter::TDescribeResourceResult DescribeRateLimiter(
649649
NRateLimiter::TRateLimiterClient& client, const std::string& coordinationNodePath, const std::string& rateLimiterPath)
650650
{
651651
auto status = NConsoleClient::RetryFunction([&]() {
652652
return client.DescribeResource(coordinationNodePath, rateLimiterPath).ExtractValueSync();
653653
});
654654
VerifyStatus(status, "describe rate limiter");
655-
return status.GetHierarchicalDrrProps();
655+
return status;
656656
}
657657

658658
void BackupDependentResources(TDriver driver, const std::string& coordinationNodePath, const TFsPath& fsBackupFolder) {
659659
NRateLimiter::TRateLimiterClient client(driver);
660660
const auto rateLimiters = ListRateLimiters(client, coordinationNodePath);
661661

662662
for (const auto& rateLimiterPath : rateLimiters) {
663-
const auto description = DescribeRateLimiter(client, coordinationNodePath, rateLimiterPath);
664-
Ydb::RateLimiter::CreateResourceRequest creationRequest;
665-
description.SerializeTo(*creationRequest.mutable_resource()->mutable_hierarchical_drr());
663+
const auto desc = DescribeRateLimiter(client, coordinationNodePath, rateLimiterPath);
664+
Ydb::RateLimiter::CreateResourceRequest request;
665+
desc.GetHierarchicalDrrProps().SerializeTo(*request.mutable_resource()->mutable_hierarchical_drr());
666+
if (const auto& meteringConfig = desc.GetMeteringConfig()) {
667+
meteringConfig->SerializeTo(*request.mutable_resource()->mutable_metering_config());
668+
}
666669

667670
TFsPath childFolderPath = fsBackupFolder.Child(TString{rateLimiterPath});
668671
childFolderPath.MkDirs();
669-
WriteProtoToFile(creationRequest, childFolderPath, NDump::NFiles::CreateRateLimiter());
672+
WriteProtoToFile(request, childFolderPath, NDump::NFiles::CreateRateLimiter());
670673
}
671674
}
672675

ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/rate_limiter/rate_limiter.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,14 +275,14 @@ struct TDescribeResourceResult : public TStatus {
275275
return HierarchicalDrrProps_;
276276
}
277277

278-
const TMeteringConfig& GetMeteringConfig() const {
278+
const std::optional<TMeteringConfig>& GetMeteringConfig() const {
279279
return MeteringConfig_;
280280
}
281281

282282
private:
283283
std::string ResourcePath_;
284284
THierarchicalDrrProps HierarchicalDrrProps_;
285-
TMeteringConfig MeteringConfig_;
285+
std::optional<TMeteringConfig> MeteringConfig_;
286286
};
287287

288288
using TAsyncDescribeResourceResult = NThreading::TFuture<TDescribeResourceResult>;

ydb/public/sdk/cpp/src/client/rate_limiter/rate_limiter.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,9 @@ template struct THierarchicalDrrSettings<TDescribeResourceResult::THierarchicalD
204204
TCreateResourceSettings::TCreateResourceSettings(const Ydb::RateLimiter::CreateResourceRequest& proto)
205205
: THierarchicalDrrSettings(proto.resource().hierarchical_drr())
206206
{
207+
if (proto.resource().has_metering_config()) {
208+
MeteringConfig_ = proto.resource().metering_config();
209+
}
207210
}
208211

209212
TListResourcesResult::TListResourcesResult(TStatus status, std::vector<std::string> paths)

ydb/services/ydb/backup_ut/ydb_backup_ut.cpp

Lines changed: 69 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,26 @@ bool operator==(
6969
return left == right;
7070
}
7171

72+
bool operator==(
73+
const Ydb::RateLimiter::MeteringConfig& lhs,
74+
const Ydb::RateLimiter::MeteringConfig& rhs
75+
) {
76+
return google::protobuf::util::MessageDifferencer::Equals(lhs, rhs);
77+
}
78+
79+
bool operator==(const TMeteringConfig& lhs, const TMeteringConfig& rhs) {
80+
Ydb::RateLimiter::MeteringConfig left;
81+
lhs.SerializeTo(left);
82+
Ydb::RateLimiter::MeteringConfig right;
83+
rhs.SerializeTo(right);
84+
return left == right;
85+
}
86+
7287
bool operator==(const TDescribeResourceResult& lhs, const TDescribeResourceResult& rhs) {
7388
UNIT_ASSERT_C(lhs.IsSuccess(), lhs.GetIssues().ToString());
7489
UNIT_ASSERT_C(rhs.IsSuccess(), rhs.GetIssues().ToString());
75-
return lhs.GetHierarchicalDrrProps() == rhs.GetHierarchicalDrrProps();
90+
return lhs.GetHierarchicalDrrProps() == rhs.GetHierarchicalDrrProps()
91+
&& lhs.GetMeteringConfig() == rhs.GetMeteringConfig();
7692
}
7793

7894
}
@@ -847,49 +863,72 @@ TDescribeResourceResult DescribeRateLimiter(
847863
return result;
848864
}
849865

850-
void DropRateLimiter(
851-
TRateLimiterClient& client,
852-
const std::string& coordinationNodePath,
853-
const std::string& rateLimiterPath
854-
) {
855-
const auto result = client.DropResource(coordinationNodePath, rateLimiterPath).ExtractValueSync();
856-
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
857-
}
858-
859866
void TestCoordinationNodeResourcesArePreserved(
860-
const std::string& coordinationNodePath,
867+
const std::string& path,
861868
NCoordination::TClient& nodeClient,
862869
TRateLimiterClient& rateLimiterClient,
863870
TBackupFunction&& backup,
864871
TRestoreFunction&& restore
865872
) {
866-
constexpr std::array rateLimiters = { "root", "root/firstChild", "root/secondChild" };
867-
CreateCoordinationNode(nodeClient, coordinationNodePath, {});
868-
// required settings
869-
const auto settings = TCreateResourceSettings().MaxUnitsPerSecond(5);
870-
for (const auto& rateLimiter : rateLimiters) {
871-
CreateRateLimiter(rateLimiterClient, coordinationNodePath, rateLimiter, settings);
873+
const std::vector<std::pair<std::string, TCreateResourceSettings>> rateLimiters = {
874+
{
875+
"root",
876+
TCreateResourceSettings()
877+
.MaxUnitsPerSecond(5)
878+
.MaxBurstSizeCoefficient(2)
879+
.PrefetchCoefficient(0.5)
880+
.PrefetchWatermark(0.8)
881+
.ImmediatelyFillUpTo(-10)
882+
},
883+
{
884+
"root/firstChild",
885+
TCreateResourceSettings()
886+
.MaxUnitsPerSecond(10)
887+
.LeafBehavior(
888+
TReplicatedBucketSettings()
889+
.ReportInterval(std::chrono::milliseconds(10000))
890+
)
891+
},
892+
{
893+
"root/secondChild",
894+
TCreateResourceSettings()
895+
.MaxUnitsPerSecond(20)
896+
.MeteringConfig(
897+
TMeteringConfig()
898+
.Enabled(true)
899+
.ReportPeriod(std::chrono::milliseconds(10000))
900+
.MeterPeriod(std::chrono::milliseconds(5000))
901+
.CollectPeriod(std::chrono::seconds(20))
902+
.ProvisionedUnitsPerSecond(100)
903+
.ProvisionedCoefficient(50)
904+
.OvershootCoefficient(1.2)
905+
.Provisioned(
906+
TMetric()
907+
.Enabled(true)
908+
.BillingPeriod(std::chrono::seconds(30))
909+
.Labels({{"k", "v"}})
910+
)
911+
)
912+
},
913+
};
914+
915+
CreateCoordinationNode(nodeClient, path, {});
916+
for (const auto& [resource, settings] : rateLimiters) {
917+
CreateRateLimiter(rateLimiterClient, path, resource, settings);
872918
}
873919

874-
std::vector<TDescribeResourceResult> originalDescriptions;
875-
for (const auto& rateLimiter : rateLimiters) {
876-
originalDescriptions.emplace_back(DescribeRateLimiter(rateLimiterClient, coordinationNodePath, rateLimiter));
920+
std::vector<TDescribeResourceResult> original;
921+
for (const auto& [resource, _] : rateLimiters) {
922+
original.emplace_back(DescribeRateLimiter(rateLimiterClient, path, resource));
877923
}
878924

879925
backup();
880926

881-
for (int i = 2; i >= 0; --i) {
882-
DropRateLimiter(rateLimiterClient, coordinationNodePath, rateLimiters[i]);
883-
}
884-
DropCoordinationNode(nodeClient, coordinationNodePath);
927+
DropCoordinationNode(nodeClient, path);
885928

886929
restore();
887-
for (int i = 0; i < 3; ++i) {
888-
UNIT_ASSERT_EQUAL_C(
889-
DescribeRateLimiter(rateLimiterClient, coordinationNodePath, rateLimiters[i]),
890-
originalDescriptions[i],
891-
"i: " << i
892-
);
930+
for (size_t i = 0; i < rateLimiters.size(); ++i) {
931+
UNIT_ASSERT_EQUAL(DescribeRateLimiter(rateLimiterClient, path, rateLimiters[i].first), original[i]);
893932
}
894933
}
895934

0 commit comments

Comments
 (0)