diff options
| author | Chris Lu <chris.lu@gmail.com> | 2021-10-03 01:15:14 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2021-10-03 01:15:14 -0700 |
| commit | d343b0db5744d5516fe6ffa368dda792c47e9ee3 (patch) | |
| tree | e0e264acb0f006a74d93bee473f6a8657ed80026 | |
| parent | 4f50f8c2ca7243a358e7ee9dab40a5a42fc462d1 (diff) | |
| download | seaweedfs-d343b0db5744d5516fe6ffa368dda792c47e9ee3.tar.xz seaweedfs-d343b0db5744d5516fe6ffa368dda792c47e9ee3.zip | |
update value
| -rw-r--r-- | weed/util/skiplist/skiplist.go | 13 | ||||
| -rw-r--r-- | weed/util/skiplist/skiplist_test.go | 29 |
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() + } + } +} |
