Hello,

after updating clickhouse from 21.2.3.15-2 to 21.3.2.5-2 I see those warnings :

 `<Warning> default.osb4_reverse.DirectoryMonitor: Structure does not match (remote: Path LowCardinality(String) ColumnLowCardinality(size = 0, UInt8(size = 0), ColumnUnique(size = 1, String(size = 1))), Value Float64 Float64(size = 0), Time UInt32 UInt32(size = 0), Date Date UInt16(size = 0), Timestamp UInt32 UInt32(size = 0), local: Path LowCardinality(String) ColumnLowCardinality(size = 0, UInt16(size = 0), ColumnUnique(size = 1, String(size = 1))), Value Float64 Float64(size = 0), Time UInt32 UInt32(size = 0), Date Date UInt16(size = 0), Timestamp UInt32 UInt32(size = 0)), implicit conversion will be done`

I think this is related to https://github.com/ClickHouse/ClickHouse/pull/19947

The only difference between remote and local I found inside this log is :

ColumnLowCardinality(size = 0, UInt8(size = 0) to
ColumnLowCardinality(size = 0, UInt16(size = 0)

But I don't see the difference between the tables.

```
SHOW CREATE TABLE default.osb4_reverse

CREATE TABLE default.osb4_reverse
(
    `Path` LowCardinality(String) CODEC(ZSTD(15)),
    `Value` Float64 CODEC(Gorilla, ZSTD(22)),
    `Time` UInt32 CODEC(DoubleDelta, ZSTD(15)),
    `Date` Date CODEC(Delta(2), ZSTD(22)),
    `Timestamp` UInt32 CODEC(ZSTD(15))
)
ENGINE = Distributed('osb4_hpc_metrics', '', 'osb4_reverse', rand())


CREATE TABLE osb4_metrics_r0.osb4_reverse
(
    `Path` LowCardinality(String) CODEC(ZSTD(15)),
    `Value` Float64 CODEC(Gorilla, ZSTD(22)),
    `Time` UInt32 CODEC(DoubleDelta, ZSTD(15)),
    `Date` Date CODEC(Delta(2), ZSTD(22)),
    `Timestamp` UInt32 CODEC(ZSTD(15))
)
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/clusters/osb4_hpc_metrics/tables/{table4}/data', '{host2}')
PARTITION BY toYYYYMM(Date)
ORDER BY (Path, Time)
TTL Date + toIntervalMonth(6)
SETTINGS index_granularity = 8192
```

Any hints ?

Ralph
DistributedBlockOutputStream::runWritingJob(DistributedBlockOutputStream::JobReplica & job, const Block & current_block, size_t num_shards)
{
    auto thread_group = CurrentThread::getGroup();
    return [this, thread_group, &job, &current_block, num_shards]()
    {
        if (thread_group)
            CurrentThread::attachToIfDetached(thread_group);
        setThreadName("DistrOutStrProc");
        ++job.blocks_started;
        SCOPE_EXIT({
            ++finished_jobs_count;
            UInt64 elapsed_time_for_block_ms = watch_current_block.elapsedMilliseconds();
            job.elapsed_time_ms += elapsed_time_for_block_ms;
            job.max_elapsed_time_for_block_ms = std::max(job.max_elapsed_time_for_block_ms, elapsed_time_for_block_ms);
        });
        const auto & shard_info = cluster->getShardsInfo()[job.shard_index];
        auto & shard_job = per_shard_jobs[job.shard_index];
        const auto & addresses = cluster->getShardsAddresses();
        
        if (num_shards > 1)
        {
            auto & shard_permutation = shard_job.shard_current_block_permutation;
            size_t num_shard_rows = shard_permutation.size();
            for (size_t j = 0; j < current_block.columns(); ++j)
            {
                const auto & src_column = current_block.getByPosition(j).column;
                auto & dst_column = job.current_shard_block.getByPosition(j).column;