Fix sync confirmations and some pipeline-stall bugs
This commit is contained in:
+24
-19
@@ -140,6 +140,7 @@ void blockstore::handle_sync_event(ring_data_t *data, blockstore_operation *op)
|
||||
if (op->sync_state == SYNC_DATA_SYNC_SENT)
|
||||
{
|
||||
op->sync_state = SYNC_DATA_SYNC_DONE;
|
||||
// FIXME: This is not needed, in fact
|
||||
for (auto it = op->sync_big_writes.begin(); it != op->sync_big_writes.end(); it++)
|
||||
{
|
||||
dirty_db[*it].state = ST_D_SYNCED;
|
||||
@@ -148,18 +149,6 @@ void blockstore::handle_sync_event(ring_data_t *data, blockstore_operation *op)
|
||||
else if (op->sync_state == SYNC_JOURNAL_SYNC_SENT)
|
||||
{
|
||||
op->sync_state = SYNC_DONE;
|
||||
for (auto it = op->sync_big_writes.begin(); it != op->sync_big_writes.end(); it++)
|
||||
{
|
||||
auto & unstab = unstable_writes[it->oid];
|
||||
unstab = !unstab || unstab > it->version ? it->version : unstab;
|
||||
dirty_db[*it].state = ST_D_META_SYNCED;
|
||||
}
|
||||
for (auto it = op->sync_small_writes.begin(); it != op->sync_small_writes.end(); it++)
|
||||
{
|
||||
auto & unstab = unstable_writes[it->oid];
|
||||
unstab = !unstab || unstab > it->version ? it->version : unstab;
|
||||
dirty_db[*it].state = ST_J_SYNCED;
|
||||
}
|
||||
ack_sync(op);
|
||||
}
|
||||
else
|
||||
@@ -177,6 +166,8 @@ int blockstore::ack_sync(blockstore_operation *op)
|
||||
auto it = op->in_progress_ptr;
|
||||
int done_syncs = 1;
|
||||
++it;
|
||||
// Acknowledge sync
|
||||
ack_one_sync(op);
|
||||
while (it != in_progress_syncs.end())
|
||||
{
|
||||
auto & next_sync = *it++;
|
||||
@@ -185,16 +176,30 @@ int blockstore::ack_sync(blockstore_operation *op)
|
||||
{
|
||||
done_syncs++;
|
||||
// Acknowledge next_sync
|
||||
in_progress_syncs.erase(next_sync->in_progress_ptr);
|
||||
next_sync->retval = 0;
|
||||
next_sync->callback(next_sync);
|
||||
ack_one_sync(next_sync);
|
||||
}
|
||||
}
|
||||
// Acknowledge sync
|
||||
in_progress_syncs.erase(op->in_progress_ptr);
|
||||
op->retval = 0;
|
||||
op->callback(op);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void blockstore::ack_one_sync(blockstore_operation *op)
|
||||
{
|
||||
// Handle states
|
||||
for (auto it = op->sync_big_writes.begin(); it != op->sync_big_writes.end(); it++)
|
||||
{
|
||||
auto & unstab = unstable_writes[it->oid];
|
||||
unstab = unstab < it->version ? it->version : unstab;
|
||||
dirty_db[*it].state = ST_D_META_SYNCED;
|
||||
}
|
||||
for (auto it = op->sync_small_writes.begin(); it != op->sync_small_writes.end(); it++)
|
||||
{
|
||||
auto & unstab = unstable_writes[it->oid];
|
||||
unstab = unstab < it->version ? it->version : unstab;
|
||||
dirty_db[*it].state = ST_J_SYNCED;
|
||||
}
|
||||
in_progress_syncs.erase(op->in_progress_ptr);
|
||||
op->retval = 0;
|
||||
op->callback(op);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user