Parse metadata stored in zookeeper before checking for equality

After #11325 trailing whitespaces has been removed for data skipping
indicies, and it may be different, if you have multiple skip indices,
and in this case new server will not load such tables, because metadata
will be different.

Fix this by re-parse metadata in zookeeper.
This commit is contained in:
Azat Khuzhin 2020-06-17 21:03:22 +03:00
parent ac93f2795c
commit caa88777be
3 changed files with 9 additions and 5 deletions

View File

@ -210,7 +210,7 @@ void ReplicatedMergeTreeTableMetadata::checkImmutableFieldsEquals(const Replicat
}
void ReplicatedMergeTreeTableMetadata::checkEquals(const ReplicatedMergeTreeTableMetadata & from_zk) const
void ReplicatedMergeTreeTableMetadata::checkEquals(const ReplicatedMergeTreeTableMetadata & from_zk, const ColumnsDescription & columns, const Context & context) const
{
checkImmutableFieldsEquals(from_zk);
@ -232,20 +232,24 @@ void ReplicatedMergeTreeTableMetadata::checkEquals(const ReplicatedMergeTreeTabl
ErrorCodes::METADATA_MISMATCH);
}
if (skip_indices != from_zk.skip_indices)
String parsed_zk_skip_indices = IndicesDescription::parse(from_zk.skip_indices, columns, context).toString();
if (skip_indices != parsed_zk_skip_indices)
{
throw Exception(
"Existing table metadata in ZooKeeper differs in skip indexes."
" Stored in ZooKeeper: " + from_zk.skip_indices +
", parsed from ZooKeeper: " + parsed_zk_skip_indices +
", local: " + skip_indices,
ErrorCodes::METADATA_MISMATCH);
}
if (constraints != from_zk.constraints)
String parsed_zk_constraints = ConstraintsDescription::parse(from_zk.constraints).toString();
if (constraints != parsed_zk_constraints)
{
throw Exception(
"Existing table metadata in ZooKeeper differs in constraints."
" Stored in ZooKeeper: " + from_zk.constraints +
", parsed from ZooKeeper: " + parsed_zk_constraints +
", local: " + constraints,
ErrorCodes::METADATA_MISMATCH);
}

View File

@ -60,7 +60,7 @@ struct ReplicatedMergeTreeTableMetadata
}
};
void checkEquals(const ReplicatedMergeTreeTableMetadata & from_zk) const;
void checkEquals(const ReplicatedMergeTreeTableMetadata & from_zk, const ColumnsDescription & columns, const Context & context) const;
Diff checkAndFindDiff(const ReplicatedMergeTreeTableMetadata & from_zk) const;

View File

@ -741,7 +741,7 @@ void StorageReplicatedMergeTree::checkTableStructure(const String & zookeeper_pr
Coordination::Stat metadata_stat;
String metadata_str = zookeeper->get(zookeeper_prefix + "/metadata", &metadata_stat);
auto metadata_from_zk = ReplicatedMergeTreeTableMetadata::parse(metadata_str);
old_metadata.checkEquals(metadata_from_zk);
old_metadata.checkEquals(metadata_from_zk, getColumns(), global_context);
Coordination::Stat columns_stat;
auto columns_from_zk = ColumnsDescription::parse(zookeeper->get(zookeeper_prefix + "/columns", &columns_stat));