Skip to content

Commit

Permalink
24-3: Filter out export directories (#9435)
Browse files Browse the repository at this point in the history
  • Loading branch information
CyberROFL authored Sep 18, 2024
1 parent c157964 commit 590ac64
Show file tree
Hide file tree
Showing 5 changed files with 164 additions and 2 deletions.
3 changes: 2 additions & 1 deletion ydb/core/tx/replication/controller/target_discoverer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,8 @@ class TTargetDiscoverer: public TActorBootstrapped<TTargetDiscoverer> {

return entry.Name.StartsWith("~")
|| entry.Name.StartsWith(".sys")
|| entry.Name.StartsWith(".metadata");
|| entry.Name.StartsWith(".metadata")
|| entry.Name.StartsWith("export-");
}

void Handle(TEvYdbProxy::TEvListDirectoryResponse::TPtr& ev) {
Expand Down
135 changes: 135 additions & 0 deletions ydb/core/tx/replication/controller/target_discoverer_ut.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
#include "private_events.h"
#include "target_discoverer.h"

#include <ydb/core/tx/replication/ut_helpers/test_env.h>
#include <ydb/core/tx/replication/ut_helpers/test_table.h>

#include <library/cpp/testing/unittest/registar.h>

namespace NKikimr::NReplication::NController {

Y_UNIT_TEST_SUITE(TargetDiscoverer) {
using namespace NTestHelpers;

TTestTableDescription DummyTable() {
return TTestTableDescription{
.Name = "Table",
.KeyColumns = {"key"},
.Columns = {
{.Name = "key", .Type = "Uint32"},
{.Name = "value", .Type = "Uint32"},
},
.ReplicationConfig = Nothing(),
};
}

Y_UNIT_TEST(Basic) {
TEnv env;
env.GetRuntime().SetLogPriority(NKikimrServices::REPLICATION_CONTROLLER, NLog::PRI_TRACE);

env.CreateTable("/Root", *MakeTableDescription(DummyTable()));

env.GetRuntime().Register(CreateTargetDiscoverer(env.GetSender(), 1, env.GetYdbProxy(),
TVector<std::pair<TString, TString>>{
{"/Root", "/Root/Replicated"},
}
));

auto ev = env.GetRuntime().GrabEdgeEvent<TEvPrivate::TEvDiscoveryTargetsResult>(env.GetSender());
UNIT_ASSERT(ev->Get()->IsSuccess());

const auto& toAdd = ev->Get()->ToAdd;
UNIT_ASSERT_VALUES_EQUAL(toAdd.size(), 1);
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(0).SrcPath, "/Root/Table");
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(0).DstPath, "/Root/Replicated/Table");
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(0).Kind, TReplication::ETargetKind::Table);
}

Y_UNIT_TEST(IndexedTable) {
TEnv env;
env.GetRuntime().SetLogPriority(NKikimrServices::REPLICATION_CONTROLLER, NLog::PRI_TRACE);

env.CreateTableWithIndex("/Root", *MakeTableDescription(DummyTable()),
"Index", TVector<TString>{"value"}, NKikimrSchemeOp::EIndexTypeGlobal);

env.GetRuntime().Register(CreateTargetDiscoverer(env.GetSender(), 1, env.GetYdbProxy(),
TVector<std::pair<TString, TString>>{
{"/Root", "/Root/Replicated"},
}
));

auto ev = env.GetRuntime().GrabEdgeEvent<TEvPrivate::TEvDiscoveryTargetsResult>(env.GetSender());
UNIT_ASSERT(ev->Get()->IsSuccess());

const auto& toAdd = ev->Get()->ToAdd;
UNIT_ASSERT_VALUES_EQUAL(toAdd.size(), 2);
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(1).SrcPath, "/Root/Table/Index");
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(1).DstPath, "/Root/Replicated/Table/Index/indexImplTable");
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(1).Kind, TReplication::ETargetKind::IndexTable);
}

