Bug #17859

Updated by Sage Weil over 3 years ago

In list_by_hash_{bitwise,nibblewise} there is a condition
if (cmp_bitwise(j->second, end) >= 0) {
if (next)
*next = ghobject_t::get_max();
return 0;
if we set next to max, the caller doesn't break out of the loop and will continue on to iterate over *every* subsequent subdir in the collection. this can either be very slow *or* can make the osd suicide.

This was added during a refactor in 921c4586f165ce39c17ef8b579c548dc8f6f4500. I'm pretty sure it should just set *next = j->second instead.

Partial workaround (at least for scrub) is to set osd_scrub_chunk_max to a different value (than 25). Although that will likely just hit *other* subdirs with exactly that number of objects...

big big thanks to mistur on irc for helping narrow this down.