在omap上存儲和獲取文件

結果圖如下:

./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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章