Skip to content

Commit

Permalink
Create replicated tables with the same owner as the replication itself (
Browse files Browse the repository at this point in the history
  • Loading branch information
CyberROFL committed Jun 6, 2024
1 parent a5c8db4 commit ea05528
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 0 deletions.
9 changes: 9 additions & 0 deletions ydb/core/tx/replication/controller/dst_creator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ class TDstCreator: public TActorBootstrapped<TDstCreator> {
return Error(NKikimrScheme::StatusSchemeError, "Empty domain info");
}

if (entry.SecurityObject) {
Owner = entry.SecurityObject->GetOwnerSID();
}

DomainKey = entry.DomainInfo->DomainKey;
Resolve(DomainKey);
} else {
Expand Down Expand Up @@ -212,6 +216,10 @@ class TDstCreator: public TActorBootstrapped<TDstCreator> {
auto ev = MakeHolder<TEvSchemeShard::TEvModifySchemeTransaction>(TxId, SchemeShardId);
*ev->Record.AddTransaction() = TxBody;

if (Owner) {
ev->Record.SetOwner(Owner);
}

Send(PipeCache, new TEvPipeCache::TEvForward(ev.Release(), SchemeShardId, true));
Become(&TThis::StateCreateDst);
}
Expand Down Expand Up @@ -554,6 +562,7 @@ class TDstCreator: public TActorBootstrapped<TDstCreator> {

TPathId DomainKey;
TString Database;
TString Owner;
TTableProfiles TableProfiles;
ui64 TxId = 0;
NKikimrSchemeOp::TModifyScheme TxBody;
Expand Down
27 changes: 27 additions & 0 deletions ydb/core/tx/replication/controller/dst_creator_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,33 @@ Y_UNIT_TEST_SUITE(DstCreator) {
Basic("/Root/Dir/Replicated");
}

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

env.ModifyOwner("/", "Root", "user@builtin");
env.CreateTable("/Root", *MakeTableDescription({
.Name = "Table",
.KeyColumns = {"key"},
.Columns = {
{.Name = "key", .Type = "Uint32"},
{.Name = "value", .Type = "Utf8"},
},
.ReplicationConfig = Nothing(),
}));
env.GetRuntime().Register(CreateDstCreator(
env.GetSender(), env.GetSchemeshardId("/Root/Table"), env.GetYdbProxy(), env.GetPathId("/Root"),
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& replicatedSelf = desc.GetPathDescription().GetSelf();
UNIT_ASSERT_VALUES_EQUAL(replicatedSelf.GetOwner(), "user@builtin");
}

Y_UNIT_TEST(NonExistentSrc) {
TEnv env;
env.GetRuntime().SetLogPriority(NKikimrServices::REPLICATION_CONTROLLER, NLog::PRI_TRACE);
Expand Down
5 changes: 5 additions & 0 deletions ydb/core/tx/replication/ut_helpers/test_env.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,11 @@ class TEnv {
}
}

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

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

0 comments on commit ea05528

Please sign in to comment.