Destruction of nested shared_ptr will cause stack overflow.
With the explicit assignment of nullptr, the deleted node
is completely disconnected from the current linked list
------- ******* -------
|sync | <--earlier-- |sync | <--earlier-x- |sync |
|point| --later----> |point| --later----x> |point|
------- ******* -------
| | |
V V V
------- ------- -------
|log_ | ---next----> |log_ | ---next----x> |log_ |
|entry| |entry| |entry|
------- ------- -------
earlier: earlier_sync_point
later: later_sync_point
next: next_sync_point_entry
Fixes: https://tracker.ceph.com/issues/51418
Signed-off-by: Feng Hualong <hualong.feng@intel.com>
void SyncPointLogOperation::clear_earlier_sync_point() {
std::lock_guard locker(m_lock);
ceph_assert(sync_point->later_sync_point);
- ceph_assert(sync_point->later_sync_point->earlier_sync_point ==
- sync_point);
+ ceph_assert(sync_point->later_sync_point->earlier_sync_point == sync_point);
sync_point->later_sync_point->earlier_sync_point = nullptr;
+ sync_point->later_sync_point = nullptr;
+ sync_point->log_entry->next_sync_point_entry = nullptr;
}
std::vector<Context*> SyncPointLogOperation::swap_on_sync_point_persisted() {