Calls `send_appends_aio` only if m_pending_buffers is not
empty. It was supposed it was ok to call it even for empty
buffers, because `send_appends_aio` just returned in this
case. But the problem is caused by m_aio_scheduled flag, which is
set before releasing the lock and cleared in `send_appends_aio`,
after reacquiring the lock. If during this time window `close` is
called it will return false due to m_aio_scheduled flag set, and
the caller will expect "closed" notification, which is never
fired in this case.
Fixes: https://tracker.ceph.com/issues/38315
Signed-off-by: Mykola Golub <mgolub@suse.com>
// all remaining unsent appends should be redirected to new object
m_append_buffers.splice(m_append_buffers.begin(), m_pending_buffers);
notify_handler_unlock();
- } else {
+ } else if (!m_pending_buffers.empty()) {
m_aio_scheduled = true;
m_lock->Unlock();
send_appends_aio();
+ } else {
+ m_lock->Unlock();
}
} else {
m_lock->Unlock();