aboutsummaryrefslogtreecommitdiff
path: root/weed/mount/page_writer_pattern.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/mount/page_writer_pattern.go')
-rw-r--r--weed/mount/page_writer_pattern.go17
1 files 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
}