Skip to content

Commit 5cf1c25

Browse files
author
robot-clickhouse
committed
Backport #11739 to 20.3: [RFC] Parse metadata stored in zookeeper before checking for equality
1 parent 2c1301c commit 5cf1c25

File tree

5 files changed

+57
-5
lines changed

5 files changed

+57
-5
lines changed

src/Storages/MergeTree/ReplicatedMergeTreeTableMetadata.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ void ReplicatedMergeTreeTableMetadata::checkImmutableFieldsEquals(const Replicat
210210

211211
}
212212

213-
void ReplicatedMergeTreeTableMetadata::checkEquals(const ReplicatedMergeTreeTableMetadata & from_zk) const
213+
void ReplicatedMergeTreeTableMetadata::checkEquals(const ReplicatedMergeTreeTableMetadata & from_zk, const ColumnsDescription & columns, const Context & context) const
214214
{
215215

216216
checkImmutableFieldsEquals(from_zk);
@@ -232,20 +232,24 @@ void ReplicatedMergeTreeTableMetadata::checkEquals(const ReplicatedMergeTreeTabl
232232
ErrorCodes::METADATA_MISMATCH);
233233
}
234234

235-
if (skip_indices != from_zk.skip_indices)
235+
String parsed_zk_skip_indices = IndicesDescription::parse(from_zk.skip_indices, columns, context).toString();
236+
if (skip_indices != parsed_zk_skip_indices)
236237
{
237238
throw Exception(
238239
"Existing table metadata in ZooKeeper differs in skip indexes."
239240
" Stored in ZooKeeper: " + from_zk.skip_indices +
241+
", parsed from ZooKeeper: " + parsed_zk_skip_indices +
240242
", local: " + skip_indices,
241243
ErrorCodes::METADATA_MISMATCH);
242244
}
243245

244-
if (constraints != from_zk.constraints)
246+
String parsed_zk_constraints = ConstraintsDescription::parse(from_zk.constraints).toString();
247+
if (constraints != parsed_zk_constraints)
245248
{
246249
throw Exception(
247250
"Existing table metadata in ZooKeeper differs in constraints."
248251
" Stored in ZooKeeper: " + from_zk.constraints +
252+
", parsed from ZooKeeper: " + parsed_zk_constraints +
249253
", local: " + constraints,
250254
ErrorCodes::METADATA_MISMATCH);
251255
}

src/Storages/MergeTree/ReplicatedMergeTreeTableMetadata.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ struct ReplicatedMergeTreeTableMetadata
6060
}
6161
};
6262

63-
void checkEquals(const ReplicatedMergeTreeTableMetadata & from_zk) const;
63+
void checkEquals(const ReplicatedMergeTreeTableMetadata & from_zk, const ColumnsDescription & columns, const Context & context) const;
6464

6565
Diff checkAndFindDiff(const ReplicatedMergeTreeTableMetadata & from_zk) const;
6666

src/Storages/StorageReplicatedMergeTree.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,7 @@ void StorageReplicatedMergeTree::checkTableStructure(const String & zookeeper_pr
458458
Coordination::Stat metadata_stat;
459459
String metadata_str = zookeeper->get(zookeeper_prefix + "/metadata", &metadata_stat);
460460
auto metadata_from_zk = ReplicatedMergeTreeTableMetadata::parse(metadata_str);
461-
old_metadata.checkEquals(metadata_from_zk);
461+
old_metadata.checkEquals(metadata_from_zk, getColumns(), global_context);
462462

463463
Coordination::Stat columns_stat;
464464
auto columns_from_zk = ColumnsDescription::parse(zookeeper->get(zookeeper_prefix + "/columns", &columns_stat));

tests/integration/test_replicated_parse_zk_metadata/__init__.py

Whitespace-only changes.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import pytest
2+
3+
from helpers.cluster import ClickHouseCluster
4+
5+
cluster = ClickHouseCluster(__file__)
6+
node = cluster.add_instance('node', with_zookeeper=True)
7+
8+
@pytest.fixture(scope='module', autouse=True)
9+
def started_cluster():
10+
try:
11+
cluster.start()
12+
yield cluster
13+
finally:
14+
cluster.shutdown()
15+
16+
def test_replicated_engine_parse_metadata_on_attach():
17+
node.query(
18+
'''
19+
CREATE TABLE data (
20+
key Int,
21+
INDEX key_idx0 key+0 TYPE minmax GRANULARITY 1,
22+
INDEX key_idx1 key+1 TYPE minmax GRANULARITY 1
23+
)
24+
ENGINE = ReplicatedMergeTree('/ch/tables/default/data', 'node')
25+
ORDER BY key;
26+
''')
27+
node.query('DETACH TABLE data')
28+
29+
zk = cluster.get_kazoo_client('zoo1')
30+
# Add **extra space between indices**, to check that it will be re-parsed
31+
# and successfully accepted by the server.
32+
#
33+
# This metadata was obtain from the server without #11325
34+
zk.set('/ch/tables/default/data/replicas/node/metadata', """
35+
metadata format version: 1
36+
date column:
37+
sampling expression:
38+
index granularity: 8192
39+
mode: 0
40+
sign column:
41+
primary key: key
42+
data format version: 1
43+
partition key:
44+
indices: key_idx0 key + 0 TYPE minmax GRANULARITY 1, key_idx1 key + 1 TYPE minmax GRANULARITY 1
45+
granularity bytes: 10485760
46+
47+
""".lstrip())
48+
node.query('ATTACH TABLE data')

0 commit comments

Comments
 (0)