Skip to content

Commit b1baa2e

Browse files
authored
Add end-to-end async replication test. (#6522)
1 parent a2e5443 commit b1baa2e

File tree

3 files changed

+142
-0
lines changed

3 files changed

+142
-0
lines changed
+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
#include <util/system/env.h>
2+
#include <library/cpp/testing/unittest/registar.h>
3+
4+
#include <ydb/public/sdk/cpp/client/ydb_driver/driver.h>
5+
#include <ydb/public/sdk/cpp/client/ydb_table/table.h>
6+
#include <ydb/public/sdk/cpp/client/draft/ydb_scripting.h>
7+
#include <ydb/public/lib/yson_value/ydb_yson_value.h>
8+
#include <library/cpp/yson/writer.h>
9+
10+
#include <library/cpp/threading/local_executor/local_executor.h>
11+
12+
using namespace NYdb;
13+
using namespace NYdb::NTable;
14+
15+
namespace {
16+
17+
TString ReformatYson(const TString& yson) {
18+
TStringStream ysonInput(yson);
19+
TStringStream output;
20+
NYson::ReformatYsonStream(&ysonInput, &output, NYson::EYsonFormat::Text);
21+
return output.Str();
22+
}
23+
24+
void CompareYson(const TString& expected, const TString& actual) {
25+
UNIT_ASSERT_NO_DIFF(ReformatYson(expected), ReformatYson(actual));
26+
}
27+
28+
ui64 DoRead(TSession& s, const TString& table, ui64 expectedRows, const TString& expectedContent) {
29+
auto res = s.ExecuteDataQuery(
30+
Sprintf("SELECT * FROM `/local/%s`; SELECT COUNT(*) AS __count FROM `/local/%s`;",
31+
table.data(), table.data()), TTxControl::BeginTx().CommitTx()).GetValueSync();
32+
UNIT_ASSERT_C(res.IsSuccess(), res.GetIssues().ToString());
33+
auto rs = NYdb::TResultSetParser(res.GetResultSet(1));
34+
UNIT_ASSERT(rs.TryNextRow());
35+
auto count = rs.ColumnParser("__count").GetUint64();
36+
37+
if (count == expectedRows) {
38+
auto yson = NYdb::FormatResultSetYson(res.GetResultSet(0));
39+
40+
CompareYson(expectedContent, yson);
41+
}
42+
43+
return count;
44+
}
45+
46+
} // namespace
47+
48+
Y_UNIT_TEST_SUITE(Replication)
49+
{
50+
Y_UNIT_TEST(UuidValue)
51+
{
52+
TString connectionString = GetEnv("YDB_ENDPOINT") + "/?database=" + GetEnv("YDB_DATABASE");
53+
Cerr << connectionString << Endl;
54+
auto config = TDriverConfig(connectionString);
55+
auto driver = TDriver(config);
56+
auto tableClient = TTableClient(driver);
57+
auto session = tableClient.GetSession().GetValueSync().GetSession();
58+
59+
{
60+
auto res = session.ExecuteSchemeQuery(R"(
61+
CREATE TABLE `/local/ProducerUuidValue` (
62+
Key Uint32,
63+
Value1 Uuid,
64+
Value2 Uuid NOT NULL,
65+
PRIMARY KEY (Key)
66+
);
67+
)").GetValueSync();
68+
UNIT_ASSERT_C(res.IsSuccess(), res.GetIssues().ToString());
69+
}
70+
71+
{
72+
auto sessionResult = tableClient.GetSession().GetValueSync();
73+
UNIT_ASSERT_C(sessionResult.IsSuccess(), sessionResult.GetIssues().ToString());
74+
auto s = sessionResult.GetSession();
75+
76+
{
77+
const TString query = "UPSERT INTO ProducerUuidValue (Key, Value1, Value2) VALUES"
78+
"(1, "
79+
"CAST(\"5b99a330-04ef-4f1a-9b64-ba6d5f44ea01\" as Uuid), "
80+
"UNWRAP(CAST(\"5b99a330-04ef-4f1a-9b64-ba6d5f44ea02\" as Uuid)"
81+
"));";
82+
auto res = s.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).GetValueSync();
83+
UNIT_ASSERT_C(res.IsSuccess(), res.GetIssues().ToString());
84+
}
85+
86+
{
87+
const TString query = Sprintf("CREATE ASYNC REPLICATION `replication` FOR"
88+
"`ProducerUuidValue` AS `ConsumerUuidValue`"
89+
"WITH ("
90+
"CONNECTION_STRING = 'grpc://%s',"
91+
"TOKEN = 'root@builtin'"
92+
");", connectionString.data());
93+
auto res = s.ExecuteSchemeQuery(query).GetValueSync();
94+
UNIT_ASSERT_C(res.IsSuccess(), res.GetIssues().ToString());
95+
}
96+
// TODO: Make CREATE ASYNC REPLICATION to be a sync call
97+
Sleep(TDuration::Seconds(10));
98+
}
99+
100+
NYdb::NTable::TExecDataQuerySettings execSettings;
101+
execSettings.KeepInQueryCache(true);
102+
103+
auto sessionResult = tableClient.GetSession().GetValueSync();
104+
UNIT_ASSERT_C(sessionResult.IsSuccess(), sessionResult.GetIssues().ToString());
105+
106+
auto s = sessionResult.GetSession();
107+
const TString expected = R"([[[1u];["5b99a330-04ef-4f1a-9b64-ba6d5f44ea01"];"5b99a330-04ef-4f1a-9b64-ba6d5f44ea02"]])";
108+
ui32 attempt = 10;
109+
while (1 != DoRead(s, "ConsumerUuidValue", 1, expected) && --attempt) {
110+
Sleep(TDuration::Seconds(1));
111+
}
112+
113+
UNIT_ASSERT_C(attempt, "Unable to wait replication result");
114+
}
115+
}
116+
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
UNITTEST()
2+
3+
ENV(YDB_USE_IN_MEMORY_PDISKS=true)
4+
5+
ENV(YDB_ERASURE=block_4-2)
6+
7+
PEERDIR(
8+
library/cpp/threading/local_executor
9+
library/cpp/yson
10+
ydb/public/sdk/cpp/client/ydb_table
11+
ydb/public/sdk/cpp/client/draft
12+
ydb/public/lib/yson_value
13+
)
14+
15+
SRCS(
16+
main.cpp
17+
)
18+
19+
INCLUDE(${ARCADIA_ROOT}/ydb/public/tools/ydb_recipe/recipe.inc)
20+
21+
SIZE(MEDIUM)
22+
23+
REQUIREMENTS(ram:16)
24+
25+
END()

ydb/tests/functional/ya.make

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ RECURSE(
1818
query_cache
1919
rename
2020
restarts
21+
replication
2122
scheme_shard
2223
scheme_tests
2324
script_execution

0 commit comments

Comments
 (0)