Skip to content

Commit

Permalink
leaderboard rank cache improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
Max Kuznetsov committed Jul 6, 2023
1 parent d052b88 commit 37771f8
Show file tree
Hide file tree
Showing 27 changed files with 4,364 additions and 395 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ The format is based on [keep a changelog](http://keepachangelog.com) and this pr
## [Unreleased]
### Changed
- Better formatting for graphed values in devconsole status view.
- Memory usage and population time improvements in leaderboard rank cache.

### Fixed
- Correct cursor usage in group listings using only open/closed group state filter.
Expand Down
15 changes: 4 additions & 11 deletions internal/skiplist/element.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,15 @@ type skiplistLevel struct {
}

type Element struct {
Value Interface
backward *Element
level []*skiplistLevel
Value Interface
level []*skiplistLevel
}

// Next returns the next skiplist element or nil.
func (e *Element) Next() *Element {
return e.level[0].forward
}

// Prev returns the previous skiplist element of nil.
func (e *Element) Prev() *Element {
return e.backward
}

// newElement returns an initialized element.
func newElement(level int, v Interface) *Element {
slLevels := make([]*skiplistLevel, level)
Expand All @@ -36,9 +30,8 @@ func newElement(level int, v Interface) *Element {
}

return &Element{
Value: v,
backward: nil,
level: slLevels,
Value: v,
level: slLevels,
}
}

Expand Down
24 changes: 0 additions & 24 deletions internal/skiplist/skiplist.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ type Interface interface {
type SkipList struct {
r *rand.Rand
header *Element
tail *Element
update []*Element
rank []int
length int
Expand All @@ -21,7 +20,6 @@ func New() *SkipList {
return &SkipList{
r: rand.New(rand.NewSource(1)),
header: newElement(SKIPLIST_MAXLEVEL, nil),
tail: nil,
update: make([]*Element, SKIPLIST_MAXLEVEL),
rank: make([]int, SKIPLIST_MAXLEVEL),
length: 0,
Expand All @@ -32,7 +30,6 @@ func New() *SkipList {
// Init initializes or clears skiplist sl.
func (sl *SkipList) Init() *SkipList {
sl.header = newElement(SKIPLIST_MAXLEVEL, nil)
sl.tail = nil
sl.update = make([]*Element, SKIPLIST_MAXLEVEL)
sl.rank = make([]int, SKIPLIST_MAXLEVEL)
sl.length = 0
Expand All @@ -45,11 +42,6 @@ func (sl *SkipList) Front() *Element {
return sl.header.level[0].forward
}

// Back returns the last elements of skiplist sl or nil.
func (sl *SkipList) Back() *Element {
return sl.tail
}

// Len returns the numbler of elements of skiplist sl.
func (sl *SkipList) Len() int {
return sl.length
Expand Down Expand Up @@ -99,16 +91,6 @@ func (sl *SkipList) Insert(v Interface) *Element {
sl.update[i].level[i].span++
}

if sl.update[0] == sl.header {
x.backward = nil
} else {
x.backward = sl.update[0]
}
if x.level[0].forward != nil {
x.level[0].forward.backward = x
} else {
sl.tail = x
}
sl.length++

return x
Expand All @@ -125,12 +107,6 @@ func (sl *SkipList) deleteElement(e *Element, update []*Element) {
}
}

if e.level[0].forward != nil {
e.level[0].forward.backward = e.backward
} else {
sl.tail = e.backward
}

for sl.level > 1 && sl.header.level[sl.level-1].forward == nil {
sl.level--
}
Expand Down
34 changes: 9 additions & 25 deletions internal/skiplist/skiplist_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,24 @@ func (i Int) Less(other interface{}) bool {

func TestInt(t *testing.T) {
sl := New()
if sl.Len() != 0 || sl.Front() != nil && sl.Back() != nil {
if sl.Len() != 0 || sl.Front() != nil {
t.Fatal()
}

testData := []Int{Int(1), Int(2), Int(3)}

sl.Insert(testData[0])
if sl.Len() != 1 || sl.Front().Value.(Int) != testData[0] || sl.Back().Value.(Int) != testData[0] {
if sl.Len() != 1 || sl.Front().Value.(Int) != testData[0] {
t.Fatal()
}

sl.Insert(testData[2])
if sl.Len() != 2 || sl.Front().Value.(Int) != testData[0] || sl.Back().Value.(Int) != testData[2] {
if sl.Len() != 2 || sl.Front().Value.(Int) != testData[0] {
t.Fatal()
}

sl.Insert(testData[1])
if sl.Len() != 3 || sl.Front().Value.(Int) != testData[0] || sl.Back().Value.(Int) != testData[2] {
if sl.Len() != 3 || sl.Front().Value.(Int) != testData[0] {
t.Fatal()
}

Expand Down Expand Up @@ -74,29 +74,13 @@ func TestInt(t *testing.T) {
sl.Delete(Int(1000))

expect = []Int{Int(-999), Int(-888), Int(1), Int(3), Int(999)}
ret = make([]Int, 0)

for e := sl.Back(); e != nil; e = e.Prev() {
ret = append(ret, e.Value.(Int))
}

for i := 0; i < len(ret); i++ {
if ret[i] != expect[len(ret)-i-1] {
t.Fatal()
}
}

if sl.Front().Value.(Int) != -999 {
t.Fatal()
}

sl.Remove(sl.Front())
if sl.Front().Value.(Int) != -888 || sl.Back().Value.(Int) != 999 {
t.Fatal()
}

sl.Remove(sl.Back())
if sl.Front().Value.(Int) != -888 || sl.Back().Value.(Int) != 3 {
if sl.Front().Value.(Int) != -888 {
t.Fatal()
}

Expand All @@ -109,7 +93,7 @@ func TestInt(t *testing.T) {
t.Fatal()
}

if sl.Len() != 3 {
if sl.Len() != 4 {
t.Fatal()
}

Expand All @@ -121,7 +105,7 @@ func TestInt(t *testing.T) {
t.Fatal()
}

expect = []Int{Int(2), Int(2), Int(2), Int(3)}
expect = []Int{Int(2), Int(2), Int(2), Int(3), Int(999)}
ret = make([]Int, 0)
for ; e != nil; e = e.Next() {
ret = append(ret, e.Value.(Int))
Expand All @@ -133,8 +117,8 @@ func TestInt(t *testing.T) {
}

sl2 := sl.Init()
if sl.Len() != 0 || sl.Front() != nil || sl.Back() != nil ||
sl2.Len() != 0 || sl2.Front() != nil || sl2.Back() != nil {
if sl.Len() != 0 || sl.Front() != nil ||
sl2.Len() != 0 || sl2.Front() != nil {
t.Fatal()
}

Expand Down
2 changes: 1 addition & 1 deletion server/api_account.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ func (s *ApiServer) DeleteAccount(ctx context.Context, in *emptypb.Empty) (*empt
}
}

if err := DeleteAccount(ctx, s.logger, s.db, s.config, s.leaderboardRankCache, s.sessionRegistry, s.sessionCache, s.tracker, userID, false); err != nil {
if err := DeleteAccount(ctx, s.logger, s.db, s.config, s.leaderboardCache, s.leaderboardRankCache, s.sessionRegistry, s.sessionCache, s.tracker, userID, false); err != nil {
if err == ErrAccountNotFound {
return nil, status.Error(codes.NotFound, "Account not found.")
}
Expand Down
1 change: 0 additions & 1 deletion server/api_leaderboard.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import (
"bytes"
"context"
"encoding/json"

"github.com/gofrs/uuid"
"github.com/heroiclabs/nakama-common/api"
"go.uber.org/zap"
Expand Down
Loading

0 comments on commit 37771f8

Please sign in to comment.