File size is updated correctly according to 

> fdatasync() is similar to fsync(), but does not flush modified metadata unless that metadata is needed in order to allow a subsequent data retrieval to be correctly handled.  For example, changes to  st_atime  or  st_mtime  (respec‐
       tively,  time  of  last  access  and  time  of last modification; see inode(7)) do not require flushing because they are not necessary for a subsequent data read to be handled correctly.  On the other hand, a change to the file size
       (st_size, as made by say ftruncate(2)), would require a metadata flush.

And we don't care about modification times.
Should work alright.
{
        if (current_block_index == partition_blocks_size)
            return false;
        size_t block_offset = 0;
        bool write_in_current_block = current_write_block.writeKey(key, block_offset);
        if (write_in_current_block)
        {
            index.block_index = current_block_index;
            index.offset_in_block = block_offset;
            return true;
        }
        current_write_block.writeKeysSize();
        current_write_block.writeCheckSum();
        ++current_block_index;
        if (current_block_index == partition_blocks_size)
            return false;
        current_write_block.reset(buffer.m_data + (block_size * current_block_index));
        write_in_current_block = current_write_block.writeKey(key, block_offset);
        assert(write_in_current_block);
        index.block_index = current_block_index;
        index.offset_in_block = block_offset;
        return write_in_current_block;
    }
    void writeKeysSizeAndCheckSumForCurrentWriteBlock()