Project

General

Profile

Bug #64545

Updated by Samuel Just 3 months ago

<pre> 
     void exit() final { 
       if (barrier) { 
         assert(phase); 
         assert(phase->core == seastar::this_shard_id()); 
         std::ignore = std::move(*barrier 
         ).then([phase=this->phase] { 
           phase->mutex.unlock(); 
         }); 
         barrier = std::nullopt; 
         phase = nullptr; 
       } else if (phase) { 
         assert(phase->core == seastar::this_shard_id()); 
         phase->mutex.unlock(); 
         phase = nullptr; 
       } 
     } 
 </pre> 

 phase->mutex.unlock() can occur significantly after exit() finishes.    *phase will generally be embedded in a PG or a Connection, so it's often but not always safe. 

 https://tracker.ceph.com/issues/63647 https://tracker.ceph.com/issues/64513 was a more dangerous variant because *phase was part of the operation itself.

Back