Return ENOSPC as the primary OSD

rm-left-on-dead
Vitaliy Filippov 2022-12-30 02:03:22 +03:00
parent 3589ccec22
commit 629200b0cc
6 changed files with 20 additions and 17 deletions

View File

@ -228,7 +228,7 @@ resume_1:
resume_2: resume_2:
if (op_data->errors > 0) if (op_data->errors > 0)
{ {
finish_op(cur_op, op_data->epipe > 0 ? -EPIPE : -EIO); finish_op(cur_op, op_data->errcode);
return; return;
} }
cur_op->reply.rw.version = op_data->fact_ver; cur_op->reply.rw.version = op_data->fact_ver;
@ -350,7 +350,7 @@ resume_2:
resume_3: resume_3:
if (op_data->errors > 0) if (op_data->errors > 0)
{ {
pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->epipe > 0 ? -EPIPE : -EIO); pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->errcode);
return; return;
} }
// Check CAS version // Check CAS version
@ -371,7 +371,7 @@ resume_4:
resume_5: resume_5:
if (op_data->errors > 0) if (op_data->errors > 0)
{ {
pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->epipe > 0 ? -EPIPE : -EIO); pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->errcode);
return; return;
} }
// Remove version override // Remove version override

View File

@ -24,7 +24,7 @@ struct osd_primary_op_data_t
uint64_t target_ver; uint64_t target_ver;
uint64_t orig_ver = 0, fact_ver = 0; uint64_t orig_ver = 0, fact_ver = 0;
uint64_t scheme = 0; uint64_t scheme = 0;
int n_subops = 0, done = 0, errors = 0, epipe = 0; int n_subops = 0, done = 0, errors = 0, errcode = 0;
int degraded = 0, pg_size, pg_data_size; int degraded = 0, pg_size, pg_data_size;
osd_rmw_stripe_t *stripes; osd_rmw_stripe_t *stripes;
osd_op_t *subops = NULL; osd_op_t *subops = NULL;

View File

@ -42,7 +42,7 @@ resume_4:
{ {
free(op_data->chain_reads); free(op_data->chain_reads);
op_data->chain_reads = NULL; op_data->chain_reads = NULL;
finish_op(cur_op, op_data->epipe > 0 ? -EPIPE : -EIO); finish_op(cur_op, op_data->errcode);
return; return;
} }
send_chained_read_results(pg, cur_op); send_chained_read_results(pg, cur_op);

View File

