Browse Source

storage: delete key instead of setting it to false

When getting the watched events, it iterate all keys in putm and delm
to generate the events. If we don't delete the key from putm/delm,
it would range on the key that is not actually put or deleted. This is
incorrect.

Fix the panic that happens when single put/delete is watched.
Yicheng Qin 10 years ago
parent
commit
6dbfc21846
1 changed files with 6 additions and 2 deletions
  1. 6 2
      storage/watchable_store.go

+ 6 - 2
storage/watchable_store.go

@@ -317,12 +317,16 @@ func newOngoingTx() *ongoingTx {
 
 func (tx *ongoingTx) put(k string) {
 	tx.putm[k] = true
-	tx.delm[k] = false
+	if _, ok := tx.delm[k]; ok {
+		delete(tx.delm, k)
+	}
 }
 
 func (tx *ongoingTx) del(k string) {
 	tx.delm[k] = true
-	tx.putm[k] = false
+	if _, ok := tx.putm[k]; ok {
+		delete(tx.putm, k)
+	}
 }
 
 type watching struct {