Fix PG object count statistics on deletion of non-existing objects
This commit is contained in:
+47
-43
@@ -722,54 +722,58 @@ resume_3:
|
|||||||
cur_op->reply.rw.version = op_data->fact_ver;
|
cur_op->reply.rw.version = op_data->fact_ver;
|
||||||
goto continue_others;
|
goto continue_others;
|
||||||
}
|
}
|
||||||
// Save version override for parallel reads
|
// If not already deleted:
|
||||||
pg.ver_override[op_data->oid] = op_data->fact_ver;
|
if (op_data->fact_ver)
|
||||||
// Submit deletes
|
{
|
||||||
op_data->fact_ver++;
|
// Save version override for parallel reads
|
||||||
submit_primary_del_subops(cur_op, NULL, 0, op_data->object_state ? op_data->object_state->osd_set : pg.cur_loc_set);
|
pg.ver_override[op_data->oid] = op_data->fact_ver;
|
||||||
|
// Submit deletes
|
||||||
|
op_data->fact_ver++;
|
||||||
|
submit_primary_del_subops(cur_op, NULL, 0, op_data->object_state ? op_data->object_state->osd_set : pg.cur_loc_set);
|
||||||
resume_4:
|
resume_4:
|
||||||
op_data->st = 4;
|
op_data->st = 4;
|
||||||
return;
|
|
||||||
resume_5:
|
|
||||||
if (op_data->errors > 0)
|
|
||||||
{
|
|
||||||
deref_object_state(pg, &op_data->object_state, true);
|
|
||||||
pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->errcode);
|
|
||||||
return;
|
return;
|
||||||
}
|
resume_5:
|
||||||
// Remove version override
|
if (op_data->errors > 0)
|
||||||
pg.ver_override.erase(op_data->oid);
|
|
||||||
// Adjust PG stats after "instant stabilize", because we need object_state above
|
|
||||||
if (!op_data->object_state)
|
|
||||||
{
|
|
||||||
pg.clean_count--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
remove_object_from_state(op_data->oid, &op_data->object_state, pg);
|
|
||||||
deref_object_state(pg, &op_data->object_state, true);
|
|
||||||
}
|
|
||||||
// Mark PG and OSDs as dirty
|
|
||||||
for (auto & chunk: (op_data->object_state ? op_data->object_state->osd_set : pg.cur_loc_set))
|
|
||||||
{
|
|
||||||
this->dirty_osds.insert(chunk.osd_num);
|
|
||||||
}
|
|
||||||
for (auto cl_it = msgr.clients.find(cur_op->peer_fd); cl_it != msgr.clients.end(); )
|
|
||||||
{
|
|
||||||
cl_it->second->dirty_pgs.insert({ .pool_id = pg.pool_id, .pg_num = pg.pg_num });
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
dirty_pgs.insert({ .pool_id = pg.pool_id, .pg_num = pg.pg_num });
|
|
||||||
if (immediate_commit == IMMEDIATE_NONE)
|
|
||||||
{
|
|
||||||
unstable_write_count++;
|
|
||||||
if (unstable_write_count >= autosync_writes)
|
|
||||||
{
|
{
|
||||||
unstable_write_count = 0;
|
deref_object_state(pg, &op_data->object_state, true);
|
||||||
autosync();
|
pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->errcode);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
// Remove version override
|
||||||
|
pg.ver_override.erase(op_data->oid);
|
||||||
|
// Adjust PG stats after "instant stabilize", because we need object_state above
|
||||||
|
if (!op_data->object_state)
|
||||||
|
{
|
||||||
|
pg.clean_count--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
remove_object_from_state(op_data->oid, &op_data->object_state, pg);
|
||||||
|
deref_object_state(pg, &op_data->object_state, true);
|
||||||
|
}
|
||||||
|
// Mark PG and OSDs as dirty
|
||||||
|
for (auto & chunk: (op_data->object_state ? op_data->object_state->osd_set : pg.cur_loc_set))
|
||||||
|
{
|
||||||
|
this->dirty_osds.insert(chunk.osd_num);
|
||||||
|
}
|
||||||
|
for (auto cl_it = msgr.clients.find(cur_op->peer_fd); cl_it != msgr.clients.end(); )
|
||||||
|
{
|
||||||
|
cl_it->second->dirty_pgs.insert({ .pool_id = pg.pool_id, .pg_num = pg.pg_num });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dirty_pgs.insert({ .pool_id = pg.pool_id, .pg_num = pg.pg_num });
|
||||||
|
if (immediate_commit == IMMEDIATE_NONE)
|
||||||
|
{
|
||||||
|
unstable_write_count++;
|
||||||
|
if (unstable_write_count >= autosync_writes)
|
||||||
|
{
|
||||||
|
unstable_write_count = 0;
|
||||||
|
autosync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pg.total_count--;
|
||||||
}
|
}
|
||||||
pg.total_count--;
|
|
||||||
cur_op->reply.hdr.retval = 0;
|
cur_op->reply.hdr.retval = 0;
|
||||||
// indicate possibly unfinished (left_on_dead) deletions
|
// indicate possibly unfinished (left_on_dead) deletions
|
||||||
cur_op->reply.del.flags = OSD_DEL_SUPPORT_LEFT_ON_DEAD;
|
cur_op->reply.del.flags = OSD_DEL_SUPPORT_LEFT_ON_DEAD;
|
||||||
|
|||||||
Reference in New Issue
Block a user