summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-10-10 08:51:23 -0700
committerSage Weil <sage@inktank.com>2013-10-10 10:40:10 -0700
commitaf08daafb435fdb20dc341c54dfbc1827a60b228 (patch)
treefdec4f6e7c369a2d4d61580aafeecd73e3ed81b5
parent098dfc618dbdcfcf79e8104d02c901e2f9718d15 (diff)
downloadceph-af08daafb435fdb20dc341c54dfbc1827a60b228.tar.gz
osdc/Objecter: stick bl inside ListContext
This is simpler and less error-prone. Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/osdc/Objecter.cc16
-rw-r--r--src/osdc/Objecter.h11
2 files changed, 11 insertions, 16 deletions
diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc
index 2ab412b913a..4da8fbaf4b2 100644
--- a/src/osdc/Objecter.cc
+++ b/src/osdc/Objecter.cc
@@ -1753,21 +1753,19 @@ void Objecter::list_objects(ListContext *list_context, Context *onfinish) {
ObjectOperation op;
op.pg_ls(list_context->max_entries, list_context->filter, list_context->cookie,
list_context->current_pg_epoch);
-
- bufferlist *bl = new bufferlist();
- C_List *onack = new C_List(list_context, onfinish, bl, this);
-
+ list_context->bl.clear();
+ C_List *onack = new C_List(list_context, onfinish, this);
object_locator_t oloc(list_context->pool_id, list_context->nspace);
pg_read(list_context->current_pg, oloc, op,
- bl, 0, onack, &onack->epoch);
+ &list_context->bl, 0, onack, &onack->epoch);
}
-void Objecter::_list_reply(ListContext *list_context, int r, bufferlist *bl,
+void Objecter::_list_reply(ListContext *list_context, int r,
Context *final_finish, epoch_t reply_epoch)
{
ldout(cct, 10) << "_list_reply" << dendl;
- bufferlist::iterator iter = bl->begin();
+ bufferlist::iterator iter = list_context->bl.begin();
pg_ls_response_t response;
bufferlist extra_info;
::decode(response, iter);
@@ -1790,7 +1788,6 @@ void Objecter::_list_reply(ListContext *list_context, int r, bufferlist *bl,
list_context->list.merge(response.entries);
if (response_size >= list_context->max_entries) {
final_finish->complete(0);
- delete bl;
return;
}
@@ -1801,7 +1798,6 @@ void Objecter::_list_reply(ListContext *list_context, int r, bufferlist *bl,
// hit the end of the pg.
if (r == 0 && response_size > 0) {
// not yet done with this pg
- delete bl;
list_objects(list_context, final_finish);
return;
}
@@ -1813,7 +1809,6 @@ void Objecter::_list_reply(ListContext *list_context, int r, bufferlist *bl,
ldout(cct, 20) << "emptied current pg, moving on to next one:" << list_context->current_pg << dendl;
if (list_context->current_pg < list_context->starting_pg_num){ // we have more pgs to go through
list_context->cookie = collection_list_handle_t();
- delete bl;
list_objects(list_context, final_finish);
return;
}
@@ -1821,7 +1816,6 @@ void Objecter::_list_reply(ListContext *list_context, int r, bufferlist *bl,
// if we make it this far, there are no more pgs
ldout(cct, 20) << "out of pgs, returning to" << final_finish << dendl;
list_context->at_end = true;
- delete bl;
final_finish->complete(0);
return;
}
diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h
index e91e6dac82d..b42a211b754 100644
--- a/src/osdc/Objecter.h
+++ b/src/osdc/Objecter.h
@@ -1020,6 +1020,8 @@ public:
int pool_snap_seq;
int max_entries;
string nspace;
+
+ bufferlist bl; // raw data read to here
std::list<pair<object_t, string> > list;
bufferlist filter;
@@ -1034,14 +1036,13 @@ public:
struct C_List : public Context {
ListContext *list_context;
Context *final_finish;
- bufferlist *bl;
Objecter *objecter;
epoch_t epoch;
- C_List(ListContext *lc, Context * finish, bufferlist *b, Objecter *ob) :
- list_context(lc), final_finish(finish), bl(b), objecter(ob), epoch(0) {}
+ C_List(ListContext *lc, Context * finish, Objecter *ob) :
+ list_context(lc), final_finish(finish), objecter(ob), epoch(0) {}
void finish(int r) {
if (r >= 0) {
- objecter->_list_reply(list_context, r, bl, final_finish, epoch);
+ objecter->_list_reply(list_context, r, final_finish, epoch);
} else {
final_finish->complete(r);
}
@@ -1262,7 +1263,7 @@ public:
void reopen_session(OSDSession *session);
void close_session(OSDSession *session);
- void _list_reply(ListContext *list_context, int r, bufferlist *bl, Context *final_finish,
+ void _list_reply(ListContext *list_context, int r, Context *final_finish,
epoch_t reply_epoch);
void resend_mon_ops();