結果圖如下:
./rados -p default.rgw.buckets.data listomapkeysca1f567f-841f-415f-bb5d-5fd1cfe9e757.14107.1_1.mp4
ca1f567f-841f-415f-bb5d-5fd1cfe9e757.14107.1_1.mp4 相當於是字典,這個是存入的object的head object.
default.rgw.torrent 是字典中的單詞
torrent data 是字典內容
查看torrent數據文件命令:
./rados -p default.rgw.buckets.data listomapvals ca1f567f-841f-415f-bb5d-5fd1cfe9e757.14107.1_1.mp4
在put object時保存torrent data到omap中的代碼實現:
代碼是在put object中實現的
if (ofs == torrent.get_data_len())
{
rgw_obj obj(s->bucket, s->object.name);
bufferlist bl_torrent;
uint64_t total_len = 0;
torrent.init(s, store);
op_ret = torrent.handle_data(bl_torrent, total_len, obj);--------------------調用了下面的函數
if (0 != op_ret)
{
INFO "handle_data fail op_ret= "<<op_ret<<dendl;
goto done;
}
INFO "produce torrent file success total_len= "<< total_len << dendl;
}
如何獲取到存在OMAP中的數據呢?調用如下方法,在get object中實現
// start gettorrent
if (torrent.get_flag())
{
torrent.get_torrent_file(op_ret, read_op, total_len, bl, obj);
if (op_ret < 0)
{
ldout(s->cct, 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)
{
ldout(s->cct, 0) << "ERROR: failed to send_response_data ret= " << op_ret
<< dendl;
goto done_err;
}
return;
}
// end gettorrent
void seed::get_torrent_file(int &op_ret, RGWRados::Object::Read &read_op, uint64_t &total_len,
bufferlist &bl_data, rgw_obj &obj)
{
string oid, key;
rgw_bucket bucket;
map<string, bufferlist> m;
set<string> obj_key;
get_obj_bucket_and_oid_loc(obj, bucket, oid, key);----------------獲取oid也就是之前的 ca1f567f-841f-415f-bb5d-5fd1cfe9e757.14107.1_1.mp4
INFO "oid = " << oid << dendl;
obj_key.insert(RGW_OBJ_TORRENT);
op_ret = read_op.state.io_ctx.omap_get_vals_by_keys(oid, obj_key, &m);
if (op_ret < 0)
{
INFO "failed to omap_get_all ret=" << op_ret << dendl;
return;
}
map<string, bufferlist>::iterator iter;
for (iter = m.begin(); iter != m.end(); ++iter)
{
bufferlist bl_tmp = iter->second;
char *pbuff = bl_tmp.c_str();
bl.append(pbuff, bl_tmp.length());
}
bl_data = bl;
total_len = bl.length();
return;
}