correct possible infinite lock during replication updates;

pull/121/merge
Bryan Biedenkapp 1 week ago
parent 03eb962d6c
commit 2c7ddb5285

@ -21,6 +21,12 @@ using namespace compress;
#include <cassert> #include <cassert>
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
const uint32_t TIMEOUT_MAX_REPL = 5000U; // 5 seconds
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Public Class Members // Public Class Members
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@ -744,11 +750,23 @@ void MetadataNetwork::taskNetworkRx(NetPacketRequest* req)
MetadataNetwork::PacketBufferEntry& pkt = mdNetwork->m_peerReplicaActPkt[peerId]; MetadataNetwork::PacketBufferEntry& pkt = mdNetwork->m_peerReplicaActPkt[peerId];
if (pkt.locked) { if (pkt.locked) {
while (pkt.locked) while (pkt.locked && pkt.timeout < TIMEOUT_MAX_REPL) {
pkt.timeout++;
Thread::sleep(1U); 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.locked = true;
pkt.timeout = 0U;
uint32_t decompressedLen = 0U; uint32_t decompressedLen = 0U;
uint8_t* decompressed = nullptr; uint8_t* decompressed = nullptr;
@ -933,11 +951,23 @@ void MetadataNetwork::taskNetworkRx(NetPacketRequest* req)
MetadataNetwork::PacketBufferEntry& pkt = mdNetwork->m_peerTreeListPkt[peerId]; MetadataNetwork::PacketBufferEntry& pkt = mdNetwork->m_peerTreeListPkt[peerId];
if (pkt.locked) { if (pkt.locked) {
while (pkt.locked) while (pkt.locked && pkt.timeout < TIMEOUT_MAX_REPL) {
pkt.timeout++;
Thread::sleep(1U); 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.locked = true;
pkt.timeout = 0U;
uint32_t decompressedLen = 0U; uint32_t decompressedLen = 0U;
uint8_t* decompressed = nullptr; uint8_t* decompressed = nullptr;

@ -115,6 +115,7 @@ namespace network
PacketBuffer* buffer; PacketBuffer* buffer;
bool locked; bool locked;
uint32_t timeout;
}; };
concurrent::unordered_map<uint32_t, PacketBufferEntry> m_peerReplicaActPkt; concurrent::unordered_map<uint32_t, PacketBufferEntry> m_peerReplicaActPkt;
concurrent::unordered_map<uint32_t, PacketBufferEntry> m_peerTreeListPkt; concurrent::unordered_map<uint32_t, PacketBufferEntry> m_peerTreeListPkt;

Loading…
Cancel
Save

Powered by TurnKey Linux.