Remove sync_to_repeat map and use simpler repeating
This commit is contained in:
@@ -23,6 +23,7 @@ journal_flusher_t::journal_flusher_t(blockstore_impl_t *bs)
|
|||||||
co = new journal_flusher_co[max_flusher_count];
|
co = new journal_flusher_co[max_flusher_count];
|
||||||
for (int i = 0; i < max_flusher_count; i++)
|
for (int i = 0; i < max_flusher_count; i++)
|
||||||
{
|
{
|
||||||
|
co[i].co_id = i;
|
||||||
co[i].bs = bs;
|
co[i].bs = bs;
|
||||||
co[i].flusher = this;
|
co[i].flusher = this;
|
||||||
if (bs->dsk.csum_block_size)
|
if (bs->dsk.csum_block_size)
|
||||||
@@ -161,10 +162,21 @@ resume_0:
|
|||||||
res = bs->heap->get_next_compact(cur_oid);
|
res = bs->heap->get_next_compact(cur_oid);
|
||||||
if (res == ENOENT)
|
if (res == ENOENT)
|
||||||
{
|
{
|
||||||
|
cur_oid = {};
|
||||||
wait_state = 0;
|
wait_state = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
for (int i = 0; i < flusher->cur_flusher_count; i++)
|
||||||
|
{
|
||||||
|
if (i != co_id && flusher->co[i].cur_oid == cur_oid)
|
||||||
|
{
|
||||||
|
// Already flushing it
|
||||||
|
flusher->co[i].should_repeat = true;
|
||||||
|
goto resume_0;
|
||||||
|
}
|
||||||
|
}
|
||||||
resume_1:
|
resume_1:
|
||||||
|
should_repeat = false;
|
||||||
cur_obj = bs->heap->lock_and_read_entry(cur_oid, cur_lsn);
|
cur_obj = bs->heap->lock_and_read_entry(cur_oid, cur_lsn);
|
||||||
if (!cur_obj)
|
if (!cur_obj)
|
||||||
{
|
{
|
||||||
@@ -183,24 +195,6 @@ resume_1:
|
|||||||
compact_lsn = begin_wr->lsn;
|
compact_lsn = begin_wr->lsn;
|
||||||
assert(!end_wr->next() && end_wr->flags == (BS_HEAP_BIG_WRITE|BS_HEAP_STABLE));
|
assert(!end_wr->next() && end_wr->flags == (BS_HEAP_BIG_WRITE|BS_HEAP_STABLE));
|
||||||
clean_loc = end_wr->location;
|
clean_loc = end_wr->location;
|
||||||
// "Lock" object for flushing
|
|
||||||
repeat_it = flusher->sync_to_repeat.find(cur_oid);
|
|
||||||
if (repeat_it != flusher->sync_to_repeat.end())
|
|
||||||
{
|
|
||||||
#ifdef BLOCKSTORE_DEBUG
|
|
||||||
printf("Postpone %jx:%jx v%ju\n", cur_oid.inode, cur_oid.stripe, cur_version);
|
|
||||||
#endif
|
|
||||||
// We don't flush different parts of history of the same object in parallel
|
|
||||||
// So we check if someone is already flushing this object
|
|
||||||
// In that case we set sync_to_repeat and pick another object
|
|
||||||
// Another coroutine will see it and re-queue the object after it finishes
|
|
||||||
if (repeat_it->second < cur_version)
|
|
||||||
repeat_it->second = cur_version;
|
|
||||||
bs->heap->unlock_entry(cur_oid, cur_lsn);
|
|
||||||
goto resume_0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
flusher->sync_to_repeat[cur_oid] = 0;
|
|
||||||
#ifdef BLOCKSTORE_DEBUG
|
#ifdef BLOCKSTORE_DEBUG
|
||||||
printf("Flushing %jx:%jx v%ju .. v%ju\n", cur_oid.inode, cur_oid.stripe, end_wr->version, begin_wr->version);
|
printf("Flushing %jx:%jx v%ju .. v%ju\n", cur_oid.inode, cur_oid.stripe, end_wr->version, begin_wr->version);
|
||||||
#endif
|
#endif
|
||||||
@@ -304,11 +298,8 @@ resume_17:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
release_oid:
|
release_oid:
|
||||||
repeat_it = flusher->sync_to_repeat.find(cur_oid);
|
|
||||||
do_repeat = (repeat_it != flusher->sync_to_repeat.end() && repeat_it->second > cur_version);
|
|
||||||
flusher->sync_to_repeat.erase(repeat_it);
|
|
||||||
flusher->active_flushers--;
|
flusher->active_flushers--;
|
||||||
if (do_repeat)
|
if (should_repeat)
|
||||||
{
|
{
|
||||||
// Flush the same object again
|
// Flush the same object again
|
||||||
goto resume_1;
|
goto resume_1;
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ class journal_flusher_co
|
|||||||
{
|
{
|
||||||
blockstore_impl_t *bs;
|
blockstore_impl_t *bs;
|
||||||
journal_flusher_t *flusher;
|
journal_flusher_t *flusher;
|
||||||
|
int co_id;
|
||||||
int wait_state, wait_count;
|
int wait_state, wait_count;
|
||||||
struct io_uring_sqe *sqe;
|
struct io_uring_sqe *sqe;
|
||||||
struct ring_data_t *data;
|
struct ring_data_t *data;
|
||||||
@@ -55,6 +56,7 @@ class journal_flusher_co
|
|||||||
heap_object_t *cur_obj;
|
heap_object_t *cur_obj;
|
||||||
heap_write_t *begin_wr, *end_wr;
|
heap_write_t *begin_wr, *end_wr;
|
||||||
uint32_t modified_block;
|
uint32_t modified_block;
|
||||||
|
bool should_repeat;
|
||||||
|
|
||||||
std::vector<copy_buffer_t> read_vec;
|
std::vector<copy_buffer_t> read_vec;
|
||||||
uint32_t overwrite_start, overwrite_end;
|
uint32_t overwrite_start, overwrite_end;
|
||||||
@@ -100,7 +102,6 @@ class journal_flusher_t
|
|||||||
int active_flushers = 0;
|
int active_flushers = 0;
|
||||||
int syncing_flushers = 0;
|
int syncing_flushers = 0;
|
||||||
std::list<flusher_sync_t> syncs;
|
std::list<flusher_sync_t> syncs;
|
||||||
std::map<object_id, uint64_t> sync_to_repeat;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
journal_flusher_t(blockstore_impl_t *bs);
|
journal_flusher_t(blockstore_impl_t *bs);
|
||||||
|
|||||||
Reference in New Issue
Block a user