I ran an optimize on 21.2, and the merge kept failing.
```
2021.02.09 14:38:06.519295 [ 14569 ] {} <Trace> db.table: Executing log entry to merge parts all_0_91343_4396, all_91344_91581_59, all_91582_91582_0, all_91583_91583_0, all_91584_91584_0 to all_0_91584_4397
2021.02.09 14:38:06.519361 [ 14569 ] {} <Debug> DiskLocal: Reserving 93.94 MiB on disk `default`, having unreserved 445.19 GiB.
2021.02.09 14:38:06.519377 [ 14569 ] {} <Debug> db.table (MergerMutator): Merging 5 parts: from all_0_91343_4396 to all_91584_91584_0 into Wide
2021.02.09 14:38:06.519408 [ 14569 ] {} <Debug> db.table (MergerMutator): Selected MergeAlgorithm: Vertical
2021.02.09 14:38:06.519506 [ 14569 ] {} <Trace> MergeTreeSequentialSource: Reading 178 marks from part all_0_91343_4396, total 1452977 rows starting from the beginning of the part, column ap_key
2021.02.09 14:38:06.519573 [ 14569 ] {} <Trace> MergeTreeSequentialSource: Reading 1 marks from part all_91344_91581_59, total 1654 rows starting from the beginning of the part, column ap_key
2021.02.09 14:38:06.519644 [ 14569 ] {} <Trace> MergeTreeSequentialSource: Reading 1 marks from part all_91582_91582_0, total 6 rows starting from the beginning of the part, column ap_key
2021.02.09 14:38:06.519705 [ 14569 ] {} <Trace> MergeTreeSequentialSource: Reading 1 marks from part all_91583_91583_0, total 6 rows starting from the beginning of the part, column ap_key
2021.02.09 14:38:06.519787 [ 14569 ] {} <Trace> MergeTreeSequentialSource: Reading 1 marks from part all_91584_91584_0, total 10 rows starting from the beginning of the part, column ap_key
2021.02.09 14:38:06.521671 [ 14569 ] {} <Debug> MemoryTracker: Peak memory usage: 4.07 MiB.
2021.02.09 14:38:06.521756 [ 14569 ] {} <Error> db.table: auto DB::StorageReplicatedMergeTree::processQueueEntry(ReplicatedMergeTreeQueue::SelectedEntryPtr)::(anonymous class)::operator()(DB::StorageReplicatedMergeTree::LogEntryPtr &) const: Code: 49, e.displayText() = DB::Exception: Incomplete granules are not allowed while blocks are granules size. Mark number 0 (rows 8192), rows written in last mark 0, rows to write in last mark from block 8180 (from row 0), total marks currently 1, Stack trace (when copying this message, always include the lines below):

0. DB::Exception::Exception<unsigned long&, unsigned long, unsigned long&, unsigned long&, unsigned long&, unsigned long>(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long&, unsigned long&&, unsigned long&, unsigned long&, unsigned long&, unsigned long&&) @ 0xf3b8fd5 in /usr/bin/clickhouse
1. DB::MergeTreeDataPartWriterWide::shiftCurrentMark(std::__1::vector<DB::Granule, std::__1::allocator<DB::Granule> > const&) @ 0xf3b8ecd in /usr/bin/clickhouse
2. DB::MergeTreeDataPartWriterWide::write(DB::Block const&, DB::PODArray<unsigned long, 4096ul, Allocator<false, false>, 15ul, 16ul> const*) @ 0xf3b997f in /usr/bin/clickhouse
3. DB::MergeTreeDataMergerMutator::mergePartsToTemporaryPart(DB::FutureMergedMutatedPart const&, std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, DB::BackgroundProcessListEntry<DB::MergeListElement, DB::MergeInfo>&, std::__1::shared_ptr<DB::RWLockImpl::LockHolderImpl>&, long, DB::Context const&, std::__1::unique_ptr<DB::IReservation, std::__1::default_delete<DB::IReservation> > const&, bool, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&) @ 0xf373c39 in /usr/bin/clickhouse
4. DB::StorageReplicatedMergeTree::tryExecuteMerge(DB::ReplicatedMergeTreeLogEntry const&) @ 0xf155cd8 in /usr/bin/clickhouse
5. DB::StorageReplicatedMergeTree::executeLogEntry(DB::ReplicatedMergeTreeLogEntry&) @ 0xf14abc3 in /usr/bin/clickhouse
6. ? @ 0xf1bac7f in /usr/bin/clickhouse
7. DB::ReplicatedMergeTreeQueue::processEntry(std::__1::function<std::__1::shared_ptr<zkutil::ZooKeeper> ()>, std::__1::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&, std::__1::function<bool (std::__1::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&)>) @ 0xf4c8428 in /usr/bin/clickhouse
8. DB::StorageReplicatedMergeTree::processQueueEntry(std::__1::shared_ptr<DB::ReplicatedMergeTreeQueue::SelectedEntry>) @ 0xf17446d in /usr/bin/clickhouse
9. ? @ 0xf2cb076 in /usr/bin/clickhouse
10. ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::__1::__list_iterator<ThreadFromGlobalPool, void*>) @ 0x8513fb8 in /usr/bin/clickhouse
11. ThreadFromGlobalPool::ThreadFromGlobalPool<void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()>(void&&, void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()&&...)::'lambda'()::operator()() @ 0x8515f6f in /usr/bin/clickhouse
12. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x851158f in /usr/bin/clickhouse
13. ? @ 0x8515023 in /usr/bin/clickhouse
14. start_thread @ 0x74a4 in /lib/x86_64-linux-gnu/libpthread-2.24.so
15. __clone @ 0xe8d0f in /lib/x86_64-linux-gnu/libc-2.24.so
 (version 21.2.2.8 (official build))
```
I stopped merges for this table, but the postponer kept generating the same exception:
```
2021.02.09 15:29:12.019727 [ 14586 ] {} <Error> auto DB::IBackgroundJobExecutor::jobExecutingTask()::(anonymous class)::operator()() const: Code: 49, e.displayText() = DB::Exception: Incomplete granules are not allowed while blocks are granules size. Mark number 0 (rows 8192), rows written in last mark 0, rows to write in last mark from block 2540 (from row 0), total marks currently 1, Stack trace (when copying this message, always include the lines below):

0. DB::Exception::Exception<unsigned long&, unsigned long, unsigned long&, unsigned long&, unsigned long&, unsigned long>(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long&, unsigned long&&, unsigned long&, unsigned long&, unsigned long&, unsigned long&&) @ 0xf3b8fd5 in /usr/bin/clickhouse
1. DB::MergeTreeDataPartWriterWide::shiftCurrentMark(std::__1::vector<DB::Granule, std::__1::allocator<DB::Granule> > const&) @ 0xf3b8ecd in /usr/bin/clickhouse
2. DB::MergeTreeDataPartWriterWide::write(DB::Block const&, DB::PODArray<unsigned long, 4096ul, Allocator<false, false>, 15ul, 16ul> const*) @ 0xf3b997f in /usr/bin/clickhouse
3. DB::MergeTreeDataMergerMutator::mergePartsToTemporaryPart(DB::FutureMergedMutatedPart const&, std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, DB::BackgroundProcessListEntry<DB::MergeListElement, DB::MergeInfo>&, std::__1::shared_ptr<DB::RWLockImpl::LockHolderImpl>&, long, DB::Context const&, std::__1::unique_ptr<DB::IReservation, std::__1::default_delete<DB::IReservation> > const&, bool, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&) @ 0xf373c39 in /usr/bin/clickhouse
4. DB::StorageMergeTree::mergeSelectedParts(std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, bool, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, DB::StorageMergeTree::MergeMutateSelectedEntry&, std::__1::shared_ptr<DB::RWLockImpl::LockHolderImpl>&) @ 0xf10f108 in /usr/bin/clickhouse
5. ? @ 0xf12168c in /usr/bin/clickhouse
6. ? @ 0xf2cb076 in /usr/bin/clickhouse
7. ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::__1::__list_iterator<ThreadFromGlobalPool, void*>) @ 0x8513fb8 in /usr/bin/clickhouse
8. ThreadFromGlobalPool::ThreadFromGlobalPool<void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()>(void&&, void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()&&...)::'lambda'()::operator()() @ 0x8515f6f in /usr/bin/clickhouse
9. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x851158f in /usr/bin/clickhouse
10. ? @ 0x8515023 in /usr/bin/clickhouse
11. start_thread @ 0x74a4 in /lib/x86_64-linux-gnu/libpthread-2.24.so
12. __clone @ 0xe8d0f in /lib/x86_64-linux-gnu/libc-2.24.so
 (version 21.2.2.8 (official build))
```
After a downgrade to 20.12 the merge completed successfully.
{
    auto last_granule = granules_written.back();
    
    if (!last_granule.is_complete)
    {
        if (settings.blocks_are_granules_size)
            throw Exception(ErrorCodes::LOGICAL_ERROR, "Incomplete granules are not allowed while blocks are granules size. "
                "Mark number {} (rows {}), rows written in last mark {}, rows to write in last mark from block {} (from row {}), total marks currently {}",
                last_granule.mark_number, index_granularity.getMarkRows(last_granule.mark_number), rows_written_in_last_mark,
                last_granule.rows_to_write, last_granule.start_row, index_granularity.getMarksCount());
        
        setCurrentMark(getCurrentMark() + granules_written.size() - 1);
        bool still_in_the_same_granule = granules_written.size() == 1;
        
        
        if (still_in_the_same_granule)
            rows_written_in_last_mark += last_granule.rows_to_write;
        else
            rows_written_in_last_mark = last_granule.rows_to_write;
    }
    else
    {
        setCurrentMark(getCurrentMark() + granules_written.size());
        rows_written_in_last_mark = 0;
    }
}
void MergeTreeDataPartWriterWide::write(const Block & block, const IColumn::Permutation * permutation)