Y_UNIT_TEST(Negative) {
TEnv env;
env.GetRuntime().SetLogPriority(NKikimrServices::REPLICATION_CONTROLLER, NLog::PRI_TRACE);

env.GetRuntime().Register(CreateTargetDiscoverer(env.GetSender(), 1, env.GetYdbProxy(),
TVector<std::pair<TString, TString>>{
{"/Root/Table", "/Root/ReplicatedTable"},
}
));

auto ev = env.GetRuntime().GrabEdgeEvent<TEvPrivate::TEvDiscoveryTargetsResult>(env.GetSender());
UNIT_ASSERT(!ev->Get()->IsSuccess());

const auto& failed = ev->Get()->Failed;
UNIT_ASSERT_VALUES_EQUAL(failed.size(), 1);
UNIT_ASSERT_VALUES_EQUAL(failed.at(0).SrcPath, "/Root/Table");
UNIT_ASSERT_VALUES_EQUAL(failed.at(0).Error.GetStatus(), NYdb::EStatus::SCHEME_ERROR);
}

Y_UNIT_TEST(Dirs) {
TEnv env;
env.GetRuntime().SetLogPriority(NKikimrServices::REPLICATION_CONTROLLER, NLog::PRI_TRACE);

env.MkDir("/Root", "Dir");
env.CreateTable("/Root/Dir", *MakeTableDescription(DummyTable()));

env.GetRuntime().Register(CreateTargetDiscoverer(env.GetSender(), 1, env.GetYdbProxy(),
TVector<std::pair<TString, TString>>{
{"/Root", "/Root/Replicated"},
}
));

auto ev = env.GetRuntime().GrabEdgeEvent<TEvPrivate::TEvDiscoveryTargetsResult>(env.GetSender());
UNIT_ASSERT(ev->Get()->IsSuccess());

const auto& toAdd = ev->Get()->ToAdd;
UNIT_ASSERT_VALUES_EQUAL(toAdd.size(), 1);
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(0).SrcPath, "/Root/Dir/Table");
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(0).DstPath, "/Root/Replicated/Dir/Table");
}

Y_UNIT_TEST(SystemObjects) {
TEnv env;
env.GetRuntime().SetLogPriority(NKikimrServices::REPLICATION_CONTROLLER, NLog::PRI_TRACE);

env.CreateTable("/Root", *MakeTableDescription(DummyTable()));
env.MkDir("/Root", "export-100500");
env.CreateTable("/Root/export-100500", *MakeTableDescription(DummyTable()));

env.GetRuntime().Register(CreateTargetDiscoverer(env.GetSender(), 1, env.GetYdbProxy(),
TVector<std::pair<TString, TString>>{
{"/Root", "/Root/Replicated"},
}
));

auto ev = env.GetRuntime().GrabEdgeEvent<TEvPrivate::TEvDiscoveryTargetsResult>(env.GetSender());
UNIT_ASSERT(ev->Get()->IsSuccess());

const auto& toAdd = ev->Get()->ToAdd;
UNIT_ASSERT_VALUES_EQUAL(toAdd.size(), 1);
UNIT_ASSERT_VALUES_EQUAL(toAdd.at(0).SrcPath, "/Root/Table");
}
}

}
20 changes: 20 additions & 0 deletions ydb/core/tx/replication/controller/ut_target_discoverer/ya.make
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
UNITTEST_FOR(ydb/core/tx/replication/controller)

FORK_SUBTESTS()

SIZE(MEDIUM)

TIMEOUT(600)

PEERDIR(
ydb/core/tx/replication/ut_helpers
library/cpp/testing/unittest
)

SRCS(
target_discoverer_ut.cpp
)

YQL_LAST_ABI_VERSION()

END()
1 change: 1 addition & 0 deletions ydb/core/tx/replication/controller/ya.make
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,5 @@ END()

RECURSE_FOR_TESTS(
ut_dst_creator
ut_target_discoverer
)
7 changes: 6 additions & 1 deletion ydb/core/tx/replication/ut_helpers/test_env.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,12 @@ class TEnv {
auto CreateTableWithIndex(Args&&... args) {
return Client.CreateTableWithUniformShardedIndex(std::forward<Args>(args)...);
}


template <typename... Args>
auto MkDir(Args&&... args) {
return Client.MkDir(std::forward<Args>(args)...);
}

void SendAsync(const TActorId& recipient, IEventBase* ev) {
Server.GetRuntime()->Send(new IEventHandle(recipient, Sender, ev));
}
Expand Down

0 comments on commit 590ac64

Please sign in to comment.