From 9b9a3c093f56c9e3a118739f4cc39864a9509705 Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Tue, 1 Feb 2011 18:50:11 -0800 Subject: [PATCH] librbd: store snapshot names in image context and use them when listing snaps --- src/librbd.cc | 48 +++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/src/librbd.cc b/src/librbd.cc index 2c61336e2dbb7..b601d8130fd69 100644 --- a/src/librbd.cc +++ b/src/librbd.cc @@ -50,29 +50,38 @@ namespace librbd { pool_t data; }; + struct SnapInfo { + librados::snap_t id; + uint64_t size; + SnapInfo(librados::snap_t _id, uint64_t _size) : id(_id), size(_size) {}; + }; + struct ImageCtx { struct rbd_obj_header_ondisk header; ::SnapContext snapc; vector snaps; - std::map snaps_by_name; + std::map snaps_by_name; uint64_t snapid; std::string name; struct PoolCtx *pctx; int set_snap(std::string snap_name) { - std::map::iterator it = snaps_by_name.find(snap_name); + std::map::iterator it = snaps_by_name.find(snap_name); if (it != snaps_by_name.end()) { - snapid = it->second; + snapid = it->second.id; return 0; } snapid = 0; return -ENOENT; } - void add_snap(std::string snap_name, librados::snap_t id) + void add_snap(std::string snap_name, librados::snap_t id, uint64_t size) { - snaps_by_name.insert(std::pair(snap_name, id)); + snapc.snaps.push_back(id); + snaps.push_back(id); + struct SnapInfo info(id, size); + snaps_by_name.insert(std::pair(snap_name, info)); } }; @@ -588,28 +597,15 @@ int librbd::RBDClient::list_snaps(PoolCtx *pp, ImageCtx *ictx, std::vectorname; md_oid += RBD_SUFFIX; - int r = rados.exec(pp->md, md_oid, "rbd", "snap_list", bl, bl2); - if (r < 0) { - return r; - } - - uint32_t num_snaps; - uint64_t snap_seq; - bufferlist::iterator iter = bl2.begin(); - ::decode(snap_seq, iter); - ::decode(num_snaps, iter); - for (uint32_t i=0; i < num_snaps; i++) { - uint64_t id, image_size; - string s; + for (std::map::iterator it = ictx->snaps_by_name.begin(); + it != ictx->snaps_by_name.end(); ++it) { librbd::snap_info_t info; - ::decode(id, iter); - ::decode(image_size, iter); - ::decode(s, iter); - info.name = s; - info.id = id; - info.size = image_size; + info.name = it->first; + info.id = it->second.id; + info.size = it->second.size; snaps.push_back(info); } + return 0; } @@ -680,9 +676,7 @@ int librbd::RBDClient::get_snapc(PoolCtx *pp, string& md_oid, const char *snap_n ::decode(id, iter); ::decode(image_size, iter); ::decode(s, iter); - ictx->snapc.snaps.push_back(id); - ictx->snaps.push_back(id); - ictx->add_snap(s, id); + ictx->add_snap(s, id, image_size); } if (!ictx->snapc.is_valid()) { -- 2.39.5