Skip to content

Commit 9c1bf9b

Browse files
authored
Merge pull request ceph#60771 from YaZasnyal/fix/complete-abort-mp
rgw/abortmp: Race condition on AbortMultipartUpload Reviewed-by: Casey Bodley <[email protected]>
2 parents e84c7fc + 36541ef commit 9c1bf9b

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

src/rgw/rgw_op.cc

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7042,17 +7042,30 @@ void RGWAbortMultipart::execute(optional_yield y)
70427042
return;
70437043

70447044
upload = s->bucket->get_multipart_upload(s->object->get_name(), upload_id);
7045+
meta_obj = upload->get_meta_obj();
7046+
meta_obj->set_in_extra_data(true);
7047+
meta_obj->get_obj_attrs(s->yield, this);
7048+
70457049
jspan_context trace_ctx(false, false);
70467050
if (tracing::rgw::tracer.is_enabled()) {
70477051
// read meta object attributes for trace info
7048-
meta_obj = upload->get_meta_obj();
7049-
meta_obj->set_in_extra_data(true);
7050-
meta_obj->get_obj_attrs(s->yield, this);
70517052
extract_span_context(meta_obj->get_attrs(), trace_ctx);
70527053
}
70537054
multipart_trace = tracing::rgw::tracer.add_span(name(), trace_ctx);
70547055

7056+
int max_lock_secs_mp =
7057+
s->cct->_conf.get_val<int64_t>("rgw_mp_lock_max_time");
7058+
utime_t dur(max_lock_secs_mp, 0);
7059+
auto serializer = meta_obj->get_serializer(this, "RGWCompleteMultipart");
7060+
op_ret = serializer->try_lock(this, dur, y);
7061+
if (op_ret < 0) {
7062+
if (op_ret == -ENOENT) {
7063+
op_ret = -ERR_NO_SUCH_UPLOAD;
7064+
}
7065+
return;
7066+
}
70557067
op_ret = upload->abort(this, s->cct, y);
7068+
serializer->unlock();
70567069
}
70577070

70587071
int RGWListMultipart::verify_permission(optional_yield y)

0 commit comments

Comments
 (0)