Skip to content

Commit 500fbf0

Browse files
committed
forbid new required fields in config
1 parent 7f54b71 commit 500fbf0

File tree

7 files changed

+436
-0
lines changed

7 files changed

+436
-0
lines changed

ydb/core/config/ut/main.cpp

+333
Large diffs are not rendered by default.

ydb/core/config/ut/ya.make

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
UNITTEST()
2+
3+
SRCS(
4+
main.cpp
5+
)
6+
7+
PEERDIR(
8+
ydb/core/config/utils
9+
library/cpp/testing/unittest
10+
)
11+
12+
END()
+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include "config_traverse.h"
2+
3+
#include <util/system/compiler.h>
4+
#include <util/generic/deque.h>
5+
#include <util/generic/vector.h>
6+
#include <util/generic/string.h>
7+
#include <util/generic/map.h>
8+
#include <util/generic/set.h>
9+
10+
#include <ydb/core/protos/config.pb.h>
11+
12+
namespace NKikimr::NConfig {
13+
14+
ssize_t FindLoop(TDeque<const Descriptor*>& typePath, const Descriptor* child) {
15+
for (ssize_t i = 0; i < (ssize_t)typePath.size(); ++i) {
16+
if (typePath[i] == child) {
17+
return i;
18+
}
19+
}
20+
return -1;
21+
}
22+
23+
void Traverse(const Descriptor* d, TDeque<const Descriptor*>& typePath, TDeque<const FieldDescriptor*>& fieldPath, const FieldDescriptor* field, TOnEntryFn onEntry) {
24+
ssize_t loop = FindLoop(typePath, d);
25+
26+
Y_ABORT_IF(!d && !field, "Either field or descriptor must be defined");
27+
28+
onEntry(d, typePath, fieldPath, field, loop);
29+
30+
if (!d || loop != -1) {
31+
return;
32+
}
33+
34+
typePath.push_back(d);
35+
36+
for (int i = 0; i < d->field_count(); ++i) {
37+
const FieldDescriptor* fieldDescriptor = d->field(i);
38+
fieldPath.push_back(fieldDescriptor);
39+
Traverse(fieldDescriptor->message_type(), typePath, fieldPath, fieldDescriptor, onEntry);
40+
fieldPath.pop_back();
41+
}
42+
43+
typePath.pop_back();
44+
}
45+
46+
void Traverse(TOnEntryFn onEntry) {
47+
auto& inst = NKikimrConfig::TAppConfig::default_instance();
48+
const Descriptor* descriptor = inst.GetDescriptor();
49+
50+
TDeque<const Descriptor*> typePath;
51+
TDeque<const FieldDescriptor*> fieldPath;
52+
fieldPath.push_back(nullptr);
53+
Traverse(descriptor, typePath, fieldPath, nullptr, onEntry);
54+
fieldPath.pop_back();
55+
}
56+
57+
} // namespace NKikimr::NConfig
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
3+
#include <contrib/libs/protobuf/src/google/protobuf/descriptor.h>
4+
5+
#include <util/generic/deque.h>
6+
7+
#include <functional>
8+
9+
namespace NKikimr::NConfig {
10+
11+
using namespace NProtoBuf;
12+
13+
using TOnEntryFn = std::function<void(const Descriptor*, const TDeque<const Descriptor*>&, const TDeque<const FieldDescriptor*>&, const FieldDescriptor*, ssize_t)>;
14+
15+
void Traverse(TOnEntryFn onEntry);
16+
17+
} // namespace NKikimr::NConfig

ydb/core/config/utils/ya.make

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
LIBRARY()
2+
3+
SRCS(
4+
config_traverse.cpp
5+
)
6+
7+
PEERDIR(
8+
ydb/core/protos
9+
library/cpp/protobuf/json
10+
)
11+
12+
END()

ydb/core/config/ya.make

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
RECURSE(
2+
utils
3+
ut
4+
)

ydb/core/ya.make

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ RECURSE(
88
client
99
cms
1010
control
11+
config
1112
debug
1213
debug_tools
1314
discovery

0 commit comments

Comments
 (0)