@ -122,7 +122,7 @@ void osd_t::submit_primary_subops(int submit_type, uint64_t op_version, const ui
zero_read = -1; zero_read = -1;
osd_op_t *subops = new osd_op_t[n_subops]; osd_op_t *subops = new osd_op_t[n_subops];
op_data->fact_ver = 0; op_data->fact_ver = 0;
op_data->done = op_data->errors = 0; op_data->done = op_data->errors = op_data->errcode = 0;
op_data->n_subops = n_subops; op_data->n_subops = n_subops;
op_data->subops = subops; op_data->subops = subops;
int sent = submit_primary_subop_batch(submit_type, op_data->oid.inode, op_version, op_data->stripes, osd_set, cur_op, 0, zero_read); int sent = submit_primary_subop_batch(submit_type, op_data->oid.inode, op_version, op_data->stripes, osd_set, cur_op, 0, zero_read);
@ -341,9 +341,11 @@ void osd_t::handle_primary_subop(osd_op_t *subop, osd_op_t *cur_op)
osd_op_names[opcode], subop->peer_fd, retval, expected osd_op_names[opcode], subop->peer_fd, retval, expected
); );
} }
if (retval == -EPIPE) // Error priority: EIO > ENOSPC > EPIPE
if (op_data->errcode == 0 || retval == -EIO ||
retval == -ENOSPC && op_data->errcode == -EPIPE)
{ {
op_data->epipe++; op_data->errcode = retval;
} }
op_data->errors++; op_data->errors++;
if (subop->peer_fd >= 0 && (opcode != OSD_OP_SEC_WRITE && opcode != OSD_OP_SEC_WRITE_STABLE || if (subop->peer_fd >= 0 && (opcode != OSD_OP_SEC_WRITE && opcode != OSD_OP_SEC_WRITE_STABLE ||
@ -413,7 +415,8 @@ void osd_t::cancel_primary_write(osd_op_t *cur_op)
// are sent to peer OSDs, so we can't just throw them away. // are sent to peer OSDs, so we can't just throw them away.
// Mark them with an extra EPIPE. // Mark them with an extra EPIPE.
cur_op->op_data->errors++; cur_op->op_data->errors++;
cur_op->op_data->epipe++; if (cur_op->op_data->errcode == 0)
cur_op->op_data->errcode = -EPIPE;
cur_op->op_data->done--; // Caution: `done` must be signed because may become -1 here cur_op->op_data->done--; // Caution: `done` must be signed because may become -1 here
} }
else else
@ -465,7 +468,7 @@ void osd_t::submit_primary_del_batch(osd_op_t *cur_op, obj_ver_osd_t *chunks_to_
{ {
osd_primary_op_data_t *op_data = cur_op->op_data; osd_primary_op_data_t *op_data = cur_op->op_data;
op_data->n_subops = chunks_to_delete_count; op_data->n_subops = chunks_to_delete_count;
op_data->done = op_data->errors = 0; op_data->done = op_data->errors = op_data->errcode = 0;
if (!op_data->n_subops) if (!op_data->n_subops)
{ {
return; return;
@ -528,7 +531,7 @@ int osd_t::submit_primary_sync_subops(osd_op_t *cur_op)
osd_primary_op_data_t *op_data = cur_op->op_data; osd_primary_op_data_t *op_data = cur_op->op_data;
int n_osds = op_data->dirty_osd_count; int n_osds = op_data->dirty_osd_count;
osd_op_t *subops = new osd_op_t[n_osds]; osd_op_t *subops = new osd_op_t[n_osds];
op_data->done = op_data->errors = 0; op_data->done = op_data->errors = op_data->errcode = 0;
op_data->n_subops = n_osds; op_data->n_subops = n_osds;
op_data->subops = subops; op_data->subops = subops;
std::map<uint64_t, int>::iterator peer_it; std::map<uint64_t, int>::iterator peer_it;
@ -584,7 +587,7 @@ void osd_t::submit_primary_stab_subops(osd_op_t *cur_op)
osd_primary_op_data_t *op_data = cur_op->op_data; osd_primary_op_data_t *op_data = cur_op->op_data;
int n_osds = op_data->unstable_write_osds->size(); int n_osds = op_data->unstable_write_osds->size();
osd_op_t *subops = new osd_op_t[n_osds]; osd_op_t *subops = new osd_op_t[n_osds];
op_data->done = op_data->errors = 0; op_data->done = op_data->errors = op_data->errcode = 0;
op_data->n_subops = n_osds; op_data->n_subops = n_osds;
op_data->subops = subops; op_data->subops = subops;
for (int i = 0; i < n_osds; i++) for (int i = 0; i < n_osds; i++)

View File

@ -240,7 +240,7 @@ resume_8:
} }
if (op_data->errors > 0) if (op_data->errors > 0)
{ {
finish_op(cur_op, op_data->epipe > 0 ? -EPIPE : -EIO); finish_op(cur_op, op_data->errcode);
} }
else else
{ {

View File

@ -93,7 +93,7 @@ resume_2:
resume_3: resume_3:
if (op_data->errors > 0) if (op_data->errors > 0)
{ {
pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->epipe > 0 ? -EPIPE : -EIO); pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->errcode);
return; return;
} }
// Check CAS version // Check CAS version
@ -178,7 +178,7 @@ resume_5:
} }
if (op_data->errors > 0) if (op_data->errors > 0)
{ {
pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->epipe > 0 ? -EPIPE : -EIO); pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->errcode);
return; return;
} }
if (op_data->object_state) if (op_data->object_state)
@ -255,7 +255,7 @@ resume_8:
resume_9: resume_9:
if (op_data->errors > 0) if (op_data->errors > 0)
{ {
pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->epipe > 0 ? -EPIPE : -EIO); pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->errcode);
return; return;
} }
} }
@ -337,7 +337,7 @@ resume_7:
op_data->unstable_write_osds = NULL; op_data->unstable_write_osds = NULL;
if (op_data->errors > 0) if (op_data->errors > 0)
{ {
pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->epipe > 0 ? -EPIPE : -EIO); pg_cancel_write_queue(pg, cur_op, op_data->oid, op_data->errcode);
return false; return false;
} }
} }