diff options
author | Greg Farnum <gregory.farnum@dreamhost.com> | 2011-10-11 15:50:33 -0700 |
---|---|---|
committer | Greg Farnum <gregory.farnum@dreamhost.com> | 2011-10-13 09:33:11 -0700 |
commit | 15a3df84dd45f657adbdfc6f2c1eda7b75eca514 (patch) | |
tree | 3c7a5ceb45c8dd37287d96972cf52fbcf13935be /src/cls_rgw.cc | |
parent | 583e16d9591391c834cd17154571926bffc05abc (diff) | |
download | ceph-15a3df84dd45f657adbdfc6f2c1eda7b75eca514.tar.gz |
cls_rgw: refactor read_bucket_dir in terms of tmap.
This function won't be called often once refactoring is done, but
its functionality will be needed for listing, if nothing else.
Signed-off-by: Greg Farnum <gregory.farnum@dreamhost.com>
Diffstat (limited to 'src/cls_rgw.cc')
-rw-r--r-- | src/cls_rgw.cc | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/cls_rgw.cc b/src/cls_rgw.cc index 5a299ef8ad5..72c875ab966 100644 --- a/src/cls_rgw.cc +++ b/src/cls_rgw.cc @@ -38,13 +38,27 @@ static int read_bucket_dir(cls_method_context_t hctx, struct rgw_bucket_dir& dir if (rc < 0) return rc; - rc = cls_cxx_read(hctx, 0, size, &bl); + rc = cls_cxx_map_read_full(hctx, &bl); if (rc < 0) return rc; try { bufferlist::iterator iter = bl.begin(); - ::decode(dir, iter); + bufferlist header_bl; + ::decode(header_bl, iter); + bufferlist::iterator header_iter = header_bl.begin(); + ::decode(dir.header, header_iter); + __u32 nkeys = 0; + ::decode(nkeys, iter); + while (nkeys) { + string key; + bufferlist value; + ::decode(key, iter); + ::decode(value, iter); + bufferlist::iterator val_iter = value.begin(); + ::decode(dir.m[key], val_iter); + --nkeys; + } } catch (buffer::error& err) { CLS_LOG("ERROR: read_bucket_dir(): failed to decode buffer\n"); return -EIO; |