Skip to content

Commit 590ac64

Browse files
authored
24-3: Filter out export directories (#9435)
1 parent c157964 commit 590ac64

File tree

5 files changed

+164
-2
lines changed

5 files changed

+164
-2
lines changed

ydb/core/tx/replication/controller/target_discoverer.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ class TTargetDiscoverer: public TActorBootstrapped<TTargetDiscoverer> {
172172

173173
return entry.Name.StartsWith("~")
174174
|| entry.Name.StartsWith(".sys")
175-
|| entry.Name.StartsWith(".metadata");
175+
|| entry.Name.StartsWith(".metadata")
176+
|| entry.Name.StartsWith("export-");
176177
}
177178

178179
void Handle(TEvYdbProxy::TEvListDirectoryResponse::TPtr& ev) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
#include "private_events.h"
2+
#include "target_discoverer.h"
3+
4+
#include <ydb/core/tx/replication/ut_helpers/test_env.h>
5+
#include <ydb/core/tx/replication/ut_helpers/test_table.h>
6+
7+
#include <library/cpp/testing/unittest/registar.h>
8+
9+
namespace NKikimr::NReplication::NController {
10+
11+
Y_UNIT_TEST_SUITE(TargetDiscoverer) {
12+
using namespace NTestHelpers;
13+
14+
TTestTableDescription DummyTable() {
15+
return TTestTableDescription{
16+
.Name = "Table",
17+
.KeyColumns = {"key"},
18+
.Columns = {
19+
{.Name = "key", .Type = "Uint32"},
20+
{.Name = "value", .Type = "Uint32"},
21+
},
22+
.ReplicationConfig = Nothing(),
23+
};
24+
}
25+
26+
Y_UNIT_TEST(Basic) {
27+
TEnv env;
28+
env.GetRuntime().SetLogPriority(NKikimrServices::REPLICATION_CONTROLLER, NLog::PRI_TRACE);
29+
30+
env.CreateTable("/Root", *MakeTableDescription(DummyTable()));
31+
32+
env.GetRuntime().Register(CreateTargetDiscoverer(env.GetSender(), 1, env.GetYdbProxy(),
33+
TVector<std::pair<TString, TString>>{
34+
{"/Root", "/Root/Replicated"},
35+
}
36+
));
37+
38+
auto ev = env.GetRuntime().GrabEdgeEvent<TEvPrivate::TEvDiscoveryTargetsResult>(env.GetSender());
39+
UNIT_ASSERT(ev->Get()->IsSuccess());
40+
41+
const auto& toAdd = ev->Get()->ToAdd;
42+
UNIT_ASSERT_VALUES_EQUAL(toAdd.size(), 1);
43+
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(0).SrcPath, "/Root/Table");
44+
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(0).DstPath, "/Root/Replicated/Table");
45+
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(0).Kind, TReplication::ETargetKind::Table);
46+
}
47+
48+
Y_UNIT_TEST(IndexedTable) {
49+
TEnv env;
50+
env.GetRuntime().SetLogPriority(NKikimrServices::REPLICATION_CONTROLLER, NLog::PRI_TRACE);
51+
52+
env.CreateTableWithIndex("/Root", *MakeTableDescription(DummyTable()),
53+
"Index", TVector<TString>{"value"}, NKikimrSchemeOp::EIndexTypeGlobal);
54+
55+
env.GetRuntime().Register(CreateTargetDiscoverer(env.GetSender(), 1, env.GetYdbProxy(),
56+
TVector<std::pair<TString, TString>>{
57+
{"/Root", "/Root/Replicated"},
58+
}
59+
));
60+
61+
auto ev = env.GetRuntime().GrabEdgeEvent<TEvPrivate::TEvDiscoveryTargetsResult>(env.GetSender());
62+
UNIT_ASSERT(ev->Get()->IsSuccess());
63+
64+
const auto& toAdd = ev->Get()->ToAdd;
65+
UNIT_ASSERT_VALUES_EQUAL(toAdd.size(), 2);
66+
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(1).SrcPath, "/Root/Table/Index");
67+
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(1).DstPath, "/Root/Replicated/Table/Index/indexImplTable");
68+
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(1).Kind, TReplication::ETargetKind::IndexTable);
69+
}
70+
71+
Y_UNIT_TEST(Negative) {
72+
TEnv env;
73+
env.GetRuntime().SetLogPriority(NKikimrServices::REPLICATION_CONTROLLER, NLog::PRI_TRACE);
74+
75+
env.GetRuntime().Register(CreateTargetDiscoverer(env.GetSender(), 1, env.GetYdbProxy(),
76+
TVector<std::pair<TString, TString>>{
77+
{"/Root/Table", "/Root/ReplicatedTable"},
78+
}
79+
));
80+
81+
auto ev = env.GetRuntime().GrabEdgeEvent<TEvPrivate::TEvDiscoveryTargetsResult>(env.GetSender());
82+
UNIT_ASSERT(!ev->Get()->IsSuccess());
83+
84+
const auto& failed = ev->Get()->Failed;
85+
UNIT_ASSERT_VALUES_EQUAL(failed.size(), 1);
86+
UNIT_ASSERT_VALUES_EQUAL(failed.at(0).SrcPath, "/Root/Table");
87+
UNIT_ASSERT_VALUES_EQUAL(failed.at(0).Error.GetStatus(), NYdb::EStatus::SCHEME_ERROR);
88+
}
89+
90+
Y_UNIT_TEST(Dirs) {
91+
TEnv env;
92+
env.GetRuntime().SetLogPriority(NKikimrServices::REPLICATION_CONTROLLER, NLog::PRI_TRACE);
93+
94+
env.MkDir("/Root", "Dir");
95+
env.CreateTable("/Root/Dir", *MakeTableDescription(DummyTable()));
96+
97+
env.GetRuntime().Register(CreateTargetDiscoverer(env.GetSender(), 1, env.GetYdbProxy(),
98+
TVector<std::pair<TString, TString>>{
99+
{"/Root", "/Root/Replicated"},
100+
}
101+
));
102+
103+
auto ev = env.GetRuntime().GrabEdgeEvent<TEvPrivate::TEvDiscoveryTargetsResult>(env.GetSender());
104+
UNIT_ASSERT(ev->Get()->IsSuccess());
105+
106+
const auto& toAdd = ev->Get()->ToAdd;
107+
UNIT_ASSERT_VALUES_EQUAL(toAdd.size(), 1);
108+
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(0).SrcPath, "/Root/Dir/Table");
109+
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(0).DstPath, "/Root/Replicated/Dir/Table");
110+
}
111+
112+
Y_UNIT_TEST(SystemObjects) {
113+
TEnv env;
114+
env.GetRuntime().SetLogPriority(NKikimrServices::REPLICATION_CONTROLLER, NLog::PRI_TRACE);
115+
116+
env.CreateTable("/Root", *MakeTableDescription(DummyTable()));
117+
env.MkDir("/Root", "export-100500");
118+
env.CreateTable("/Root/export-100500", *MakeTableDescription(DummyTable()));
119+
120+
env.GetRuntime().Register(CreateTargetDiscoverer(env.GetSender(), 1, env.GetYdbProxy(),
121+
TVector<std::pair<TString, TString>>{
122+
{"/Root", "/Root/Replicated"},
123+
}
124+
));
125+
126+
auto ev = env.GetRuntime().GrabEdgeEvent<TEvPrivate::TEvDiscoveryTargetsResult>(env.GetSender());
127+
UNIT_ASSERT(ev->Get()->IsSuccess());
128+
129+
const auto& toAdd = ev->Get()->ToAdd;
130+
UNIT_ASSERT_VALUES_EQUAL(toAdd.size(), 1);
131+
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(0).SrcPath, "/Root/Table");
132+
}
133+
}
134+
135+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
UNITTEST_FOR(ydb/core/tx/replication/controller)
2+
3+
FORK_SUBTESTS()
4+
5+
SIZE(MEDIUM)
6+
7+
TIMEOUT(600)
8+
9+
PEERDIR(
10+
ydb/core/tx/replication/ut_helpers
11+
library/cpp/testing/unittest
12+
)
13+
14+
SRCS(
15+
target_discoverer_ut.cpp
16+
)
17+
18+
YQL_LAST_ABI_VERSION()
19+
20+
END()

ydb/core/tx/replication/controller/ya.make

+1
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,5 @@ END()
6060

6161
RECURSE_FOR_TESTS(
6262
ut_dst_creator
63+
ut_target_discoverer
6364
)

ydb/core/tx/replication/ut_helpers/test_env.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,12 @@ class TEnv {
163163
auto CreateTableWithIndex(Args&&... args) {
164164
return Client.CreateTableWithUniformShardedIndex(std::forward<Args>(args)...);
165165
}
166-
166+
167+
template <typename... Args>
168+
auto MkDir(Args&&... args) {
169+
return Client.MkDir(std::forward<Args>(args)...);
170+
}
171+
167172
void SendAsync(const TActorId& recipient, IEventBase* ev) {
168173
Server.GetRuntime()->Send(new IEventHandle(recipient, Sender, ev));
169174
}

0 commit comments

Comments
 (0)