From b61ded0ae427a27ce01fe6d75430f908bf9c3d72 Mon Sep 17 00:00:00 2001 From: Kyle Reczek Date: Fri, 14 Jun 2019 08:01:24 -0600 Subject: [PATCH] [MM-16173] Migrate Team.AnalyticsTeamCount to Sync by default #11126 (#11132) * [MM-16173] Migrate Team.AnalyticsTeamCount to Sync by default #11126 + Modified team_store.AnalyticsTeamCount to return (int64, *model.AppError) instead of store.StoreChannel. + Updated the mock store to reflect new return value. + Updated referencing code to handle new sync return value. * Fix shadowing of the err * Fix the empty line between related code * Fix team count call to be an explicit async. * Added error logging to diagnostics.go * Fix gofmt in file --- app/analytics.go | 9 +++++++-- app/diagnostics.go | 5 +++-- app/helper_test.go | 10 +++++----- app/import_functions_test.go | 6 ++---- app/security_update_check.go | 4 ++-- store/sqlstore/team_store.go | 17 ++++++++--------- store/store.go | 2 +- store/storetest/mocks/TeamStore.go | 19 +++++++++++++------ store/storetest/team_store.go | 6 +++--- 9 files changed, 44 insertions(+), 34 deletions(-) diff --git a/app/analytics.go b/app/analytics.go index d26b24ba65..8c4fd083b5 100644 --- a/app/analytics.go +++ b/app/analytics.go @@ -46,7 +46,6 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo openChan := a.Srv.Store.Channel().AnalyticsTypeCount(teamId, model.CHANNEL_OPEN) privateChan := a.Srv.Store.Channel().AnalyticsTypeCount(teamId, model.CHANNEL_PRIVATE) - teamChan := a.Srv.Store.Team().AnalyticsTeamCount() var userChan store.StoreChannel var userInactiveChan store.StoreChannel @@ -65,6 +64,12 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo dailyActiveChan := a.Srv.Store.User().AnalyticsActiveCount(DAY_MILLISECONDS) monthlyActiveChan := a.Srv.Store.User().AnalyticsActiveCount(MONTH_MILLISECONDS) + teamCountChan := make(chan store.StoreResult, 1) + go func() { + teamCount, err := a.Srv.Store.Team().AnalyticsTeamCount() + teamCountChan <- store.StoreResult{Data: teamCount, Err: err} + close(teamCountChan) + }() r := <-openChan if r.Err != nil { @@ -108,7 +113,7 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo rows[10].Value = float64(r.Data.(int64)) } - r = <-teamChan + r = <-teamCountChan if r.Err != nil { return nil, r.Err } diff --git a/app/diagnostics.go b/app/diagnostics.go index bf463ab137..f35a5e642a 100644 --- a/app/diagnostics.go +++ b/app/diagnostics.go @@ -166,8 +166,9 @@ func (a *App) trackActivity() { inactiveUserCount = iucr.Data.(int64) } - if tcr := <-a.Srv.Store.Team().AnalyticsTeamCount(); tcr.Err == nil { - teamCount = tcr.Data.(int64) + teamCount, err := a.Srv.Store.Team().AnalyticsTeamCount() + if err != nil { + mlog.Error(err.Error()) } if ucc := <-a.Srv.Store.Channel().AnalyticsTypeCount("", "O"); ucc.Err == nil { diff --git a/app/helper_test.go b/app/helper_test.go index 5d5aa02872..81ddc9531a 100644 --- a/app/helper_test.go +++ b/app/helper_test.go @@ -478,13 +478,13 @@ func (me *TestHelper) ResetEmojisMigration() { } func (me *TestHelper) CheckTeamCount(t *testing.T, expected int64) { - if r := <-me.App.Srv.Store.Team().AnalyticsTeamCount(); r.Err == nil { - if r.Data.(int64) != expected { - t.Fatalf("Unexpected number of teams. Expected: %v, found: %v", expected, r.Data.(int64)) - } - } else { + teamCount, err := me.App.Srv.Store.Team().AnalyticsTeamCount() + if err != nil { t.Fatalf("Failed to get team count.") } + if teamCount != expected { + t.Fatalf("Unexpected number of teams. Expected: %v, found: %v", expected, teamCount) + } } func (me *TestHelper) CheckChannelsCount(t *testing.T, expected int64) { diff --git a/app/import_functions_test.go b/app/import_functions_test.go index 3d8d0b33b9..fe271d7175 100644 --- a/app/import_functions_test.go +++ b/app/import_functions_test.go @@ -568,10 +568,8 @@ func TestImportImportTeam(t *testing.T) { scheme2 := th.SetupTeamScheme() // Check how many teams are in the database. - var teamsCount int64 - if r := <-th.App.Srv.Store.Team().AnalyticsTeamCount(); r.Err == nil { - teamsCount = r.Data.(int64) - } else { + teamsCount, err := th.App.Srv.Store.Team().AnalyticsTeamCount() + if err != nil { t.Fatalf("Failed to get team count.") } diff --git a/app/security_update_check.go b/app/security_update_check.go index a8ebf0cd6a..a338edfdf7 100644 --- a/app/security_update_check.go +++ b/app/security_update_check.go @@ -79,8 +79,8 @@ func (s *Server) DoSecurityUpdateCheck() { v.Set(PROP_SECURITY_ACTIVE_USER_COUNT, strconv.FormatInt(ucr.Data.(int64), 10)) } - if tcr := <-s.Store.Team().AnalyticsTeamCount(); tcr.Err == nil { - v.Set(PROP_SECURITY_TEAM_COUNT, strconv.FormatInt(tcr.Data.(int64), 10)) + if teamCount, err := s.Store.Team().AnalyticsTeamCount(); err == nil { + v.Set(PROP_SECURITY_TEAM_COUNT, strconv.FormatInt(teamCount, 10)) } res, err := http.Get(SECURITY_URL + "/security?" + v.Encode()) diff --git a/store/sqlstore/team_store.go b/store/sqlstore/team_store.go index 6ae3eda211..bfc349a6b8 100644 --- a/store/sqlstore/team_store.go +++ b/store/sqlstore/team_store.go @@ -460,15 +460,14 @@ func (s SqlTeamStore) PermanentDelete(teamId string) store.StoreChannel { }) } -func (s SqlTeamStore) AnalyticsTeamCount() store.StoreChannel { - return store.Do(func(result *store.StoreResult) { - c, err := s.GetReplica().SelectInt("SELECT COUNT(*) FROM Teams WHERE DeleteAt = 0", map[string]interface{}{}) - if err != nil { - result.Err = model.NewAppError("SqlTeamStore.AnalyticsTeamCount", "store.sql_team.analytics_team_count.app_error", nil, err.Error(), http.StatusInternalServerError) - return - } - result.Data = c - }) +func (s SqlTeamStore) AnalyticsTeamCount() (int64, *model.AppError) { + c, err := s.GetReplica().SelectInt("SELECT COUNT(*) FROM Teams WHERE DeleteAt = 0", map[string]interface{}{}) + + if err != nil { + return int64(0), model.NewAppError("SqlTeamStore.AnalyticsTeamCount", "store.sql_team.analytics_team_count.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + return c, nil } func (s SqlTeamStore) getTeamMembersWithSchemeSelectQuery() sq.SelectBuilder { diff --git a/store/store.go b/store/store.go index 8b7caaaf04..b0ef469005 100644 --- a/store/store.go +++ b/store/store.go @@ -99,7 +99,7 @@ type TeamStore interface { GetTeamsByUserId(userId string) StoreChannel GetByInviteId(inviteId string) (*model.Team, *model.AppError) PermanentDelete(teamId string) StoreChannel - AnalyticsTeamCount() StoreChannel + AnalyticsTeamCount() (int64, *model.AppError) SaveMember(member *model.TeamMember, maxUsersPerTeam int) StoreChannel UpdateMember(member *model.TeamMember) StoreChannel GetMember(teamId string, userId string) StoreChannel diff --git a/store/storetest/mocks/TeamStore.go b/store/storetest/mocks/TeamStore.go index 493ee75617..96cace42d8 100644 --- a/store/storetest/mocks/TeamStore.go +++ b/store/storetest/mocks/TeamStore.go @@ -30,19 +30,26 @@ func (_m *TeamStore) AnalyticsGetTeamCountForScheme(schemeId string) store.Store } // AnalyticsTeamCount provides a mock function with given fields: -func (_m *TeamStore) AnalyticsTeamCount() store.StoreChannel { +func (_m *TeamStore) AnalyticsTeamCount() (int64, *model.AppError) { ret := _m.Called() - var r0 store.StoreChannel - if rf, ok := ret.Get(0).(func() store.StoreChannel); ok { + var r0 int64 + if rf, ok := ret.Get(0).(func() int64); ok { r0 = rf() } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(store.StoreChannel) + r0 = ret.Get(0).(int64) + } + + var r1 *model.AppError + if rf, ok := ret.Get(1).(func() *model.AppError); ok { + r1 = rf() + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*model.AppError) } } - return r0 + return r0, r1 } // ClearAllCustomRoleAssignments provides a mock function with given fields: diff --git a/store/storetest/team_store.go b/store/storetest/team_store.go index 5d2d689a5c..1dacf20158 100644 --- a/store/storetest/team_store.go +++ b/store/storetest/team_store.go @@ -768,10 +768,10 @@ func testTeamCount(t *testing.T, ss store.Store) { _, err := ss.Team().Save(&o1) require.Nil(t, err) - if r1 := <-ss.Team().AnalyticsTeamCount(); r1.Err != nil { - t.Fatal(r1.Err) + if teamCount, err := ss.Team().AnalyticsTeamCount(); err != nil { + t.Fatal(err) } else { - if r1.Data.(int64) == 0 { + if teamCount == 0 { t.Fatal("should be at least 1 team") } }