]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commit
osd: wake up more shard workers when new osdmap is consumed
authorJianwei Zhang <jianwei1216@qq.com>
Thu, 30 Sep 2021 06:47:01 +0000 (14:47 +0800)
committerKefu Chai <tchaikov@gmail.com>
Tue, 5 Oct 2021 14:16:12 +0000 (22:16 +0800)
commit566b60b3f6528f491da6c2b862142ca55c05646f
tree9d2aca0494900720e2274818c68e6614d27f817e
parente4db160015f502c9488b1c8146e79be0f3c1e537
osd: wake up more shard workers when new osdmap is consumed

Reproduce:
(1) ceph cluster not running any client IO
(2) only ceph osd in osd.14 operation

Reason:
(1) one shard-queue has three shard-threads
(2) one or some PeeringOp's epoch > osdmap's epoch held by current osd,
    and these PeeringOp _add_slot_waiter()
(3) shard-queue become empty and three shard-threads cond.wait()
(4) new osdmap consume and it _wake_pg_slot()
    Problem in here
1> OSDShard::consume() exec loop all pg's slot wait
     and requeue more than one PeeringOp to shard-queue
        2> but it only notify one shard-thread to wakeup,
           the other two shard-threads continue cond.wait()
3> OSD::ShardedOpWQ::_enqueue() found the shard-queue not empty
   and not notify all shard-thread to wakeup

     In a period of time, only one shard-thread of 3 shard-threads is running.

Fixes: https://tracker.ceph.com/issues/52781
Signed-off-by: Jianwei Zhang <jianwei1216@qq.com>
Change-Id: I4617db2fd95082007e6d9fa2b60f17f2a6296b5b
src/osd/OSD.cc
src/osd/OSD.h