From 301b49b63f5261595a5117ae12aa9a9e6b3ed74b Mon Sep 17 00:00:00 2001 From: chrislu Date: Fri, 26 Aug 2022 17:04:11 -0700 Subject: [PATCH] atomic operation --- weed/mount/page_writer_pattern.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/weed/mount/page_writer_pattern.go b/weed/mount/page_writer_pattern.go index 4b4a816ce..d0c3c417c 100644 --- a/weed/mount/page_writer_pattern.go +++ b/weed/mount/page_writer_pattern.go @@ -1,5 +1,7 @@ package mount +import "sync/atomic" + type WriterPattern struct { isSequentialCounter int64 lastWriteStopOffset int64 @@ -20,18 +22,19 @@ func NewWriterPattern(chunkSize int64) *WriterPattern { } func (rp *WriterPattern) MonitorWriteAt(offset int64, size int) { - if rp.lastWriteStopOffset == offset { - if rp.isSequentialCounter < ModeChangeLimit { - rp.isSequentialCounter++ + lastOffset := atomic.SwapInt64(&rp.lastWriteStopOffset, offset+int64(size)) + counter := atomic.LoadInt64(&rp.isSequentialCounter) + if lastOffset == offset { + if counter < ModeChangeLimit { + atomic.AddInt64(&rp.isSequentialCounter, 1) } } else { - if rp.isSequentialCounter > -ModeChangeLimit { - rp.isSequentialCounter-- + if counter > -ModeChangeLimit { + atomic.AddInt64(&rp.isSequentialCounter, -1) } } - rp.lastWriteStopOffset = offset + int64(size) } func (rp *WriterPattern) IsSequentialMode() bool { - return rp.isSequentialCounter >= 0 + return atomic.LoadInt64(&rp.isSequentialCounter) >= 0 }