From f06d2c0ff2250601ec4d3f67aa986a9edf6d57ac Mon Sep 17 00:00:00 2001 From: petricadaipegsp <155911522+petricadaipegsp@users.noreply.github.com> Date: Wed, 13 Nov 2024 17:41:23 +0100 Subject: [PATCH] Ensure latest frame monotonicity (#350) --- node/consensus/data/data_clock_consensus_engine.go | 3 ++- node/consensus/data/main_data_loop.go | 5 ++--- node/internal/cas/cas.go | 12 ++++++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 node/internal/cas/cas.go diff --git a/node/consensus/data/data_clock_consensus_engine.go b/node/consensus/data/data_clock_consensus_engine.go index dee969d..bef5356 100644 --- a/node/consensus/data/data_clock_consensus_engine.go +++ b/node/consensus/data/data_clock_consensus_engine.go @@ -26,6 +26,7 @@ import ( qtime "source.quilibrium.com/quilibrium/monorepo/node/consensus/time" qcrypto "source.quilibrium.com/quilibrium/monorepo/node/crypto" "source.quilibrium.com/quilibrium/monorepo/node/execution" + "source.quilibrium.com/quilibrium/monorepo/node/internal/cas" "source.quilibrium.com/quilibrium/monorepo/node/keys" "source.quilibrium.com/quilibrium/monorepo/node/p2p" "source.quilibrium.com/quilibrium/monorepo/node/protobufs" @@ -413,7 +414,7 @@ func (e *DataClockConsensusEngine) Start() <-chan error { }, } - e.latestFrameReceived = frame.FrameNumber + cas.IfLessThanUint64(&e.latestFrameReceived, frame.FrameNumber) e.logger.Info( "preparing peer announce", zap.Uint64("frame_number", frame.FrameNumber), diff --git a/node/consensus/data/main_data_loop.go b/node/consensus/data/main_data_loop.go index 2426b6d..deb5da4 100644 --- a/node/consensus/data/main_data_loop.go +++ b/node/consensus/data/main_data_loop.go @@ -8,6 +8,7 @@ import ( "github.com/iden3/go-iden3-crypto/poseidon" "go.uber.org/zap" "source.quilibrium.com/quilibrium/monorepo/node/consensus" + "source.quilibrium.com/quilibrium/monorepo/node/internal/cas" "source.quilibrium.com/quilibrium/monorepo/node/protobufs" "source.quilibrium.com/quilibrium/monorepo/node/tries" ) @@ -108,9 +109,7 @@ func (e *DataClockConsensusEngine) processFrame( latestFrame = dataFrame } - if e.latestFrameReceived < latestFrame.FrameNumber { - e.latestFrameReceived = latestFrame.FrameNumber - } + cas.IfLessThanUint64(&e.latestFrameReceived, latestFrame.FrameNumber) e.frameProverTriesMx.Lock() e.frameProverTries = e.dataTimeReel.GetFrameProverTries() e.frameProverTriesMx.Unlock() diff --git a/node/internal/cas/cas.go b/node/internal/cas/cas.go new file mode 100644 index 0000000..4ad28ee --- /dev/null +++ b/node/internal/cas/cas.go @@ -0,0 +1,12 @@ +package cas + +import "sync/atomic" + +// IfLessThanInt64 sets the value of a to lt if the current value of a is less than lt. +func IfLessThanUint64(a *uint64, lt uint64) { + for val := atomic.LoadUint64(a); val < lt; val = atomic.LoadUint64(a) { + if atomic.CompareAndSwapUint64(a, val, lt) { + return + } + } +}