diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 907237056b9..d496d100150 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -2420,18 +2420,33 @@ int RGWPutObjProcessor_Atomic::complete_writing_data() } obj_len = (uint64_t)first_chunk.length(); } - if (pending_data_bl.length()) { + while (pending_data_bl.length()) { void *handle; - int r = write_data(pending_data_bl, data_ofs, &handle, false); + uint64_t max_write_size = MIN(max_chunk_size, (uint64_t)next_part_ofs - data_ofs); + if (max_write_size > pending_data_bl.length()) { + max_write_size = pending_data_bl.length(); + } + bufferlist bl; + pending_data_bl.splice(0, max_write_size, &bl); + int r = write_data(bl, data_ofs, &handle, false); if (r < 0) { ldout(store->ctx(), 0) << "ERROR: write_data() returned " << r << dendl; return r; } + data_ofs += bl.length(); r = throttle_data(handle, false); if (r < 0) { ldout(store->ctx(), 0) << "ERROR: throttle_data() returned " << r << dendl; return r; } + + if (data_ofs >= next_part_ofs) { + r = prepare_next_part(data_ofs); + if (r < 0) { + ldout(store->ctx(), 0) << "ERROR: prepare_next_part() returned " << r << dendl; + return r; + } + } } int r = complete_parts(); if (r < 0) { @@ -3027,6 +3042,9 @@ int RGWRados::get_required_alignment(rgw_bucket& bucket, uint64_t *alignment) << r << dendl; return r; } + if (align != 0) { + ldout(cct, 20) << "required alignment=" << align << dendl; + } *alignment = align; return 0; } @@ -3053,6 +3071,8 @@ int RGWRados::get_max_chunk_size(rgw_bucket& bucket, uint64_t *max_chunk_size) *max_chunk_size = config_chunk_size - (config_chunk_size % alignment); + ldout(cct, 20) << "max_chunk_size=" << *max_chunk_size << dendl; + return 0; }