From 9b78e33837917562544b308e818f7df3db8cac06 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Fri, 22 Mar 2024 14:26:49 +0100 Subject: [PATCH] MINOR: peers: Add 2 peer flags about the peer learn status PEER_F_LEARN_PROCESS and PEER_F_LEARN_FINISHED flags are added to help to fix locking issue about peers. Indeed, a peer is able to update the peers "section" state under its own lock. Because the resync task locks all peers at once, there is no conflict at this level. But there is nothing to prevent 2 peers to update the peers state in same time. So it seems there is no real issue here, but there is a theorical thread-safety issue here. And it means the locking mechanism of the peers must be reviewed. In this context, the 2 flags above will help to move all update of the peers state in the scope of resync task. Each peer will be able to update its own state and the resync task will be responsible to update the peers state accordingly. --- src/peers.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/peers.c b/src/peers.c index d6714fed01..b8aae16780 100644 --- a/src/peers.c +++ b/src/peers.c @@ -90,16 +90,18 @@ /* Remote peer teaching state */ /******************************/ #define PEER_F_TEACH_PROCESS 0x00000001 /* Teach a lesson to current peer */ -#define PEER_F_TEACH_FINISHED 0x00000008 /* Teach conclude, (wait for confirm) */ -#define PEER_F_TEACH_COMPLETE 0x00000010 /* All that we know already taught to current peer, used only for a local peer */ -#define PEER_F_LEARN_ASSIGN 0x00000100 /* Current peer was assigned for a lesson */ -#define PEER_F_LEARN_NOTUP2DATE 0x00000200 /* Learn from peer finished but peer is not up to date */ +#define PEER_F_TEACH_FINISHED 0x00000002 /* Teach conclude, (wait for confirm) */ +#define PEER_F_TEACH_COMPLETE 0x00000004 /* All that we know already taught to current peer, used only for a local peer */ +#define PEER_F_LEARN_ASSIGN 0x00000010 /* Current peer was assigned for a lesson */ +#define PEER_F_LEARN_PROCESS 0x00000020 /* Learn from peer was started */ +#define PEER_F_LEARN_FINISHED 0x00000040 /* Learn from peer fully finished */ +#define PEER_F_LEARN_NOTUP2DATE 0x00000080 /* Learn from peer finished but peer is not up to date */ #define PEER_F_ALIVE 0x20000000 /* Used to flag a peer a alive. */ #define PEER_F_HEARTBEAT 0x40000000 /* Heartbeat message to send. */ #define PEER_F_DWNGRD 0x80000000 /* When this flag is enabled, we must downgrade the supported version announced during peer sessions. */ #define PEER_TEACH_RESET ~(PEER_F_TEACH_PROCESS|PEER_F_TEACH_FINISHED) /* PEER_F_TEACH_COMPLETE should never be reset */ -#define PEER_LEARN_RESET ~(PEER_F_LEARN_ASSIGN|PEER_F_LEARN_NOTUP2DATE) +#define PEER_LEARN_RESET ~(PEER_F_LEARN_ASSIGN|PEER_F_LEARN_PROCESS|PEER_F_LEARN_FINISHED|PEER_F_LEARN_NOTUP2DATE) #define PEER_RESYNC_TIMEOUT 5000 /* 5 seconds */ #define PEER_RECONNECT_TIMEOUT 5000 /* 5 seconds */ -- 2.39.5