From d343b0db5744d5516fe6ffa368dda792c47e9ee3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 3 Oct 2021 01:15:14 -0700 Subject: [PATCH] update value --- weed/util/skiplist/skiplist.go | 13 +++++++++++++ weed/util/skiplist/skiplist_test.go | 29 ++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) 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() + } + } +}