瀏覽代碼

etcdserver: fix race on consistent index

Anthony Romano 10 年之前
父節點
當前提交
4d2d2cabb9
共有 1 個文件被更改,包括 10 次插入2 次删除
  1. 10 2
      etcdserver/consistent_index.go

+ 10 - 2
etcdserver/consistent_index.go

@@ -14,12 +14,20 @@
 
 package etcdserver
 
+import (
+	"sync/atomic"
+)
+
 // consistentIndex represents the offset of an entry in a consistent replica log.
 // It implements the storage.ConsistentIndexGetter interface.
 // It is always set to the offset of current entry before executing the entry,
 // so ConsistentWatchableKV could get the consistent index from it.
 type consistentIndex uint64
 
-func (i *consistentIndex) setConsistentIndex(v uint64) { *i = consistentIndex(v) }
+func (i *consistentIndex) setConsistentIndex(v uint64) {
+	atomic.StoreUint64((*uint64)(i), v)
+}
 
-func (i *consistentIndex) ConsistentIndex() uint64 { return uint64(*i) }
+func (i *consistentIndex) ConsistentIndex() uint64 {
+	return atomic.LoadUint64((*uint64)(i))
+}