From: Casey Bodley Date: Sun, 19 Feb 2023 15:47:22 +0000 (-0500) Subject: rgw: add free function rgw_read_torrent_file() for GetObj X-Git-Tag: v19.0.0~1568^2~4 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=adbf1ea580b8d83a30abf741b255845b85347ec8;p=ceph.git rgw: add free function rgw_read_torrent_file() for GetObj Signed-off-by: Casey Bodley --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 605f50f2436c3..50a42fc4c7f1d 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -2208,18 +2208,16 @@ void RGWGetObj::execute(optional_yield y) op_ret = -EINVAL; goto done_err; } - torrent.init(s, driver); - rgw_obj obj = s->object->get_obj(); - op_ret = torrent.get_torrent_file(s->object.get(), total_len, bl, obj); - if (op_ret < 0) - { + // read torrent info from attr + bufferlist torrentbl; + op_ret = rgw_read_torrent_file(this, s->object.get(), torrentbl, y); + if (op_ret < 0) { ldpp_dout(this, 0) << "ERROR: failed to get_torrent_file ret= " << op_ret << dendl; goto done_err; } - op_ret = send_response_data(bl, 0, total_len); - if (op_ret < 0) - { + op_ret = send_response_data(torrentbl, 0, torrentbl.length()); + if (op_ret < 0) { ldpp_dout(this, 0) << "ERROR: failed to send_response_data ret= " << op_ret << dendl; goto done_err; } diff --git a/src/rgw/rgw_torrent.cc b/src/rgw/rgw_torrent.cc index 96b56d980ddfc..812b8cdfa5356 100644 --- a/src/rgw/rgw_torrent.cc +++ b/src/rgw/rgw_torrent.cc @@ -6,6 +6,7 @@ #include +#include "common/split.h" #include "rgw_torrent.h" #include "rgw_sal.h" #include "rgw_sal_rados.h" @@ -43,6 +44,57 @@ void seed::init(req_state *_req, rgw::sal::Driver* _driver) driver = _driver; } +int rgw_read_torrent_file(const DoutPrefixProvider* dpp, + rgw::sal::Object* object, + ceph::bufferlist &bl, + optional_yield y) +{ + bufferlist infobl; + int r = object->get_torrent_info(dpp, y, infobl); + if (r < 0) { + ldpp_dout(dpp, 0) << "ERROR: read_torrent_info failed: " << r << dendl; + return r; + } + + // add other fields from config + auto& conf = dpp->get_cct()->_conf; + + TorrentBencode benc; + benc.bencode_dict(bl); + + auto trackers = ceph::split(conf->rgw_torrent_tracker, ","); + if (auto i = trackers.begin(); i != trackers.end()) { + benc.bencode_key(ANNOUNCE, bl); + benc.bencode_key(*i, bl); + + benc.bencode_key(ANNOUNCE_LIST, bl); + benc.bencode_list(bl); + for (; i != trackers.end(); ++i) { + benc.bencode_list(bl); + benc.bencode_key(*i, bl); + benc.bencode_end(bl); + } + benc.bencode_end(bl); + } + + std::string_view comment = conf->rgw_torrent_comment; + if (!comment.empty()) { + benc.bencode(COMMENT, comment, bl); + } + std::string_view create_by = conf->rgw_torrent_createby; + if (!create_by.empty()) { + benc.bencode(CREATED_BY, create_by, bl); + } + std::string_view encoding = conf->rgw_torrent_encoding; + if (!encoding.empty()) { + benc.bencode(ENCODING, encoding, bl); + } + + // append the info stored in the object + bl.append(std::move(infobl)); + return 0; +} + int seed::get_torrent_file(rgw::sal::Object* object, uint64_t &total_len, ceph::bufferlist &bl_data, diff --git a/src/rgw/rgw_torrent.h b/src/rgw/rgw_torrent.h index 08d7cc2bcbea0..e863aede2202e 100644 --- a/src/rgw/rgw_torrent.h +++ b/src/rgw/rgw_torrent.h @@ -133,6 +133,11 @@ private: int save_torrent_file(optional_yield y); }; +int rgw_read_torrent_file(const DoutPrefixProvider* dpp, + rgw::sal::Object* object, + ceph::bufferlist &bl, + optional_yield y); + class RGWPutObj_Torrent : public rgw::putobj::Pipe { size_t max_len = 0; size_t piece_len = 0;