Project

General

Profile

Bug #17859

Updated by Sage Weil over 7 years ago

In list_by_hash_{bitwise,nibblewise} there is a condition 
 <pre> 
	 if (cmp_bitwise(j->second, end) >= 0) { 
	   if (next) 
	     *next = ghobject_t::get_max(); 
	   return 0; 
	 } 
 </pre> 
 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. 

Back