Skip to content

Commit 19eab67

Browse files
authored
Fix restore data option in YDB CLI (#9009)
1 parent 54bc46b commit 19eab67

File tree

2 files changed

+82
-16
lines changed

2 files changed

+82
-16
lines changed

ydb/public/lib/ydb_cli/dump/restore_impl.cpp

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ TTableDescription TableDescriptionFromProto(const Ydb::Table::CreateTableRequest
4545
return TProtoAccessor::FromProto(proto);
4646
}
4747

48+
TTableDescription TableDescriptionWithoutIndexesFromProto(Ydb::Table::CreateTableRequest proto) {
49+
proto.clear_indexes();
50+
return TableDescriptionFromProto(proto);
51+
}
52+
4853
Ydb::Scheme::ModifyPermissionsRequest ReadPermissions(const TString& fsPath) {
4954
Ydb::Scheme::ModifyPermissionsRequest proto;
5055
Y_ENSURE(google::protobuf::TextFormat::ParseFromString(TFileInput(fsPath).ReadAll(), &proto));
@@ -221,15 +226,25 @@ TRestoreResult TRestoreClient::RestoreTable(const TFsPath& fsPath, const TString
221226
auto scheme = ReadTableScheme(fsPath.Child(SCHEME_FILE_NAME));
222227
auto dumpedDesc = TableDescriptionFromProto(scheme);
223228

229+
if (dumpedDesc.GetAttributes().contains(DOC_API_TABLE_VERSION_ATTR) && settings.SkipDocumentTables_) {
230+
return Result<TRestoreResult>();
231+
}
232+
224233
if (settings.DryRun_) {
225234
return CheckSchema(dbPath, dumpedDesc);
226235
}
227236

228-
if (settings.RestoreData_) {
229-
auto woIndexes = scheme;
230-
woIndexes.clear_indexes();
237+
auto withoutIndexesDesc = TableDescriptionWithoutIndexesFromProto(scheme);
238+
auto createResult = TableClient.RetryOperationSync([&dbPath, &withoutIndexesDesc](TSession session) {
239+
return session.CreateTable(dbPath, TTableDescription(withoutIndexesDesc),
240+
TCreateTableSettings().RequestType(DOC_API_REQUEST_TYPE)).GetValueSync();
241+
});
242+
if (!createResult.IsSuccess()) {
243+
return Result<TRestoreResult>(dbPath, std::move(createResult));
244+
}
231245

232-
auto result = RestoreData(fsPath, dbPath, settings, TableDescriptionFromProto(woIndexes));
246+
if (settings.RestoreData_) {
247+
auto result = RestoreData(fsPath, dbPath, settings, withoutIndexesDesc);
233248
if (!result.IsSuccess()) {
234249
return result;
235250
}
@@ -303,18 +318,6 @@ struct TWriterWaiter {
303318
};
304319

305320
TRestoreResult TRestoreClient::RestoreData(const TFsPath& fsPath, const TString& dbPath, const TRestoreSettings& settings, const TTableDescription& desc) {
306-
if (desc.GetAttributes().contains(DOC_API_TABLE_VERSION_ATTR) && settings.SkipDocumentTables_) {
307-
return Result<TRestoreResult>();
308-
}
309-
310-
auto createResult = TableClient.RetryOperationSync([&dbPath, &desc](TSession session) {
311-
return session.CreateTable(dbPath, TTableDescription(desc),
312-
TCreateTableSettings().RequestType(DOC_API_REQUEST_TYPE)).GetValueSync();
313-
});
314-
if (!createResult.IsSuccess()) {
315-
return Result<TRestoreResult>(dbPath, std::move(createResult));
316-
}
317-
318321
THolder<NPrivate::IDataAccumulator> accumulator;
319322
THolder<NPrivate::IDataWriter> writer;
320323

ydb/tests/functional/ydb_cli/test_ydb_backup.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,3 +1198,66 @@ def test_restore_acl_option(self):
11981198
is_permissions_the_same(self.driver.scheme_client, "/Root/folder/table", "/Root/restored/table"),
11991199
is_(False)
12001200
)
1201+
1202+
1203+
class TestRestoreNoData(BaseTestBackupInFiles):
1204+
def test_restore_no_data(self):
1205+
self.driver.scheme_client.make_directory("/Root/folder")
1206+
1207+
session = self.driver.table_client.session().create()
1208+
1209+
# Create table and modify permissions on it
1210+
create_table_with_data(session, "folder/table")
1211+
modify_permissions(self.driver.scheme_client, "folder/table")
1212+
1213+
# Backup table
1214+
backup_files_dir = output_path(self.test_name, "test_single_table", "backup_files_dir")
1215+
yatest_common.execute(
1216+
[
1217+
backup_bin(),
1218+
"--verbose",
1219+
"--endpoint", "grpc://localhost:%d" % self.cluster.nodes[1].grpc_port,
1220+
"--database", "/Root",
1221+
"tools", "dump",
1222+
"--path", "/Root/folder",
1223+
"--output", backup_files_dir
1224+
]
1225+
)
1226+
assert_that(
1227+
os.listdir(backup_files_dir),
1228+
is_(["table"])
1229+
)
1230+
assert_that(
1231+
self.scheme_listdir("/Root"),
1232+
is_(["folder"])
1233+
)
1234+
1235+
# Restore table
1236+
restore_cmd = [
1237+
backup_bin(),
1238+
"--verbose",
1239+
"--endpoint", "grpc://localhost:%d" % self.cluster.nodes[1].grpc_port,
1240+
"--database", "/Root",
1241+
"tools", "restore",
1242+
"--path", "/Root/restored",
1243+
"--input", backup_files_dir,
1244+
"--restore-data", "false",
1245+
]
1246+
yatest_common.execute(restore_cmd)
1247+
1248+
assert_that(
1249+
self.scheme_listdir("/Root"),
1250+
contains_inanyorder("folder", "restored")
1251+
)
1252+
assert_that(
1253+
self.scheme_listdir("/Root/restored"),
1254+
is_(["table"])
1255+
)
1256+
assert_that(
1257+
is_tables_the_same(session, self.driver.scheme_client, "/Root/folder/table", "/Root/restored/table", False),
1258+
is_(True)
1259+
)
1260+
assert_that(
1261+
is_data_the_same(session, "/Root/folder/table", "/Root/restored/table"),
1262+
is_(False)
1263+
)

0 commit comments

Comments
 (0)