Unverified Commit 63ac64a5 authored by Max Kuznetsov's avatar Max Kuznetsov Committed by GitHub
Browse files

leaderboard rank cache improvements (#1050)

parent 21e3cbda
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ The format is based on [keep a changelog](http://keepachangelog.com) and this pr
- Better handling of large numbers of configured leaderboards and tournaments.
- Improved delivery of non-persistent SendAll notifications to large numbers of users.
- Truncate stats reported to devconsole status view to 2 decimal digits for improved readability.
- Memory usage and population time improvements in leaderboard rank cache.

### Fixed
- Correct cursor usage in group listings using only open/closed group state filter.
+4 −11
Original line number Diff line number Diff line
@@ -14,7 +14,6 @@ type skiplistLevel struct {

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

@@ -23,11 +22,6 @@ 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)
@@ -37,7 +31,6 @@ func newElement(level int, v Interface) *Element {

	return &Element{
		Value: v,
		backward: nil,
		level: slLevels,
	}
}
+0 −24
Original line number Diff line number Diff line
@@ -9,7 +9,6 @@ type Interface interface {
type SkipList struct {
	r      *rand.Rand
	header *Element
	tail   *Element
	update []*Element
	rank   []int
	length int
@@ -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,
@@ -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
@@ -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
@@ -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
@@ -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--
	}
+9 −25
Original line number Diff line number Diff line
@@ -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()
	}

@@ -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()
	}

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

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

@@ -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))
@@ -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()
	}

+1 −1
Original line number Diff line number Diff line
@@ -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.")
		}
Loading