aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2021-10-03 01:15:14 -0700
committerChris Lu <chris.lu@gmail.com>2021-10-03 01:15:14 -0700
commitd343b0db5744d5516fe6ffa368dda792c47e9ee3 (patch)
treee0e264acb0f006a74d93bee473f6a8657ed80026
parent4f50f8c2ca7243a358e7ee9dab40a5a42fc462d1 (diff)
downloadseaweedfs-d343b0db5744d5516fe6ffa368dda792c47e9ee3.tar.xz
seaweedfs-d343b0db5744d5516fe6ffa368dda792c47e9ee3.zip
update value
-rw-r--r--weed/util/skiplist/skiplist.go13
-rw-r--r--weed/util/skiplist/skiplist_test.go29
2 files changed, 41 insertions, 1 deletions
diff --git a/weed/util/skiplist/skiplist.go b/weed/util/skiplist/skiplist.go
index 19fa556ae..50ce53525 100644
--- a/weed/util/skiplist/skiplist.go
+++ b/weed/util/skiplist/skiplist.go
@@ -1,5 +1,7 @@
package skiplist
+// adapted from https://github.com/MauriceGit/skiplist/blob/master/skiplist.go
+
import (
"bytes"
"fmt"
@@ -402,6 +404,17 @@ func (t *SkipList) Prev(e *SkipListElement) *SkipListElement {
return e.Prev.Load()
}
+// ChangeValue can be used to change the actual value of a node in the skiplist
+// without the need of Deleting and reinserting the node again.
+// Be advised, that ChangeValue only works, if the actual key from ExtractKey() will stay the same!
+// ok is an indicator, wether the value is actually changed.
+func (t *SkipList) ChangeValue(e *SkipListElement, newValue []byte) (ok bool) {
+ // The key needs to stay correct, so this is very important!
+ e.Value = newValue
+ e.Save()
+ return true
+}
+
// String returns a string format of the skiplist. Useful to get a graphical overview and/or debugging.
func (t *SkipList) println() {
diff --git a/weed/util/skiplist/skiplist_test.go b/weed/util/skiplist/skiplist_test.go
index 811fd5be9..b414c267b 100644
--- a/weed/util/skiplist/skiplist_test.go
+++ b/weed/util/skiplist/skiplist_test.go
@@ -242,4 +242,31 @@ func TestFindGreaterOrEqual(t *testing.T) {
}
}
-} \ No newline at end of file
+}
+
+func TestChangeValue(t *testing.T) {
+ list := New()
+
+ for i := 0; i < maxN; i++ {
+ list.Insert(Element(i), []byte("value"))
+ }
+
+ for i := 0; i < maxN; i++ {
+ // The key only looks at the int so the string doesn't matter here!
+ f1, ok := list.Find(Element(i))
+ if !ok {
+ t.Fail()
+ }
+ ok = list.ChangeValue(f1, []byte("different value"))
+ if !ok {
+ t.Fail()
+ }
+ f2, ok := list.Find(Element(i))
+ if !ok {
+ t.Fail()
+ }
+ if bytes.Compare(f2.GetValue(), []byte("different value")) != 0 {
+ t.Fail()
+ }
+ }
+}