From 2c7ddb528556a917051b8a4e0e204db3cefdffb2 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Mon, 25 May 2026 16:35:46 -0400 Subject: [PATCH] correct possible infinite lock during replication updates; --- src/fne/network/MetadataNetwork.cpp | 34 +++++++++++++++++++++++++++-- src/fne/network/MetadataNetwork.h | 1 + 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/fne/network/MetadataNetwork.cpp b/src/fne/network/MetadataNetwork.cpp index 7b927f69..76a43754 100644 --- a/src/fne/network/MetadataNetwork.cpp +++ b/src/fne/network/MetadataNetwork.cpp @@ -21,6 +21,12 @@ using namespace compress; #include +// --------------------------------------------------------------------------- +// Constants +// --------------------------------------------------------------------------- + +const uint32_t TIMEOUT_MAX_REPL = 5000U; // 5 seconds + // --------------------------------------------------------------------------- // Public Class Members // --------------------------------------------------------------------------- @@ -744,11 +750,23 @@ void MetadataNetwork::taskNetworkRx(NetPacketRequest* req) MetadataNetwork::PacketBufferEntry& pkt = mdNetwork->m_peerReplicaActPkt[peerId]; if (pkt.locked) { - while (pkt.locked) + while (pkt.locked && pkt.timeout < TIMEOUT_MAX_REPL) { + pkt.timeout++; Thread::sleep(1U); + } + + if (pkt.timeout >= TIMEOUT_MAX_REPL) { + LogError(LOG_STP, "PEER %u (%s) Peer Replication, Active Peer List, timeout waiting for packet buffer to unlock", peerId, + connection->identWithQualifier().c_str()); + pkt.buffer->clear(); + pkt.streamId = 0U; + mdNetwork->m_peerReplicaActPkt.erase(peerId); + break; + } } pkt.locked = true; + pkt.timeout = 0U; uint32_t decompressedLen = 0U; uint8_t* decompressed = nullptr; @@ -933,11 +951,23 @@ void MetadataNetwork::taskNetworkRx(NetPacketRequest* req) MetadataNetwork::PacketBufferEntry& pkt = mdNetwork->m_peerTreeListPkt[peerId]; if (pkt.locked) { - while (pkt.locked) + while (pkt.locked && pkt.timeout < TIMEOUT_MAX_REPL) { + pkt.timeout++; Thread::sleep(1U); + } + + if (pkt.timeout >= TIMEOUT_MAX_REPL) { + LogError(LOG_STP, "PEER %u (%s) Network Tree, Tree List, timeout waiting for packet buffer to unlock", peerId, + connection->identWithQualifier().c_str()); + pkt.buffer->clear(); + pkt.streamId = 0U; + mdNetwork->m_peerTreeListPkt.erase(peerId); + break; + } } pkt.locked = true; + pkt.timeout = 0U; uint32_t decompressedLen = 0U; uint8_t* decompressed = nullptr; diff --git a/src/fne/network/MetadataNetwork.h b/src/fne/network/MetadataNetwork.h index 62629a2e..46ef5eb8 100644 --- a/src/fne/network/MetadataNetwork.h +++ b/src/fne/network/MetadataNetwork.h @@ -115,6 +115,7 @@ namespace network PacketBuffer* buffer; bool locked; + uint32_t timeout; }; concurrent::unordered_map m_peerReplicaActPkt; concurrent::unordered_map m_peerTreeListPkt;