op_submit(o);
}
-void Objecter::_list_reply(ListContext *list_context, bufferlist *bl, Context *final_finish, epoch_t reply_epoch)
+void Objecter::_list_reply(ListContext *list_context, int r, bufferlist *bl,
+ Context *final_finish, epoch_t reply_epoch)
{
ldout(cct, 10) << "_list_reply" << dendl;
if (response_size) {
ldout(cct, 20) << "got a response with objects, proceeding" << dendl;
list_context->list.merge(response.entries);
- list_context->max_entries -= response_size;
- ldout(cct, 20) << "cleaning up and exiting" << dendl;
- if (!list_context->max_entries) {
+ if (response_size >= list_context->max_entries) {
final_finish->finish(0);
delete bl;
delete final_finish;
return;
}
+
+ // ask for fewer objects next time around
+ list_context->max_entries -= response_size;
+
+ // if the osd returns 1 (newer code), or no entries, it means we
+ // 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;
+ }
}
// if we make this this far, there are no objects left in the current pg, but we want more!
list_context(lc), final_finish(finish), bl(b), objecter(ob), epoch(0) {}
void finish(int r) {
if (r >= 0) {
- objecter->_list_reply(list_context, bl, final_finish, epoch);
+ objecter->_list_reply(list_context, r, bl, final_finish, epoch);
} else {
final_finish->finish(r);
delete final_finish;
void reopen_session(OSDSession *session);
void close_session(OSDSession *session);
- void _list_reply(ListContext *list_context, bufferlist *bl, Context *final_finish,
+ void _list_reply(ListContext *list_context, int r, bufferlist *bl, Context *final_finish,
epoch_t reply_epoch);
void resend_mon_ops();