Loading CHANGELOG.md +1 −0 Original line number Diff line number Diff line Loading @@ -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. Loading internal/skiplist/element.go +4 −11 Original line number Diff line number Diff line Loading @@ -14,7 +14,6 @@ type skiplistLevel struct { type Element struct { Value Interface backward *Element level []*skiplistLevel } Loading @@ -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) Loading @@ -37,7 +31,6 @@ func newElement(level int, v Interface) *Element { return &Element{ Value: v, backward: nil, level: slLevels, } } Loading internal/skiplist/skiplist.go +0 −24 Original line number Diff line number Diff line Loading @@ -9,7 +9,6 @@ type Interface interface { type SkipList struct { r *rand.Rand header *Element tail *Element update []*Element rank []int length int Loading @@ -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, Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading @@ -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-- } Loading internal/skiplist/skiplist_test.go +9 −25 Original line number Diff line number Diff line Loading @@ -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() } Loading Loading @@ -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() } Loading @@ -109,7 +93,7 @@ func TestInt(t *testing.T) { t.Fatal() } if sl.Len() != 3 { if sl.Len() != 4 { t.Fatal() } Loading @@ -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)) Loading @@ -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() } Loading server/api_account.go +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
CHANGELOG.md +1 −0 Original line number Diff line number Diff line Loading @@ -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. Loading
internal/skiplist/element.go +4 −11 Original line number Diff line number Diff line Loading @@ -14,7 +14,6 @@ type skiplistLevel struct { type Element struct { Value Interface backward *Element level []*skiplistLevel } Loading @@ -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) Loading @@ -37,7 +31,6 @@ func newElement(level int, v Interface) *Element { return &Element{ Value: v, backward: nil, level: slLevels, } } Loading
internal/skiplist/skiplist.go +0 −24 Original line number Diff line number Diff line Loading @@ -9,7 +9,6 @@ type Interface interface { type SkipList struct { r *rand.Rand header *Element tail *Element update []*Element rank []int length int Loading @@ -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, Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading @@ -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-- } Loading
internal/skiplist/skiplist_test.go +9 −25 Original line number Diff line number Diff line Loading @@ -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() } Loading Loading @@ -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() } Loading @@ -109,7 +93,7 @@ func TestInt(t *testing.T) { t.Fatal() } if sl.Len() != 3 { if sl.Len() != 4 { t.Fatal() } Loading @@ -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)) Loading @@ -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() } Loading
server/api_account.go +1 −1 Original line number Diff line number Diff line Loading @@ -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