Skip to content

Commit

Permalink
Fix dst creator, add tests (#2497)
Browse files Browse the repository at this point in the history
  • Loading branch information
CyberROFL authored Mar 6, 2024
1 parent 4487da6 commit 69a9b04
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 2 deletions.
25 changes: 23 additions & 2 deletions ydb/core/tx/replication/controller/dst_creator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,25 @@ class TDstCreator: public TActorBootstrapped<TDstCreator> {
}
}

NKikimrScheme::EStatus ConvertStatus(NYdb::EStatus status) {
switch (status) {
case NYdb::EStatus::SUCCESS:
return NKikimrScheme::StatusSuccess;
case NYdb::EStatus::BAD_REQUEST:
return NKikimrScheme::StatusInvalidParameter;
case NYdb::EStatus::UNAUTHORIZED:
return NKikimrScheme::StatusAccessDenied;
case NYdb::EStatus::SCHEME_ERROR:
return NKikimrScheme::StatusSchemeError;
case NYdb::EStatus::PRECONDITION_FAILED:
return NKikimrScheme::StatusPreconditionFailed;
case NYdb::EStatus::ALREADY_EXISTS:
return NKikimrScheme::StatusAlreadyExists;
default:
return NKikimrScheme::StatusNotAvailable;
}
}

void Handle(TEvYdbProxy::TEvDescribeTableResponse::TPtr& ev) {
LOG_T("Handle " << ev->Get()->ToString());

Expand All @@ -47,7 +66,7 @@ class TDstCreator: public TActorBootstrapped<TDstCreator> {
return Retry();
}

return Error(NKikimrScheme::StatusNotAvailable, TStringBuilder() << "Cannot describe table"
return Error(ConvertStatus(result.GetStatus()), TStringBuilder() << "Cannot describe table"
<< ": status: " << result.GetStatus()
<< ", issue: " << result.GetIssues().ToOneLineString());
}
Expand All @@ -62,6 +81,8 @@ class TDstCreator: public TActorBootstrapped<TDstCreator> {
return Error(NKikimrScheme::StatusSchemeError, error);
}

// TODO: support indexed tables
TxBody.SetOperationType(NKikimrSchemeOp::ESchemeOpCreateTable);
TxBody.MutableCreateTable()->SetName(ToString(ExtractBase(DstPath)));
AllocateTxId();
}
Expand Down Expand Up @@ -320,7 +341,7 @@ class TDstCreator: public TActorBootstrapped<TDstCreator> {
void Handle(TEvPipeCache::TEvDeliveryProblem::TPtr& ev) {
LOG_T("Handle " << ev->Get()->ToString());

if (SchemeShardId == ev->Get()->TabletId) {
if (SchemeShardId != ev->Get()->TabletId) {
return;
}

Expand Down
70 changes: 70 additions & 0 deletions ydb/core/tx/replication/controller/dst_creator_ut.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#include "dst_creator.h"
#include "private_events.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>

#include <util/generic/algorithm.h>

namespace NKikimr::NReplication::NController {

Y_UNIT_TEST_SUITE(DstCreator) {
using namespace NTestHelpers;

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

const auto tableDesc = TTestTableDescription{
.Name = "Table",
.KeyColumns = {"key"},
.Columns = {
{.Name = "key", .Type = "Uint32"},
{.Name = "value", .Type = "Utf8"},
},
};

env.CreateTable("/Root", *MakeTableDescription(tableDesc));
env.GetRuntime().Register(CreateDstCreator(
env.GetSender(), env.GetSchemeshardId("/Root/Table"), env.GetYdbProxy(), 1 /* rid */, 1 /* tid */,
TReplication::ETargetKind::Table, "/Root/Table", "/Root/Replicated"
));

auto ev = env.GetRuntime().GrabEdgeEvent<TEvPrivate::TEvCreateDstResult>(env.GetSender());
UNIT_ASSERT_VALUES_EQUAL(ev->Get()->Status, NKikimrScheme::StatusSuccess);

auto desc = env.GetDescription("/Root/Replicated");
const auto& replicatedDesc = desc.GetPathDescription().GetTable();

UNIT_ASSERT_VALUES_EQUAL(replicatedDesc.KeyColumnNamesSize(), tableDesc.KeyColumns.size());
for (ui32 i = 0; i < replicatedDesc.KeyColumnNamesSize(); ++i) {
UNIT_ASSERT_VALUES_EQUAL(replicatedDesc.GetKeyColumnNames(i), tableDesc.KeyColumns[i]);
}

UNIT_ASSERT_VALUES_EQUAL(replicatedDesc.ColumnsSize(), tableDesc.Columns.size());
for (ui32 i = 0; i < replicatedDesc.ColumnsSize(); ++i) {
auto pred = [name = replicatedDesc.GetColumns(i).GetName()](const auto& column) {
return name == column.Name;
};

UNIT_ASSERT(FindIfPtr(tableDesc.Columns, pred));
}
}

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

env.GetRuntime().Register(CreateDstCreator(
env.GetSender(), env.GetSchemeshardId("/Root"), env.GetYdbProxy(), 1 /* rid */, 1 /* tid */,
TReplication::ETargetKind::Table, "/Root/Table", "/Root/Replicated"
));

auto ev = env.GetRuntime().GrabEdgeEvent<TEvPrivate::TEvCreateDstResult>(env.GetSender());
UNIT_ASSERT_VALUES_EQUAL(ev->Get()->Status, NKikimrScheme::StatusSchemeError);
}
}

}
20 changes: 20 additions & 0 deletions ydb/core/tx/replication/controller/ut_dst_creator/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(
dst_creator_ut.cpp
)

YQL_LAST_ABI_VERSION()

END()
4 changes: 4 additions & 0 deletions ydb/core/tx/replication/controller/ya.make
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,7 @@ GENERATE_ENUM_SERIALIZATION(replication.h)
YQL_LAST_ABI_VERSION()

END()

RECURSE_FOR_TESTS(
ut_dst_creator
)
4 changes: 4 additions & 0 deletions ydb/core/tx/replication/ut_helpers/test_env.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,10 @@ class TEnv {
return TPathId(self.GetSchemeshardId(), self.GetPathId());
}

ui64 GetSchemeshardId(const TString& path) {
return GetPathId(path).OwnerId;
}

template <typename... Args>
auto CreateTable(Args&&... args) {
return Client.CreateTable(std::forward<Args>(args)...);
Expand Down

0 comments on commit 69a9b04

Please sign in to comment.