Rewrite and fix find_holes into a more obvious version

hotfix-1.0.0
Vitaliy Filippov 2023-05-24 19:00:15 +03:00
parent eeb6727170
commit 93778324e5
1 changed files with 20 additions and 31 deletions

View File

@ -42,46 +42,35 @@ void blockstore_impl_t::find_holes(std::vector<copy_buffer_t> & read_vec,
std::function<int(int, bool, uint32_t, uint32_t)> callback)
{
auto cur_start = item_start;
auto alloc_start = item_start;
int i = 0;
while (1)
while (cur_start < item_end)
{
// COPY_BUF_CSUM_FILL items are fake items inserted in the end, their offsets aren't in order
for (; i < read_vec.size() && !(read_vec[i].copy_flags & COPY_BUF_CSUM_FILL); i++)
if (i >= read_vec.size() || read_vec[i].copy_flags & COPY_BUF_CSUM_FILL || read_vec[i].offset >= item_end)
{
if (read_vec[i].offset >= cur_start)
break;
else if (read_vec[i].offset + read_vec[i].len > cur_start)
{
// Allocated: cur_start .. read_vec[i].offset + read_vec[i].len
cur_start = read_vec[i].offset + read_vec[i].len;
if (cur_start >= item_end)
goto endwhile;
}
// Hole (at end): cur_start .. item_end
i += callback(i, false, cur_start, item_end);
break;
}
if (i < read_vec.size() && !(read_vec[i].copy_flags & COPY_BUF_CSUM_FILL) && read_vec[i].offset == cur_start)
else if (read_vec[i].offset > cur_start)
{
// Allocated - don't move alloc_start
// Hole: cur_start .. min(read_vec[i].offset, item_end)
auto cur_end = read_vec[i].offset > item_end ? item_end : read_vec[i].offset;
i += callback(i, false, cur_start, cur_end);
cur_start = cur_end;
}
else if (read_vec[i].offset + read_vec[i].len > cur_start)
{
// Allocated: cur_start .. min(read_vec[i].offset + read_vec[i].len, item_end)
auto cur_end = read_vec[i].offset + read_vec[i].len;
cur_end = cur_end > item_end ? item_end : cur_end;
i += callback(i, true, cur_start, cur_end);
cur_start = cur_end;
i++;
}
else
{
// Hole
uint32_t cur_end = (i == read_vec.size() || (read_vec[i].copy_flags & COPY_BUF_CSUM_FILL) || read_vec[i].offset >= item_end
? item_end : read_vec[i].offset);
if (alloc_start < cur_start)
i += callback(i, true, alloc_start, cur_start);
i += callback(i, false, cur_start, cur_end);
alloc_start = cur_end;
}
if (i >= read_vec.size() || (read_vec[i].copy_flags & COPY_BUF_CSUM_FILL))
break;
cur_start = read_vec[i].offset + read_vec[i].len;
if (cur_start >= item_end)
break;
i++;
}
endwhile:
if (alloc_start < cur_start)
i += callback(i, true, alloc_start, cur_start);
}
int blockstore_impl_t::fulfill_read(blockstore_op_t *read_op,