mirror of
https://github.com/ceph/ceph
synced 2025-03-22 10:17:23 +00:00
osdc/ObjectCacher: limit writeback IOs generated while holding lock
While analyzing a log from Mike Dawson I saw a long stall while librbd's objectcacher was starting lots (many hundreds) of IOs. Limit the amount of time we spend doing this at a time to allow IO replies to be processed so that the cache remains responsive. I'm not sure this warrants a tunable (which we would need to add for both libcephfs and librbd). Signed-off-by: Sage Weil <sage@inktank.com>
This commit is contained in:
parent
055e31359a
commit
cce990efc8
@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
#include "include/assert.h"
|
#include "include/assert.h"
|
||||||
|
|
||||||
|
#define MAX_FLUSH_UNDER_LOCK 20 ///< max bh's we start writeback on while holding the lock
|
||||||
|
|
||||||
/*** ObjectCacher::BufferHead ***/
|
/*** ObjectCacher::BufferHead ***/
|
||||||
|
|
||||||
|
|
||||||
@ -1448,8 +1450,10 @@ void ObjectCacher::flusher_entry()
|
|||||||
utime_t cutoff = ceph_clock_now(cct);
|
utime_t cutoff = ceph_clock_now(cct);
|
||||||
cutoff -= max_dirty_age;
|
cutoff -= max_dirty_age;
|
||||||
BufferHead *bh = 0;
|
BufferHead *bh = 0;
|
||||||
|
int max = MAX_FLUSH_UNDER_LOCK;
|
||||||
while ((bh = static_cast<BufferHead*>(bh_lru_dirty.lru_get_next_expire())) != 0 &&
|
while ((bh = static_cast<BufferHead*>(bh_lru_dirty.lru_get_next_expire())) != 0 &&
|
||||||
bh->last_write < cutoff) {
|
bh->last_write < cutoff &&
|
||||||
|
--max > 0) {
|
||||||
ldout(cct, 10) << "flusher flushing aged dirty bh " << *bh << dendl;
|
ldout(cct, 10) << "flusher flushing aged dirty bh " << *bh << dendl;
|
||||||
bh_write(bh);
|
bh_write(bh);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user