Skip to content

Commit

Permalink
rgw: eradicate dynamic memory allocation in RGWPostObj.
Browse files Browse the repository at this point in the history
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
  • Loading branch information
rzarzynski committed Sep 12, 2016
1 parent 30bbe65 commit 88765d8
Showing 1 changed file with 27 additions and 37 deletions.
64 changes: 27 additions & 37 deletions src/rgw/rgw_op.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2894,30 +2894,13 @@ int RGWPostObj::verify_permission()
return 0;
}

RGWPutObjProcessor *RGWPostObj::select_processor(RGWObjectCtx& obj_ctx)
{
RGWPutObjProcessor *processor;

uint64_t part_size = s->cct->_conf->rgw_obj_stripe_size;

processor = new RGWPutObjProcessor_Atomic(obj_ctx, s->bucket_info, s->bucket, s->object.name, part_size, s->req_id, s->bucket_info.versioning_enabled());

return processor;
}

void RGWPostObj::dispose_processor(RGWPutObjProcessor *processor)
{
delete processor;
}

void RGWPostObj::pre_exec()
{
rgw_bucket_object_pre_exec(s);
}

void RGWPostObj::execute()
{
RGWPutObjProcessor *processor = NULL;
char calc_md5[CEPH_CRYPTO_MD5_DIGESTSIZE * 2 + 1];
unsigned char m[CEPH_CRYPTO_MD5_DIGESTSIZE];
MD5 hash;
Expand All @@ -2926,66 +2909,76 @@ void RGWPostObj::execute()

// read in the data from the POST form
op_ret = get_params();
if (op_ret < 0)
goto done;
if (op_ret < 0) {
return;
}

op_ret = verify_params();
if (op_ret < 0)
goto done;
if (op_ret < 0) {
return;
}

if (!verify_bucket_permission(s, RGW_PERM_WRITE)) {
op_ret = -EACCES;
goto done;
return;
}

op_ret = store->check_quota(s->bucket_owner.get_id(), s->bucket,
user_quota, bucket_quota, s->content_length);
if (op_ret < 0) {
goto done;
return;
}

processor = select_processor(*static_cast<RGWObjectCtx *>(s->obj_ctx));
RGWPutObjProcessor_Atomic processor(*static_cast<RGWObjectCtx *>(s->obj_ctx),
s->bucket_info,
s->bucket,
s->object.name,
/* part size */
s->cct->_conf->rgw_obj_stripe_size,
s->req_id,
s->bucket_info.versioning_enabled());

op_ret = processor->prepare(store, NULL);
if (op_ret < 0)
goto done;
op_ret = processor.prepare(store, nullptr);
if (op_ret < 0) {
return;
}

while (data_pending) {
bufferlist data;
len = get_data(data);

if (len < 0) {
op_ret = len;
goto done;
return;
}

if (!len)
break;

op_ret = put_data_and_throttle(processor, data, ofs, &hash, false);
op_ret = put_data_and_throttle(&processor, data, ofs, &hash, false);

ofs += len;

if (ofs > max_len) {
op_ret = -ERR_TOO_LARGE;
goto done;
return;
}
}

if (len < min_len) {
op_ret = -ERR_TOO_SMALL;
goto done;
return;
}

s->obj_size = ofs;

op_ret = store->check_quota(s->bucket_owner.get_id(), s->bucket,
user_quota, bucket_quota, s->obj_size);
if (op_ret < 0) {
goto done;
return;
}

processor->complete_hash(&hash);
processor.complete_hash(&hash);
hash.Final(m);
buf_to_hex(m, CEPH_CRYPTO_MD5_DIGESTSIZE, calc_md5);

Expand All @@ -3002,10 +2995,7 @@ void RGWPostObj::execute()
emplace_attr(RGW_ATTR_CONTENT_TYPE, std::move(ct_bl));
}

op_ret = processor->complete(etag, NULL, real_time(), attrs, delete_at);

done:
dispose_processor(processor);
op_ret = processor.complete(etag, NULL, real_time(), attrs, delete_at);
}


Expand Down

0 comments on commit 88765d8

Please sign in to comment.