Skip to content

Commit 63aeee4

Browse files
committed
add Group.Upsert()
add Group.Upsert()
1 parent d8e4a79 commit 63aeee4

File tree

2 files changed

+43
-5
lines changed

2 files changed

+43
-5
lines changed

group.go

+21-4
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,20 @@ func (b *Group) hashElement(element *Element) {
7070
b.circle.Sort()
7171
}
7272

73+
func (b *Group) Upsert(key string, payload []byte) error {
74+
element := &Element{Key: key, Payload: payload}
75+
b.Lock()
76+
defer b.Unlock()
77+
if _, ok := b.Elements[element.Key]; ok {
78+
if err := b.delete(key); err != nil {
79+
return err
80+
}
81+
}
82+
b.Elements[element.Key] = element
83+
b.hashElement(element)
84+
return nil
85+
}
86+
7387
func (b *Group) Insert(key string, payload []byte) error {
7488
element := &Element{Key: key, Payload: payload}
7589
b.Lock()
@@ -84,11 +98,8 @@ func (b *Group) Insert(key string, payload []byte) error {
8498
return nil
8599
}
86100

87-
func (b *Group) Delete(key string) error {
101+
func (b *Group) delete(key string) error {
88102
element := &Element{Key: key, Payload: nil}
89-
b.Lock()
90-
defer b.Unlock()
91-
92103
delete(b.Elements, element.Key)
93104
for i := 0; i < b.NumberOfReplicas; i++ {
94105
virtualKey := b.virtualKey(key, i)
@@ -102,6 +113,12 @@ func (b *Group) Delete(key string) error {
102113
return nil
103114
}
104115

116+
func (b *Group) Delete(key string) error {
117+
b.Lock()
118+
defer b.Unlock()
119+
return b.delete(key)
120+
}
121+
105122
func (b *Group) Match(key string) (string, []byte, error) {
106123
crc := b.hash(key)
107124
b.RLock()

group_test.go

+22-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,27 @@ func TestGroupInit(t *testing.T) {
2828
assert.NotNil(t, group.rows)
2929
}
3030

31+
func TestGroupUpsert(t *testing.T) {
32+
group := NewGroup("test", 10000)
33+
34+
key, payload := "192.168.1.100:1883", []byte("werbenhu100")
35+
err := group.Upsert(key, payload)
36+
37+
assert.Nil(t, err)
38+
assert.Equal(t, 10000, len(group.circle))
39+
assert.Equal(t, 10000, len(group.rows))
40+
assert.Equal(t, 1, len(group.Elements))
41+
42+
assert.Equal(t, key, group.Elements[key].Key)
43+
assert.Equal(t, payload, group.Elements[key].Payload)
44+
45+
payload = []byte("werbenhu101")
46+
err = group.Upsert(key, payload)
47+
assert.Nil(t, err)
48+
assert.Equal(t, key, group.Elements[key].Key)
49+
assert.Equal(t, payload, group.Elements[key].Payload)
50+
}
51+
3152
func TestGroupInsert(t *testing.T) {
3253
group := NewGroup("test", 10000)
3354

@@ -116,7 +137,7 @@ func TestGroupAll(t *testing.T) {
116137
}
117138

118139
func TestGroupGetElements(t *testing.T) {
119-
group := NewGroup("test", 10000)
140+
group := NewGroup("testgetelements", 10000)
120141
group.Insert("192.168.1.100:1883", []byte("werbenhu100"))
121142
group.Insert("192.168.1.101:1883", []byte("werbenhu101"))
122143

0 commit comments

Comments
 (0)