github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/store/retrylayer/retrylayer.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  // Code generated by "make store-layers"
     5  // DO NOT EDIT
     6  
     7  package retrylayer
     8  
     9  import (
    10  	"context"
    11  
    12  	"github.com/go-sql-driver/mysql"
    13  	"github.com/lib/pq"
    14  	"github.com/masterhung0112/hk_server/v5/model"
    15  	"github.com/masterhung0112/hk_server/v5/store"
    16  	"github.com/pkg/errors"
    17  )
    18  
    19  const mySQLDeadlockCode = uint16(1213)
    20  
    21  type RetryLayer struct {
    22  	store.Store
    23  	AuditStore                store.AuditStore
    24  	BotStore                  store.BotStore
    25  	ChannelStore              store.ChannelStore
    26  	ChannelMemberHistoryStore store.ChannelMemberHistoryStore
    27  	ClusterDiscoveryStore     store.ClusterDiscoveryStore
    28  	CommandStore              store.CommandStore
    29  	CommandWebhookStore       store.CommandWebhookStore
    30  	ComplianceStore           store.ComplianceStore
    31  	EmojiStore                store.EmojiStore
    32  	FileInfoStore             store.FileInfoStore
    33  	GroupStore                store.GroupStore
    34  	JobStore                  store.JobStore
    35  	LicenseStore              store.LicenseStore
    36  	LinkMetadataStore         store.LinkMetadataStore
    37  	OAuthStore                store.OAuthStore
    38  	PluginStore               store.PluginStore
    39  	PostStore                 store.PostStore
    40  	PreferenceStore           store.PreferenceStore
    41  	ProductNoticesStore       store.ProductNoticesStore
    42  	ReactionStore             store.ReactionStore
    43  	RemoteClusterStore        store.RemoteClusterStore
    44  	RetentionPolicyStore      store.RetentionPolicyStore
    45  	RoleStore                 store.RoleStore
    46  	SchemeStore               store.SchemeStore
    47  	SessionStore              store.SessionStore
    48  	SharedChannelStore        store.SharedChannelStore
    49  	StatusStore               store.StatusStore
    50  	SystemStore               store.SystemStore
    51  	TeamStore                 store.TeamStore
    52  	TermsOfServiceStore       store.TermsOfServiceStore
    53  	ThreadStore               store.ThreadStore
    54  	TokenStore                store.TokenStore
    55  	TrackPointStore           store.TrackPointStore
    56  	TrackRecordStore          store.TrackRecordStore
    57  	UploadSessionStore        store.UploadSessionStore
    58  	UserStore                 store.UserStore
    59  	UserAccessTokenStore      store.UserAccessTokenStore
    60  	UserTermsOfServiceStore   store.UserTermsOfServiceStore
    61  	WebhookStore              store.WebhookStore
    62  }
    63  
    64  func (s *RetryLayer) Audit() store.AuditStore {
    65  	return s.AuditStore
    66  }
    67  
    68  func (s *RetryLayer) Bot() store.BotStore {
    69  	return s.BotStore
    70  }
    71  
    72  func (s *RetryLayer) Channel() store.ChannelStore {
    73  	return s.ChannelStore
    74  }
    75  
    76  func (s *RetryLayer) ChannelMemberHistory() store.ChannelMemberHistoryStore {
    77  	return s.ChannelMemberHistoryStore
    78  }
    79  
    80  func (s *RetryLayer) ClusterDiscovery() store.ClusterDiscoveryStore {
    81  	return s.ClusterDiscoveryStore
    82  }
    83  
    84  func (s *RetryLayer) Command() store.CommandStore {
    85  	return s.CommandStore
    86  }
    87  
    88  func (s *RetryLayer) CommandWebhook() store.CommandWebhookStore {
    89  	return s.CommandWebhookStore
    90  }
    91  
    92  func (s *RetryLayer) Compliance() store.ComplianceStore {
    93  	return s.ComplianceStore
    94  }
    95  
    96  func (s *RetryLayer) Emoji() store.EmojiStore {
    97  	return s.EmojiStore
    98  }
    99  
   100  func (s *RetryLayer) FileInfo() store.FileInfoStore {
   101  	return s.FileInfoStore
   102  }
   103  
   104  func (s *RetryLayer) Group() store.GroupStore {
   105  	return s.GroupStore
   106  }
   107  
   108  func (s *RetryLayer) Job() store.JobStore {
   109  	return s.JobStore
   110  }
   111  
   112  func (s *RetryLayer) License() store.LicenseStore {
   113  	return s.LicenseStore
   114  }
   115  
   116  func (s *RetryLayer) LinkMetadata() store.LinkMetadataStore {
   117  	return s.LinkMetadataStore
   118  }
   119  
   120  func (s *RetryLayer) OAuth() store.OAuthStore {
   121  	return s.OAuthStore
   122  }
   123  
   124  func (s *RetryLayer) Plugin() store.PluginStore {
   125  	return s.PluginStore
   126  }
   127  
   128  func (s *RetryLayer) Post() store.PostStore {
   129  	return s.PostStore
   130  }
   131  
   132  func (s *RetryLayer) Preference() store.PreferenceStore {
   133  	return s.PreferenceStore
   134  }
   135  
   136  func (s *RetryLayer) ProductNotices() store.ProductNoticesStore {
   137  	return s.ProductNoticesStore
   138  }
   139  
   140  func (s *RetryLayer) Reaction() store.ReactionStore {
   141  	return s.ReactionStore
   142  }
   143  
   144  func (s *RetryLayer) RemoteCluster() store.RemoteClusterStore {
   145  	return s.RemoteClusterStore
   146  }
   147  
   148  func (s *RetryLayer) RetentionPolicy() store.RetentionPolicyStore {
   149  	return s.RetentionPolicyStore
   150  }
   151  
   152  func (s *RetryLayer) Role() store.RoleStore {
   153  	return s.RoleStore
   154  }
   155  
   156  func (s *RetryLayer) Scheme() store.SchemeStore {
   157  	return s.SchemeStore
   158  }
   159  
   160  func (s *RetryLayer) Session() store.SessionStore {
   161  	return s.SessionStore
   162  }
   163  
   164  func (s *RetryLayer) SharedChannel() store.SharedChannelStore {
   165  	return s.SharedChannelStore
   166  }
   167  
   168  func (s *RetryLayer) Status() store.StatusStore {
   169  	return s.StatusStore
   170  }
   171  
   172  func (s *RetryLayer) System() store.SystemStore {
   173  	return s.SystemStore
   174  }
   175  
   176  func (s *RetryLayer) Team() store.TeamStore {
   177  	return s.TeamStore
   178  }
   179  
   180  func (s *RetryLayer) TermsOfService() store.TermsOfServiceStore {
   181  	return s.TermsOfServiceStore
   182  }
   183  
   184  func (s *RetryLayer) Thread() store.ThreadStore {
   185  	return s.ThreadStore
   186  }
   187  
   188  func (s *RetryLayer) Token() store.TokenStore {
   189  	return s.TokenStore
   190  }
   191  
   192  func (s *RetryLayer) TrackPoint() store.TrackPointStore {
   193  	return s.TrackPointStore
   194  }
   195  
   196  func (s *RetryLayer) TrackRecord() store.TrackRecordStore {
   197  	return s.TrackRecordStore
   198  }
   199  
   200  func (s *RetryLayer) UploadSession() store.UploadSessionStore {
   201  	return s.UploadSessionStore
   202  }
   203  
   204  func (s *RetryLayer) User() store.UserStore {
   205  	return s.UserStore
   206  }
   207  
   208  func (s *RetryLayer) UserAccessToken() store.UserAccessTokenStore {
   209  	return s.UserAccessTokenStore
   210  }
   211  
   212  func (s *RetryLayer) UserTermsOfService() store.UserTermsOfServiceStore {
   213  	return s.UserTermsOfServiceStore
   214  }
   215  
   216  func (s *RetryLayer) Webhook() store.WebhookStore {
   217  	return s.WebhookStore
   218  }
   219  
   220  type RetryLayerAuditStore struct {
   221  	store.AuditStore
   222  	Root *RetryLayer
   223  }
   224  
   225  type RetryLayerBotStore struct {
   226  	store.BotStore
   227  	Root *RetryLayer
   228  }
   229  
   230  type RetryLayerChannelStore struct {
   231  	store.ChannelStore
   232  	Root *RetryLayer
   233  }
   234  
   235  type RetryLayerChannelMemberHistoryStore struct {
   236  	store.ChannelMemberHistoryStore
   237  	Root *RetryLayer
   238  }
   239  
   240  type RetryLayerClusterDiscoveryStore struct {
   241  	store.ClusterDiscoveryStore
   242  	Root *RetryLayer
   243  }
   244  
   245  type RetryLayerCommandStore struct {
   246  	store.CommandStore
   247  	Root *RetryLayer
   248  }
   249  
   250  type RetryLayerCommandWebhookStore struct {
   251  	store.CommandWebhookStore
   252  	Root *RetryLayer
   253  }
   254  
   255  type RetryLayerComplianceStore struct {
   256  	store.ComplianceStore
   257  	Root *RetryLayer
   258  }
   259  
   260  type RetryLayerEmojiStore struct {
   261  	store.EmojiStore
   262  	Root *RetryLayer
   263  }
   264  
   265  type RetryLayerFileInfoStore struct {
   266  	store.FileInfoStore
   267  	Root *RetryLayer
   268  }
   269  
   270  type RetryLayerGroupStore struct {
   271  	store.GroupStore
   272  	Root *RetryLayer
   273  }
   274  
   275  type RetryLayerJobStore struct {
   276  	store.JobStore
   277  	Root *RetryLayer
   278  }
   279  
   280  type RetryLayerLicenseStore struct {
   281  	store.LicenseStore
   282  	Root *RetryLayer
   283  }
   284  
   285  type RetryLayerLinkMetadataStore struct {
   286  	store.LinkMetadataStore
   287  	Root *RetryLayer
   288  }
   289  
   290  type RetryLayerOAuthStore struct {
   291  	store.OAuthStore
   292  	Root *RetryLayer
   293  }
   294  
   295  type RetryLayerPluginStore struct {
   296  	store.PluginStore
   297  	Root *RetryLayer
   298  }
   299  
   300  type RetryLayerPostStore struct {
   301  	store.PostStore
   302  	Root *RetryLayer
   303  }
   304  
   305  type RetryLayerPreferenceStore struct {
   306  	store.PreferenceStore
   307  	Root *RetryLayer
   308  }
   309  
   310  type RetryLayerProductNoticesStore struct {
   311  	store.ProductNoticesStore
   312  	Root *RetryLayer
   313  }
   314  
   315  type RetryLayerReactionStore struct {
   316  	store.ReactionStore
   317  	Root *RetryLayer
   318  }
   319  
   320  type RetryLayerRemoteClusterStore struct {
   321  	store.RemoteClusterStore
   322  	Root *RetryLayer
   323  }
   324  
   325  type RetryLayerRetentionPolicyStore struct {
   326  	store.RetentionPolicyStore
   327  	Root *RetryLayer
   328  }
   329  
   330  type RetryLayerRoleStore struct {
   331  	store.RoleStore
   332  	Root *RetryLayer
   333  }
   334  
   335  type RetryLayerSchemeStore struct {
   336  	store.SchemeStore
   337  	Root *RetryLayer
   338  }
   339  
   340  type RetryLayerSessionStore struct {
   341  	store.SessionStore
   342  	Root *RetryLayer
   343  }
   344  
   345  type RetryLayerSharedChannelStore struct {
   346  	store.SharedChannelStore
   347  	Root *RetryLayer
   348  }
   349  
   350  type RetryLayerStatusStore struct {
   351  	store.StatusStore
   352  	Root *RetryLayer
   353  }
   354  
   355  type RetryLayerSystemStore struct {
   356  	store.SystemStore
   357  	Root *RetryLayer
   358  }
   359  
   360  type RetryLayerTeamStore struct {
   361  	store.TeamStore
   362  	Root *RetryLayer
   363  }
   364  
   365  type RetryLayerTermsOfServiceStore struct {
   366  	store.TermsOfServiceStore
   367  	Root *RetryLayer
   368  }
   369  
   370  type RetryLayerThreadStore struct {
   371  	store.ThreadStore
   372  	Root *RetryLayer
   373  }
   374  
   375  type RetryLayerTokenStore struct {
   376  	store.TokenStore
   377  	Root *RetryLayer
   378  }
   379  
   380  type RetryLayerTrackPointStore struct {
   381  	store.TrackPointStore
   382  	Root *RetryLayer
   383  }
   384  
   385  type RetryLayerTrackRecordStore struct {
   386  	store.TrackRecordStore
   387  	Root *RetryLayer
   388  }
   389  
   390  type RetryLayerUploadSessionStore struct {
   391  	store.UploadSessionStore
   392  	Root *RetryLayer
   393  }
   394  
   395  type RetryLayerUserStore struct {
   396  	store.UserStore
   397  	Root *RetryLayer
   398  }
   399  
   400  type RetryLayerUserAccessTokenStore struct {
   401  	store.UserAccessTokenStore
   402  	Root *RetryLayer
   403  }
   404  
   405  type RetryLayerUserTermsOfServiceStore struct {
   406  	store.UserTermsOfServiceStore
   407  	Root *RetryLayer
   408  }
   409  
   410  type RetryLayerWebhookStore struct {
   411  	store.WebhookStore
   412  	Root *RetryLayer
   413  }
   414  
   415  func isRepeatableError(err error) bool {
   416  	var pqErr *pq.Error
   417  	var mysqlErr *mysql.MySQLError
   418  	switch {
   419  	case errors.As(errors.Cause(err), &pqErr):
   420  		if pqErr.Code == "40001" || pqErr.Code == "40P01" {
   421  			return true
   422  		}
   423  	case errors.As(errors.Cause(err), &mysqlErr):
   424  		if mysqlErr.Number == mySQLDeadlockCode {
   425  			return true
   426  		}
   427  	}
   428  	return false
   429  }
   430  
   431  func (s *RetryLayerAuditStore) Get(user_id string, offset int, limit int) (model.Audits, error) {
   432  
   433  	tries := 0
   434  	for {
   435  		result, err := s.AuditStore.Get(user_id, offset, limit)
   436  		if err == nil {
   437  			return result, nil
   438  		}
   439  		if !isRepeatableError(err) {
   440  			return result, err
   441  		}
   442  		tries++
   443  		if tries >= 3 {
   444  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   445  			return result, err
   446  		}
   447  	}
   448  
   449  }
   450  
   451  func (s *RetryLayerAuditStore) PermanentDeleteByUser(userID string) error {
   452  
   453  	tries := 0
   454  	for {
   455  		err := s.AuditStore.PermanentDeleteByUser(userID)
   456  		if err == nil {
   457  			return nil
   458  		}
   459  		if !isRepeatableError(err) {
   460  			return err
   461  		}
   462  		tries++
   463  		if tries >= 3 {
   464  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   465  			return err
   466  		}
   467  	}
   468  
   469  }
   470  
   471  func (s *RetryLayerAuditStore) Save(audit *model.Audit) error {
   472  
   473  	tries := 0
   474  	for {
   475  		err := s.AuditStore.Save(audit)
   476  		if err == nil {
   477  			return nil
   478  		}
   479  		if !isRepeatableError(err) {
   480  			return err
   481  		}
   482  		tries++
   483  		if tries >= 3 {
   484  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   485  			return err
   486  		}
   487  	}
   488  
   489  }
   490  
   491  func (s *RetryLayerBotStore) Get(userID string, includeDeleted bool) (*model.Bot, error) {
   492  
   493  	tries := 0
   494  	for {
   495  		result, err := s.BotStore.Get(userID, includeDeleted)
   496  		if err == nil {
   497  			return result, nil
   498  		}
   499  		if !isRepeatableError(err) {
   500  			return result, err
   501  		}
   502  		tries++
   503  		if tries >= 3 {
   504  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   505  			return result, err
   506  		}
   507  	}
   508  
   509  }
   510  
   511  func (s *RetryLayerBotStore) GetAll(options *model.BotGetOptions) ([]*model.Bot, error) {
   512  
   513  	tries := 0
   514  	for {
   515  		result, err := s.BotStore.GetAll(options)
   516  		if err == nil {
   517  			return result, nil
   518  		}
   519  		if !isRepeatableError(err) {
   520  			return result, err
   521  		}
   522  		tries++
   523  		if tries >= 3 {
   524  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   525  			return result, err
   526  		}
   527  	}
   528  
   529  }
   530  
   531  func (s *RetryLayerBotStore) PermanentDelete(userID string) error {
   532  
   533  	tries := 0
   534  	for {
   535  		err := s.BotStore.PermanentDelete(userID)
   536  		if err == nil {
   537  			return nil
   538  		}
   539  		if !isRepeatableError(err) {
   540  			return err
   541  		}
   542  		tries++
   543  		if tries >= 3 {
   544  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   545  			return err
   546  		}
   547  	}
   548  
   549  }
   550  
   551  func (s *RetryLayerBotStore) Save(bot *model.Bot) (*model.Bot, error) {
   552  
   553  	tries := 0
   554  	for {
   555  		result, err := s.BotStore.Save(bot)
   556  		if err == nil {
   557  			return result, nil
   558  		}
   559  		if !isRepeatableError(err) {
   560  			return result, err
   561  		}
   562  		tries++
   563  		if tries >= 3 {
   564  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   565  			return result, err
   566  		}
   567  	}
   568  
   569  }
   570  
   571  func (s *RetryLayerBotStore) Update(bot *model.Bot) (*model.Bot, error) {
   572  
   573  	tries := 0
   574  	for {
   575  		result, err := s.BotStore.Update(bot)
   576  		if err == nil {
   577  			return result, nil
   578  		}
   579  		if !isRepeatableError(err) {
   580  			return result, err
   581  		}
   582  		tries++
   583  		if tries >= 3 {
   584  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   585  			return result, err
   586  		}
   587  	}
   588  
   589  }
   590  
   591  func (s *RetryLayerChannelStore) AnalyticsDeletedTypeCount(teamID string, channelType string) (int64, error) {
   592  
   593  	tries := 0
   594  	for {
   595  		result, err := s.ChannelStore.AnalyticsDeletedTypeCount(teamID, channelType)
   596  		if err == nil {
   597  			return result, nil
   598  		}
   599  		if !isRepeatableError(err) {
   600  			return result, err
   601  		}
   602  		tries++
   603  		if tries >= 3 {
   604  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   605  			return result, err
   606  		}
   607  	}
   608  
   609  }
   610  
   611  func (s *RetryLayerChannelStore) AnalyticsTypeCount(teamID string, channelType string) (int64, error) {
   612  
   613  	tries := 0
   614  	for {
   615  		result, err := s.ChannelStore.AnalyticsTypeCount(teamID, channelType)
   616  		if err == nil {
   617  			return result, nil
   618  		}
   619  		if !isRepeatableError(err) {
   620  			return result, err
   621  		}
   622  		tries++
   623  		if tries >= 3 {
   624  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   625  			return result, err
   626  		}
   627  	}
   628  
   629  }
   630  
   631  func (s *RetryLayerChannelStore) AutocompleteInTeam(teamID string, term string, includeDeleted bool) (*model.ChannelList, error) {
   632  
   633  	tries := 0
   634  	for {
   635  		result, err := s.ChannelStore.AutocompleteInTeam(teamID, term, includeDeleted)
   636  		if err == nil {
   637  			return result, nil
   638  		}
   639  		if !isRepeatableError(err) {
   640  			return result, err
   641  		}
   642  		tries++
   643  		if tries >= 3 {
   644  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   645  			return result, err
   646  		}
   647  	}
   648  
   649  }
   650  
   651  func (s *RetryLayerChannelStore) AutocompleteInTeamForSearch(teamID string, userID string, term string, includeDeleted bool) (*model.ChannelList, error) {
   652  
   653  	tries := 0
   654  	for {
   655  		result, err := s.ChannelStore.AutocompleteInTeamForSearch(teamID, userID, term, includeDeleted)
   656  		if err == nil {
   657  			return result, nil
   658  		}
   659  		if !isRepeatableError(err) {
   660  			return result, err
   661  		}
   662  		tries++
   663  		if tries >= 3 {
   664  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   665  			return result, err
   666  		}
   667  	}
   668  
   669  }
   670  
   671  func (s *RetryLayerChannelStore) ClearAllCustomRoleAssignments() error {
   672  
   673  	tries := 0
   674  	for {
   675  		err := s.ChannelStore.ClearAllCustomRoleAssignments()
   676  		if err == nil {
   677  			return nil
   678  		}
   679  		if !isRepeatableError(err) {
   680  			return err
   681  		}
   682  		tries++
   683  		if tries >= 3 {
   684  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   685  			return err
   686  		}
   687  	}
   688  
   689  }
   690  
   691  func (s *RetryLayerChannelStore) ClearCaches() {
   692  
   693  	s.ChannelStore.ClearCaches()
   694  
   695  }
   696  
   697  func (s *RetryLayerChannelStore) ClearSidebarOnTeamLeave(userID string, teamID string) error {
   698  
   699  	tries := 0
   700  	for {
   701  		err := s.ChannelStore.ClearSidebarOnTeamLeave(userID, teamID)
   702  		if err == nil {
   703  			return nil
   704  		}
   705  		if !isRepeatableError(err) {
   706  			return err
   707  		}
   708  		tries++
   709  		if tries >= 3 {
   710  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   711  			return err
   712  		}
   713  	}
   714  
   715  }
   716  
   717  func (s *RetryLayerChannelStore) CountPostsAfter(channelID string, timestamp int64, userID string) (int, int, error) {
   718  
   719  	tries := 0
   720  	for {
   721  		result, resultVar1, err := s.ChannelStore.CountPostsAfter(channelID, timestamp, userID)
   722  		if err == nil {
   723  			return result, resultVar1, nil
   724  		}
   725  		if !isRepeatableError(err) {
   726  			return result, resultVar1, err
   727  		}
   728  		tries++
   729  		if tries >= 3 {
   730  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   731  			return result, resultVar1, err
   732  		}
   733  	}
   734  
   735  }
   736  
   737  func (s *RetryLayerChannelStore) CreateDirectChannel(userID *model.User, otherUserID *model.User, channelOptions ...model.ChannelOption) (*model.Channel, error) {
   738  
   739  	tries := 0
   740  	for {
   741  		result, err := s.ChannelStore.CreateDirectChannel(userID, otherUserID, channelOptions...)
   742  		if err == nil {
   743  			return result, nil
   744  		}
   745  		if !isRepeatableError(err) {
   746  			return result, err
   747  		}
   748  		tries++
   749  		if tries >= 3 {
   750  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   751  			return result, err
   752  		}
   753  	}
   754  
   755  }
   756  
   757  func (s *RetryLayerChannelStore) CreateInitialSidebarCategories(userID string, teamID string) (*model.OrderedSidebarCategories, error) {
   758  
   759  	tries := 0
   760  	for {
   761  		result, err := s.ChannelStore.CreateInitialSidebarCategories(userID, teamID)
   762  		if err == nil {
   763  			return result, nil
   764  		}
   765  		if !isRepeatableError(err) {
   766  			return result, err
   767  		}
   768  		tries++
   769  		if tries >= 3 {
   770  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   771  			return result, err
   772  		}
   773  	}
   774  
   775  }
   776  
   777  func (s *RetryLayerChannelStore) CreateSidebarCategory(userID string, teamID string, newCategory *model.SidebarCategoryWithChannels) (*model.SidebarCategoryWithChannels, error) {
   778  
   779  	tries := 0
   780  	for {
   781  		result, err := s.ChannelStore.CreateSidebarCategory(userID, teamID, newCategory)
   782  		if err == nil {
   783  			return result, nil
   784  		}
   785  		if !isRepeatableError(err) {
   786  			return result, err
   787  		}
   788  		tries++
   789  		if tries >= 3 {
   790  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   791  			return result, err
   792  		}
   793  	}
   794  
   795  }
   796  
   797  func (s *RetryLayerChannelStore) Delete(channelID string, time int64) error {
   798  
   799  	tries := 0
   800  	for {
   801  		err := s.ChannelStore.Delete(channelID, time)
   802  		if err == nil {
   803  			return nil
   804  		}
   805  		if !isRepeatableError(err) {
   806  			return err
   807  		}
   808  		tries++
   809  		if tries >= 3 {
   810  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   811  			return err
   812  		}
   813  	}
   814  
   815  }
   816  
   817  func (s *RetryLayerChannelStore) DeleteSidebarCategory(categoryID string) error {
   818  
   819  	tries := 0
   820  	for {
   821  		err := s.ChannelStore.DeleteSidebarCategory(categoryID)
   822  		if err == nil {
   823  			return nil
   824  		}
   825  		if !isRepeatableError(err) {
   826  			return err
   827  		}
   828  		tries++
   829  		if tries >= 3 {
   830  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   831  			return err
   832  		}
   833  	}
   834  
   835  }
   836  
   837  func (s *RetryLayerChannelStore) DeleteSidebarChannelsByPreferences(preferences *model.Preferences) error {
   838  
   839  	tries := 0
   840  	for {
   841  		err := s.ChannelStore.DeleteSidebarChannelsByPreferences(preferences)
   842  		if err == nil {
   843  			return nil
   844  		}
   845  		if !isRepeatableError(err) {
   846  			return err
   847  		}
   848  		tries++
   849  		if tries >= 3 {
   850  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   851  			return err
   852  		}
   853  	}
   854  
   855  }
   856  
   857  func (s *RetryLayerChannelStore) Get(id string, allowFromCache bool) (*model.Channel, error) {
   858  
   859  	tries := 0
   860  	for {
   861  		result, err := s.ChannelStore.Get(id, allowFromCache)
   862  		if err == nil {
   863  			return result, nil
   864  		}
   865  		if !isRepeatableError(err) {
   866  			return result, err
   867  		}
   868  		tries++
   869  		if tries >= 3 {
   870  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   871  			return result, err
   872  		}
   873  	}
   874  
   875  }
   876  
   877  func (s *RetryLayerChannelStore) GetAll(teamID string) ([]*model.Channel, error) {
   878  
   879  	tries := 0
   880  	for {
   881  		result, err := s.ChannelStore.GetAll(teamID)
   882  		if err == nil {
   883  			return result, nil
   884  		}
   885  		if !isRepeatableError(err) {
   886  			return result, err
   887  		}
   888  		tries++
   889  		if tries >= 3 {
   890  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   891  			return result, err
   892  		}
   893  	}
   894  
   895  }
   896  
   897  func (s *RetryLayerChannelStore) GetAllChannelMembersForUser(userID string, allowFromCache bool, includeDeleted bool) (map[string]string, error) {
   898  
   899  	tries := 0
   900  	for {
   901  		result, err := s.ChannelStore.GetAllChannelMembersForUser(userID, allowFromCache, includeDeleted)
   902  		if err == nil {
   903  			return result, nil
   904  		}
   905  		if !isRepeatableError(err) {
   906  			return result, err
   907  		}
   908  		tries++
   909  		if tries >= 3 {
   910  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   911  			return result, err
   912  		}
   913  	}
   914  
   915  }
   916  
   917  func (s *RetryLayerChannelStore) GetAllChannelMembersNotifyPropsForChannel(channelID string, allowFromCache bool) (map[string]model.StringMap, error) {
   918  
   919  	tries := 0
   920  	for {
   921  		result, err := s.ChannelStore.GetAllChannelMembersNotifyPropsForChannel(channelID, allowFromCache)
   922  		if err == nil {
   923  			return result, nil
   924  		}
   925  		if !isRepeatableError(err) {
   926  			return result, err
   927  		}
   928  		tries++
   929  		if tries >= 3 {
   930  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   931  			return result, err
   932  		}
   933  	}
   934  
   935  }
   936  
   937  func (s *RetryLayerChannelStore) GetAllChannels(page int, perPage int, opts store.ChannelSearchOpts) (*model.ChannelListWithTeamData, error) {
   938  
   939  	tries := 0
   940  	for {
   941  		result, err := s.ChannelStore.GetAllChannels(page, perPage, opts)
   942  		if err == nil {
   943  			return result, nil
   944  		}
   945  		if !isRepeatableError(err) {
   946  			return result, err
   947  		}
   948  		tries++
   949  		if tries >= 3 {
   950  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   951  			return result, err
   952  		}
   953  	}
   954  
   955  }
   956  
   957  func (s *RetryLayerChannelStore) GetAllChannelsCount(opts store.ChannelSearchOpts) (int64, error) {
   958  
   959  	tries := 0
   960  	for {
   961  		result, err := s.ChannelStore.GetAllChannelsCount(opts)
   962  		if err == nil {
   963  			return result, nil
   964  		}
   965  		if !isRepeatableError(err) {
   966  			return result, err
   967  		}
   968  		tries++
   969  		if tries >= 3 {
   970  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   971  			return result, err
   972  		}
   973  	}
   974  
   975  }
   976  
   977  func (s *RetryLayerChannelStore) GetAllChannelsForExportAfter(limit int, afterID string) ([]*model.ChannelForExport, error) {
   978  
   979  	tries := 0
   980  	for {
   981  		result, err := s.ChannelStore.GetAllChannelsForExportAfter(limit, afterID)
   982  		if err == nil {
   983  			return result, nil
   984  		}
   985  		if !isRepeatableError(err) {
   986  			return result, err
   987  		}
   988  		tries++
   989  		if tries >= 3 {
   990  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
   991  			return result, err
   992  		}
   993  	}
   994  
   995  }
   996  
   997  func (s *RetryLayerChannelStore) GetAllDirectChannelsForExportAfter(limit int, afterID string) ([]*model.DirectChannelForExport, error) {
   998  
   999  	tries := 0
  1000  	for {
  1001  		result, err := s.ChannelStore.GetAllDirectChannelsForExportAfter(limit, afterID)
  1002  		if err == nil {
  1003  			return result, nil
  1004  		}
  1005  		if !isRepeatableError(err) {
  1006  			return result, err
  1007  		}
  1008  		tries++
  1009  		if tries >= 3 {
  1010  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1011  			return result, err
  1012  		}
  1013  	}
  1014  
  1015  }
  1016  
  1017  func (s *RetryLayerChannelStore) GetByName(team_id string, name string, allowFromCache bool) (*model.Channel, error) {
  1018  
  1019  	tries := 0
  1020  	for {
  1021  		result, err := s.ChannelStore.GetByName(team_id, name, allowFromCache)
  1022  		if err == nil {
  1023  			return result, nil
  1024  		}
  1025  		if !isRepeatableError(err) {
  1026  			return result, err
  1027  		}
  1028  		tries++
  1029  		if tries >= 3 {
  1030  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1031  			return result, err
  1032  		}
  1033  	}
  1034  
  1035  }
  1036  
  1037  func (s *RetryLayerChannelStore) GetByNameIncludeDeleted(team_id string, name string, allowFromCache bool) (*model.Channel, error) {
  1038  
  1039  	tries := 0
  1040  	for {
  1041  		result, err := s.ChannelStore.GetByNameIncludeDeleted(team_id, name, allowFromCache)
  1042  		if err == nil {
  1043  			return result, nil
  1044  		}
  1045  		if !isRepeatableError(err) {
  1046  			return result, err
  1047  		}
  1048  		tries++
  1049  		if tries >= 3 {
  1050  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1051  			return result, err
  1052  		}
  1053  	}
  1054  
  1055  }
  1056  
  1057  func (s *RetryLayerChannelStore) GetByNames(team_id string, names []string, allowFromCache bool) ([]*model.Channel, error) {
  1058  
  1059  	tries := 0
  1060  	for {
  1061  		result, err := s.ChannelStore.GetByNames(team_id, names, allowFromCache)
  1062  		if err == nil {
  1063  			return result, nil
  1064  		}
  1065  		if !isRepeatableError(err) {
  1066  			return result, err
  1067  		}
  1068  		tries++
  1069  		if tries >= 3 {
  1070  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1071  			return result, err
  1072  		}
  1073  	}
  1074  
  1075  }
  1076  
  1077  func (s *RetryLayerChannelStore) GetChannelCounts(teamID string, userID string) (*model.ChannelCounts, error) {
  1078  
  1079  	tries := 0
  1080  	for {
  1081  		result, err := s.ChannelStore.GetChannelCounts(teamID, userID)
  1082  		if err == nil {
  1083  			return result, nil
  1084  		}
  1085  		if !isRepeatableError(err) {
  1086  			return result, err
  1087  		}
  1088  		tries++
  1089  		if tries >= 3 {
  1090  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1091  			return result, err
  1092  		}
  1093  	}
  1094  
  1095  }
  1096  
  1097  func (s *RetryLayerChannelStore) GetChannelMembersForExport(userID string, teamID string) ([]*model.ChannelMemberForExport, error) {
  1098  
  1099  	tries := 0
  1100  	for {
  1101  		result, err := s.ChannelStore.GetChannelMembersForExport(userID, teamID)
  1102  		if err == nil {
  1103  			return result, nil
  1104  		}
  1105  		if !isRepeatableError(err) {
  1106  			return result, err
  1107  		}
  1108  		tries++
  1109  		if tries >= 3 {
  1110  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1111  			return result, err
  1112  		}
  1113  	}
  1114  
  1115  }
  1116  
  1117  func (s *RetryLayerChannelStore) GetChannelMembersTimezones(channelID string) ([]model.StringMap, error) {
  1118  
  1119  	tries := 0
  1120  	for {
  1121  		result, err := s.ChannelStore.GetChannelMembersTimezones(channelID)
  1122  		if err == nil {
  1123  			return result, nil
  1124  		}
  1125  		if !isRepeatableError(err) {
  1126  			return result, err
  1127  		}
  1128  		tries++
  1129  		if tries >= 3 {
  1130  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1131  			return result, err
  1132  		}
  1133  	}
  1134  
  1135  }
  1136  
  1137  func (s *RetryLayerChannelStore) GetChannelUnread(channelID string, userID string) (*model.ChannelUnread, error) {
  1138  
  1139  	tries := 0
  1140  	for {
  1141  		result, err := s.ChannelStore.GetChannelUnread(channelID, userID)
  1142  		if err == nil {
  1143  			return result, nil
  1144  		}
  1145  		if !isRepeatableError(err) {
  1146  			return result, err
  1147  		}
  1148  		tries++
  1149  		if tries >= 3 {
  1150  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1151  			return result, err
  1152  		}
  1153  	}
  1154  
  1155  }
  1156  
  1157  func (s *RetryLayerChannelStore) GetChannels(teamID string, userID string, includeDeleted bool, lastDeleteAt int) (*model.ChannelList, error) {
  1158  
  1159  	tries := 0
  1160  	for {
  1161  		result, err := s.ChannelStore.GetChannels(teamID, userID, includeDeleted, lastDeleteAt)
  1162  		if err == nil {
  1163  			return result, nil
  1164  		}
  1165  		if !isRepeatableError(err) {
  1166  			return result, err
  1167  		}
  1168  		tries++
  1169  		if tries >= 3 {
  1170  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1171  			return result, err
  1172  		}
  1173  	}
  1174  
  1175  }
  1176  
  1177  func (s *RetryLayerChannelStore) GetChannelsBatchForIndexing(startTime int64, endTime int64, limit int) ([]*model.Channel, error) {
  1178  
  1179  	tries := 0
  1180  	for {
  1181  		result, err := s.ChannelStore.GetChannelsBatchForIndexing(startTime, endTime, limit)
  1182  		if err == nil {
  1183  			return result, nil
  1184  		}
  1185  		if !isRepeatableError(err) {
  1186  			return result, err
  1187  		}
  1188  		tries++
  1189  		if tries >= 3 {
  1190  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1191  			return result, err
  1192  		}
  1193  	}
  1194  
  1195  }
  1196  
  1197  func (s *RetryLayerChannelStore) GetChannelsByIds(channelIds []string, includeDeleted bool) ([]*model.Channel, error) {
  1198  
  1199  	tries := 0
  1200  	for {
  1201  		result, err := s.ChannelStore.GetChannelsByIds(channelIds, includeDeleted)
  1202  		if err == nil {
  1203  			return result, nil
  1204  		}
  1205  		if !isRepeatableError(err) {
  1206  			return result, err
  1207  		}
  1208  		tries++
  1209  		if tries >= 3 {
  1210  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1211  			return result, err
  1212  		}
  1213  	}
  1214  
  1215  }
  1216  
  1217  func (s *RetryLayerChannelStore) GetChannelsByScheme(schemeID string, offset int, limit int) (model.ChannelList, error) {
  1218  
  1219  	tries := 0
  1220  	for {
  1221  		result, err := s.ChannelStore.GetChannelsByScheme(schemeID, offset, limit)
  1222  		if err == nil {
  1223  			return result, nil
  1224  		}
  1225  		if !isRepeatableError(err) {
  1226  			return result, err
  1227  		}
  1228  		tries++
  1229  		if tries >= 3 {
  1230  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1231  			return result, err
  1232  		}
  1233  	}
  1234  
  1235  }
  1236  
  1237  func (s *RetryLayerChannelStore) GetDeleted(team_id string, offset int, limit int, userID string) (*model.ChannelList, error) {
  1238  
  1239  	tries := 0
  1240  	for {
  1241  		result, err := s.ChannelStore.GetDeleted(team_id, offset, limit, userID)
  1242  		if err == nil {
  1243  			return result, nil
  1244  		}
  1245  		if !isRepeatableError(err) {
  1246  			return result, err
  1247  		}
  1248  		tries++
  1249  		if tries >= 3 {
  1250  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1251  			return result, err
  1252  		}
  1253  	}
  1254  
  1255  }
  1256  
  1257  func (s *RetryLayerChannelStore) GetDeletedByName(team_id string, name string) (*model.Channel, error) {
  1258  
  1259  	tries := 0
  1260  	for {
  1261  		result, err := s.ChannelStore.GetDeletedByName(team_id, name)
  1262  		if err == nil {
  1263  			return result, nil
  1264  		}
  1265  		if !isRepeatableError(err) {
  1266  			return result, err
  1267  		}
  1268  		tries++
  1269  		if tries >= 3 {
  1270  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1271  			return result, err
  1272  		}
  1273  	}
  1274  
  1275  }
  1276  
  1277  func (s *RetryLayerChannelStore) GetForPost(postID string) (*model.Channel, error) {
  1278  
  1279  	tries := 0
  1280  	for {
  1281  		result, err := s.ChannelStore.GetForPost(postID)
  1282  		if err == nil {
  1283  			return result, nil
  1284  		}
  1285  		if !isRepeatableError(err) {
  1286  			return result, err
  1287  		}
  1288  		tries++
  1289  		if tries >= 3 {
  1290  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1291  			return result, err
  1292  		}
  1293  	}
  1294  
  1295  }
  1296  
  1297  func (s *RetryLayerChannelStore) GetFromMaster(id string) (*model.Channel, error) {
  1298  
  1299  	tries := 0
  1300  	for {
  1301  		result, err := s.ChannelStore.GetFromMaster(id)
  1302  		if err == nil {
  1303  			return result, nil
  1304  		}
  1305  		if !isRepeatableError(err) {
  1306  			return result, err
  1307  		}
  1308  		tries++
  1309  		if tries >= 3 {
  1310  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1311  			return result, err
  1312  		}
  1313  	}
  1314  
  1315  }
  1316  
  1317  func (s *RetryLayerChannelStore) GetGuestCount(channelID string, allowFromCache bool) (int64, error) {
  1318  
  1319  	tries := 0
  1320  	for {
  1321  		result, err := s.ChannelStore.GetGuestCount(channelID, allowFromCache)
  1322  		if err == nil {
  1323  			return result, nil
  1324  		}
  1325  		if !isRepeatableError(err) {
  1326  			return result, err
  1327  		}
  1328  		tries++
  1329  		if tries >= 3 {
  1330  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1331  			return result, err
  1332  		}
  1333  	}
  1334  
  1335  }
  1336  
  1337  func (s *RetryLayerChannelStore) GetMember(ctx context.Context, channelID string, userID string) (*model.ChannelMember, error) {
  1338  
  1339  	tries := 0
  1340  	for {
  1341  		result, err := s.ChannelStore.GetMember(ctx, channelID, userID)
  1342  		if err == nil {
  1343  			return result, nil
  1344  		}
  1345  		if !isRepeatableError(err) {
  1346  			return result, err
  1347  		}
  1348  		tries++
  1349  		if tries >= 3 {
  1350  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1351  			return result, err
  1352  		}
  1353  	}
  1354  
  1355  }
  1356  
  1357  func (s *RetryLayerChannelStore) GetMemberCount(channelID string, allowFromCache bool) (int64, error) {
  1358  
  1359  	tries := 0
  1360  	for {
  1361  		result, err := s.ChannelStore.GetMemberCount(channelID, allowFromCache)
  1362  		if err == nil {
  1363  			return result, nil
  1364  		}
  1365  		if !isRepeatableError(err) {
  1366  			return result, err
  1367  		}
  1368  		tries++
  1369  		if tries >= 3 {
  1370  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1371  			return result, err
  1372  		}
  1373  	}
  1374  
  1375  }
  1376  
  1377  func (s *RetryLayerChannelStore) GetMemberCountFromCache(channelID string) int64 {
  1378  
  1379  	return s.ChannelStore.GetMemberCountFromCache(channelID)
  1380  
  1381  }
  1382  
  1383  func (s *RetryLayerChannelStore) GetMemberCountsByGroup(ctx context.Context, channelID string, includeTimezones bool) ([]*model.ChannelMemberCountByGroup, error) {
  1384  
  1385  	tries := 0
  1386  	for {
  1387  		result, err := s.ChannelStore.GetMemberCountsByGroup(ctx, channelID, includeTimezones)
  1388  		if err == nil {
  1389  			return result, nil
  1390  		}
  1391  		if !isRepeatableError(err) {
  1392  			return result, err
  1393  		}
  1394  		tries++
  1395  		if tries >= 3 {
  1396  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1397  			return result, err
  1398  		}
  1399  	}
  1400  
  1401  }
  1402  
  1403  func (s *RetryLayerChannelStore) GetMemberForPost(postID string, userID string) (*model.ChannelMember, error) {
  1404  
  1405  	tries := 0
  1406  	for {
  1407  		result, err := s.ChannelStore.GetMemberForPost(postID, userID)
  1408  		if err == nil {
  1409  			return result, nil
  1410  		}
  1411  		if !isRepeatableError(err) {
  1412  			return result, err
  1413  		}
  1414  		tries++
  1415  		if tries >= 3 {
  1416  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1417  			return result, err
  1418  		}
  1419  	}
  1420  
  1421  }
  1422  
  1423  func (s *RetryLayerChannelStore) GetMembers(channelID string, offset int, limit int) (*model.ChannelMembers, error) {
  1424  
  1425  	tries := 0
  1426  	for {
  1427  		result, err := s.ChannelStore.GetMembers(channelID, offset, limit)
  1428  		if err == nil {
  1429  			return result, nil
  1430  		}
  1431  		if !isRepeatableError(err) {
  1432  			return result, err
  1433  		}
  1434  		tries++
  1435  		if tries >= 3 {
  1436  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1437  			return result, err
  1438  		}
  1439  	}
  1440  
  1441  }
  1442  
  1443  func (s *RetryLayerChannelStore) GetMembersByChannelIds(channelIds []string, userID string) (*model.ChannelMembers, error) {
  1444  
  1445  	tries := 0
  1446  	for {
  1447  		result, err := s.ChannelStore.GetMembersByChannelIds(channelIds, userID)
  1448  		if err == nil {
  1449  			return result, nil
  1450  		}
  1451  		if !isRepeatableError(err) {
  1452  			return result, err
  1453  		}
  1454  		tries++
  1455  		if tries >= 3 {
  1456  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1457  			return result, err
  1458  		}
  1459  	}
  1460  
  1461  }
  1462  
  1463  func (s *RetryLayerChannelStore) GetMembersByIds(channelID string, userIds []string) (*model.ChannelMembers, error) {
  1464  
  1465  	tries := 0
  1466  	for {
  1467  		result, err := s.ChannelStore.GetMembersByIds(channelID, userIds)
  1468  		if err == nil {
  1469  			return result, nil
  1470  		}
  1471  		if !isRepeatableError(err) {
  1472  			return result, err
  1473  		}
  1474  		tries++
  1475  		if tries >= 3 {
  1476  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1477  			return result, err
  1478  		}
  1479  	}
  1480  
  1481  }
  1482  
  1483  func (s *RetryLayerChannelStore) GetMembersForUser(teamID string, userID string) (*model.ChannelMembers, error) {
  1484  
  1485  	tries := 0
  1486  	for {
  1487  		result, err := s.ChannelStore.GetMembersForUser(teamID, userID)
  1488  		if err == nil {
  1489  			return result, nil
  1490  		}
  1491  		if !isRepeatableError(err) {
  1492  			return result, err
  1493  		}
  1494  		tries++
  1495  		if tries >= 3 {
  1496  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1497  			return result, err
  1498  		}
  1499  	}
  1500  
  1501  }
  1502  
  1503  func (s *RetryLayerChannelStore) GetMembersForUserWithPagination(teamID string, userID string, page int, perPage int) (*model.ChannelMembers, error) {
  1504  
  1505  	tries := 0
  1506  	for {
  1507  		result, err := s.ChannelStore.GetMembersForUserWithPagination(teamID, userID, page, perPage)
  1508  		if err == nil {
  1509  			return result, nil
  1510  		}
  1511  		if !isRepeatableError(err) {
  1512  			return result, err
  1513  		}
  1514  		tries++
  1515  		if tries >= 3 {
  1516  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1517  			return result, err
  1518  		}
  1519  	}
  1520  
  1521  }
  1522  
  1523  func (s *RetryLayerChannelStore) GetMoreChannels(teamID string, userID string, offset int, limit int) (*model.ChannelList, error) {
  1524  
  1525  	tries := 0
  1526  	for {
  1527  		result, err := s.ChannelStore.GetMoreChannels(teamID, userID, offset, limit)
  1528  		if err == nil {
  1529  			return result, nil
  1530  		}
  1531  		if !isRepeatableError(err) {
  1532  			return result, err
  1533  		}
  1534  		tries++
  1535  		if tries >= 3 {
  1536  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1537  			return result, err
  1538  		}
  1539  	}
  1540  
  1541  }
  1542  
  1543  func (s *RetryLayerChannelStore) GetPinnedPostCount(channelID string, allowFromCache bool) (int64, error) {
  1544  
  1545  	tries := 0
  1546  	for {
  1547  		result, err := s.ChannelStore.GetPinnedPostCount(channelID, allowFromCache)
  1548  		if err == nil {
  1549  			return result, nil
  1550  		}
  1551  		if !isRepeatableError(err) {
  1552  			return result, err
  1553  		}
  1554  		tries++
  1555  		if tries >= 3 {
  1556  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1557  			return result, err
  1558  		}
  1559  	}
  1560  
  1561  }
  1562  
  1563  func (s *RetryLayerChannelStore) GetPinnedPosts(channelID string) (*model.PostList, error) {
  1564  
  1565  	tries := 0
  1566  	for {
  1567  		result, err := s.ChannelStore.GetPinnedPosts(channelID)
  1568  		if err == nil {
  1569  			return result, nil
  1570  		}
  1571  		if !isRepeatableError(err) {
  1572  			return result, err
  1573  		}
  1574  		tries++
  1575  		if tries >= 3 {
  1576  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1577  			return result, err
  1578  		}
  1579  	}
  1580  
  1581  }
  1582  
  1583  func (s *RetryLayerChannelStore) GetPrivateChannelsForTeam(teamID string, offset int, limit int) (*model.ChannelList, error) {
  1584  
  1585  	tries := 0
  1586  	for {
  1587  		result, err := s.ChannelStore.GetPrivateChannelsForTeam(teamID, offset, limit)
  1588  		if err == nil {
  1589  			return result, nil
  1590  		}
  1591  		if !isRepeatableError(err) {
  1592  			return result, err
  1593  		}
  1594  		tries++
  1595  		if tries >= 3 {
  1596  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1597  			return result, err
  1598  		}
  1599  	}
  1600  
  1601  }
  1602  
  1603  func (s *RetryLayerChannelStore) GetPublicChannelsByIdsForTeam(teamID string, channelIds []string) (*model.ChannelList, error) {
  1604  
  1605  	tries := 0
  1606  	for {
  1607  		result, err := s.ChannelStore.GetPublicChannelsByIdsForTeam(teamID, channelIds)
  1608  		if err == nil {
  1609  			return result, nil
  1610  		}
  1611  		if !isRepeatableError(err) {
  1612  			return result, err
  1613  		}
  1614  		tries++
  1615  		if tries >= 3 {
  1616  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1617  			return result, err
  1618  		}
  1619  	}
  1620  
  1621  }
  1622  
  1623  func (s *RetryLayerChannelStore) GetPublicChannelsForTeam(teamID string, offset int, limit int) (*model.ChannelList, error) {
  1624  
  1625  	tries := 0
  1626  	for {
  1627  		result, err := s.ChannelStore.GetPublicChannelsForTeam(teamID, offset, limit)
  1628  		if err == nil {
  1629  			return result, nil
  1630  		}
  1631  		if !isRepeatableError(err) {
  1632  			return result, err
  1633  		}
  1634  		tries++
  1635  		if tries >= 3 {
  1636  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1637  			return result, err
  1638  		}
  1639  	}
  1640  
  1641  }
  1642  
  1643  func (s *RetryLayerChannelStore) GetSidebarCategories(userID string, teamID string) (*model.OrderedSidebarCategories, error) {
  1644  
  1645  	tries := 0
  1646  	for {
  1647  		result, err := s.ChannelStore.GetSidebarCategories(userID, teamID)
  1648  		if err == nil {
  1649  			return result, nil
  1650  		}
  1651  		if !isRepeatableError(err) {
  1652  			return result, err
  1653  		}
  1654  		tries++
  1655  		if tries >= 3 {
  1656  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1657  			return result, err
  1658  		}
  1659  	}
  1660  
  1661  }
  1662  
  1663  func (s *RetryLayerChannelStore) GetSidebarCategory(categoryID string) (*model.SidebarCategoryWithChannels, error) {
  1664  
  1665  	tries := 0
  1666  	for {
  1667  		result, err := s.ChannelStore.GetSidebarCategory(categoryID)
  1668  		if err == nil {
  1669  			return result, nil
  1670  		}
  1671  		if !isRepeatableError(err) {
  1672  			return result, err
  1673  		}
  1674  		tries++
  1675  		if tries >= 3 {
  1676  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1677  			return result, err
  1678  		}
  1679  	}
  1680  
  1681  }
  1682  
  1683  func (s *RetryLayerChannelStore) GetSidebarCategoryOrder(userID string, teamID string) ([]string, error) {
  1684  
  1685  	tries := 0
  1686  	for {
  1687  		result, err := s.ChannelStore.GetSidebarCategoryOrder(userID, teamID)
  1688  		if err == nil {
  1689  			return result, nil
  1690  		}
  1691  		if !isRepeatableError(err) {
  1692  			return result, err
  1693  		}
  1694  		tries++
  1695  		if tries >= 3 {
  1696  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1697  			return result, err
  1698  		}
  1699  	}
  1700  
  1701  }
  1702  
  1703  func (s *RetryLayerChannelStore) GetTeamChannels(teamID string) (*model.ChannelList, error) {
  1704  
  1705  	tries := 0
  1706  	for {
  1707  		result, err := s.ChannelStore.GetTeamChannels(teamID)
  1708  		if err == nil {
  1709  			return result, nil
  1710  		}
  1711  		if !isRepeatableError(err) {
  1712  			return result, err
  1713  		}
  1714  		tries++
  1715  		if tries >= 3 {
  1716  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1717  			return result, err
  1718  		}
  1719  	}
  1720  
  1721  }
  1722  
  1723  func (s *RetryLayerChannelStore) GetTeamForChannel(channelID string) (*model.Team, error) {
  1724  
  1725  	tries := 0
  1726  	for {
  1727  		result, err := s.ChannelStore.GetTeamForChannel(channelID)
  1728  		if err == nil {
  1729  			return result, nil
  1730  		}
  1731  		if !isRepeatableError(err) {
  1732  			return result, err
  1733  		}
  1734  		tries++
  1735  		if tries >= 3 {
  1736  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1737  			return result, err
  1738  		}
  1739  	}
  1740  
  1741  }
  1742  
  1743  func (s *RetryLayerChannelStore) GroupSyncedChannelCount() (int64, error) {
  1744  
  1745  	tries := 0
  1746  	for {
  1747  		result, err := s.ChannelStore.GroupSyncedChannelCount()
  1748  		if err == nil {
  1749  			return result, nil
  1750  		}
  1751  		if !isRepeatableError(err) {
  1752  			return result, err
  1753  		}
  1754  		tries++
  1755  		if tries >= 3 {
  1756  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1757  			return result, err
  1758  		}
  1759  	}
  1760  
  1761  }
  1762  
  1763  func (s *RetryLayerChannelStore) IncrementMentionCount(channelID string, userID string, updateThreads bool, isRoot bool) error {
  1764  
  1765  	tries := 0
  1766  	for {
  1767  		err := s.ChannelStore.IncrementMentionCount(channelID, userID, updateThreads, isRoot)
  1768  		if err == nil {
  1769  			return nil
  1770  		}
  1771  		if !isRepeatableError(err) {
  1772  			return err
  1773  		}
  1774  		tries++
  1775  		if tries >= 3 {
  1776  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1777  			return err
  1778  		}
  1779  	}
  1780  
  1781  }
  1782  
  1783  func (s *RetryLayerChannelStore) InvalidateAllChannelMembersForUser(userID string) {
  1784  
  1785  	s.ChannelStore.InvalidateAllChannelMembersForUser(userID)
  1786  
  1787  }
  1788  
  1789  func (s *RetryLayerChannelStore) InvalidateCacheForChannelMembersNotifyProps(channelID string) {
  1790  
  1791  	s.ChannelStore.InvalidateCacheForChannelMembersNotifyProps(channelID)
  1792  
  1793  }
  1794  
  1795  func (s *RetryLayerChannelStore) InvalidateChannel(id string) {
  1796  
  1797  	s.ChannelStore.InvalidateChannel(id)
  1798  
  1799  }
  1800  
  1801  func (s *RetryLayerChannelStore) InvalidateChannelByName(teamID string, name string) {
  1802  
  1803  	s.ChannelStore.InvalidateChannelByName(teamID, name)
  1804  
  1805  }
  1806  
  1807  func (s *RetryLayerChannelStore) InvalidateGuestCount(channelID string) {
  1808  
  1809  	s.ChannelStore.InvalidateGuestCount(channelID)
  1810  
  1811  }
  1812  
  1813  func (s *RetryLayerChannelStore) InvalidateMemberCount(channelID string) {
  1814  
  1815  	s.ChannelStore.InvalidateMemberCount(channelID)
  1816  
  1817  }
  1818  
  1819  func (s *RetryLayerChannelStore) InvalidatePinnedPostCount(channelID string) {
  1820  
  1821  	s.ChannelStore.InvalidatePinnedPostCount(channelID)
  1822  
  1823  }
  1824  
  1825  func (s *RetryLayerChannelStore) IsUserInChannelUseCache(userID string, channelID string) bool {
  1826  
  1827  	return s.ChannelStore.IsUserInChannelUseCache(userID, channelID)
  1828  
  1829  }
  1830  
  1831  func (s *RetryLayerChannelStore) MigrateChannelMembers(fromChannelID string, fromUserID string) (map[string]string, error) {
  1832  
  1833  	tries := 0
  1834  	for {
  1835  		result, err := s.ChannelStore.MigrateChannelMembers(fromChannelID, fromUserID)
  1836  		if err == nil {
  1837  			return result, nil
  1838  		}
  1839  		if !isRepeatableError(err) {
  1840  			return result, err
  1841  		}
  1842  		tries++
  1843  		if tries >= 3 {
  1844  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1845  			return result, err
  1846  		}
  1847  	}
  1848  
  1849  }
  1850  
  1851  func (s *RetryLayerChannelStore) MigratePublicChannels() error {
  1852  
  1853  	tries := 0
  1854  	for {
  1855  		err := s.ChannelStore.MigratePublicChannels()
  1856  		if err == nil {
  1857  			return nil
  1858  		}
  1859  		if !isRepeatableError(err) {
  1860  			return err
  1861  		}
  1862  		tries++
  1863  		if tries >= 3 {
  1864  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1865  			return err
  1866  		}
  1867  	}
  1868  
  1869  }
  1870  
  1871  func (s *RetryLayerChannelStore) PermanentDelete(channelID string) error {
  1872  
  1873  	tries := 0
  1874  	for {
  1875  		err := s.ChannelStore.PermanentDelete(channelID)
  1876  		if err == nil {
  1877  			return nil
  1878  		}
  1879  		if !isRepeatableError(err) {
  1880  			return err
  1881  		}
  1882  		tries++
  1883  		if tries >= 3 {
  1884  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1885  			return err
  1886  		}
  1887  	}
  1888  
  1889  }
  1890  
  1891  func (s *RetryLayerChannelStore) PermanentDeleteByTeam(teamID string) error {
  1892  
  1893  	tries := 0
  1894  	for {
  1895  		err := s.ChannelStore.PermanentDeleteByTeam(teamID)
  1896  		if err == nil {
  1897  			return nil
  1898  		}
  1899  		if !isRepeatableError(err) {
  1900  			return err
  1901  		}
  1902  		tries++
  1903  		if tries >= 3 {
  1904  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1905  			return err
  1906  		}
  1907  	}
  1908  
  1909  }
  1910  
  1911  func (s *RetryLayerChannelStore) PermanentDeleteMembersByChannel(channelID string) error {
  1912  
  1913  	tries := 0
  1914  	for {
  1915  		err := s.ChannelStore.PermanentDeleteMembersByChannel(channelID)
  1916  		if err == nil {
  1917  			return nil
  1918  		}
  1919  		if !isRepeatableError(err) {
  1920  			return err
  1921  		}
  1922  		tries++
  1923  		if tries >= 3 {
  1924  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1925  			return err
  1926  		}
  1927  	}
  1928  
  1929  }
  1930  
  1931  func (s *RetryLayerChannelStore) PermanentDeleteMembersByUser(userID string) error {
  1932  
  1933  	tries := 0
  1934  	for {
  1935  		err := s.ChannelStore.PermanentDeleteMembersByUser(userID)
  1936  		if err == nil {
  1937  			return nil
  1938  		}
  1939  		if !isRepeatableError(err) {
  1940  			return err
  1941  		}
  1942  		tries++
  1943  		if tries >= 3 {
  1944  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1945  			return err
  1946  		}
  1947  	}
  1948  
  1949  }
  1950  
  1951  func (s *RetryLayerChannelStore) RemoveAllDeactivatedMembers(channelID string) error {
  1952  
  1953  	tries := 0
  1954  	for {
  1955  		err := s.ChannelStore.RemoveAllDeactivatedMembers(channelID)
  1956  		if err == nil {
  1957  			return nil
  1958  		}
  1959  		if !isRepeatableError(err) {
  1960  			return err
  1961  		}
  1962  		tries++
  1963  		if tries >= 3 {
  1964  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1965  			return err
  1966  		}
  1967  	}
  1968  
  1969  }
  1970  
  1971  func (s *RetryLayerChannelStore) RemoveMember(channelID string, userID string) error {
  1972  
  1973  	tries := 0
  1974  	for {
  1975  		err := s.ChannelStore.RemoveMember(channelID, userID)
  1976  		if err == nil {
  1977  			return nil
  1978  		}
  1979  		if !isRepeatableError(err) {
  1980  			return err
  1981  		}
  1982  		tries++
  1983  		if tries >= 3 {
  1984  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  1985  			return err
  1986  		}
  1987  	}
  1988  
  1989  }
  1990  
  1991  func (s *RetryLayerChannelStore) RemoveMembers(channelID string, userIds []string) error {
  1992  
  1993  	tries := 0
  1994  	for {
  1995  		err := s.ChannelStore.RemoveMembers(channelID, userIds)
  1996  		if err == nil {
  1997  			return nil
  1998  		}
  1999  		if !isRepeatableError(err) {
  2000  			return err
  2001  		}
  2002  		tries++
  2003  		if tries >= 3 {
  2004  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2005  			return err
  2006  		}
  2007  	}
  2008  
  2009  }
  2010  
  2011  func (s *RetryLayerChannelStore) ResetAllChannelSchemes() error {
  2012  
  2013  	tries := 0
  2014  	for {
  2015  		err := s.ChannelStore.ResetAllChannelSchemes()
  2016  		if err == nil {
  2017  			return nil
  2018  		}
  2019  		if !isRepeatableError(err) {
  2020  			return err
  2021  		}
  2022  		tries++
  2023  		if tries >= 3 {
  2024  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2025  			return err
  2026  		}
  2027  	}
  2028  
  2029  }
  2030  
  2031  func (s *RetryLayerChannelStore) Restore(channelID string, time int64) error {
  2032  
  2033  	tries := 0
  2034  	for {
  2035  		err := s.ChannelStore.Restore(channelID, time)
  2036  		if err == nil {
  2037  			return nil
  2038  		}
  2039  		if !isRepeatableError(err) {
  2040  			return err
  2041  		}
  2042  		tries++
  2043  		if tries >= 3 {
  2044  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2045  			return err
  2046  		}
  2047  	}
  2048  
  2049  }
  2050  
  2051  func (s *RetryLayerChannelStore) Save(channel *model.Channel, maxChannelsPerTeam int64) (*model.Channel, error) {
  2052  
  2053  	tries := 0
  2054  	for {
  2055  		result, err := s.ChannelStore.Save(channel, maxChannelsPerTeam)
  2056  		if err == nil {
  2057  			return result, nil
  2058  		}
  2059  		if !isRepeatableError(err) {
  2060  			return result, err
  2061  		}
  2062  		tries++
  2063  		if tries >= 3 {
  2064  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2065  			return result, err
  2066  		}
  2067  	}
  2068  
  2069  }
  2070  
  2071  func (s *RetryLayerChannelStore) SaveDirectChannel(channel *model.Channel, member1 *model.ChannelMember, member2 *model.ChannelMember) (*model.Channel, error) {
  2072  
  2073  	tries := 0
  2074  	for {
  2075  		result, err := s.ChannelStore.SaveDirectChannel(channel, member1, member2)
  2076  		if err == nil {
  2077  			return result, nil
  2078  		}
  2079  		if !isRepeatableError(err) {
  2080  			return result, err
  2081  		}
  2082  		tries++
  2083  		if tries >= 3 {
  2084  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2085  			return result, err
  2086  		}
  2087  	}
  2088  
  2089  }
  2090  
  2091  func (s *RetryLayerChannelStore) SaveMember(member *model.ChannelMember) (*model.ChannelMember, error) {
  2092  
  2093  	tries := 0
  2094  	for {
  2095  		result, err := s.ChannelStore.SaveMember(member)
  2096  		if err == nil {
  2097  			return result, nil
  2098  		}
  2099  		if !isRepeatableError(err) {
  2100  			return result, err
  2101  		}
  2102  		tries++
  2103  		if tries >= 3 {
  2104  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2105  			return result, err
  2106  		}
  2107  	}
  2108  
  2109  }
  2110  
  2111  func (s *RetryLayerChannelStore) SaveMultipleMembers(members []*model.ChannelMember) ([]*model.ChannelMember, error) {
  2112  
  2113  	tries := 0
  2114  	for {
  2115  		result, err := s.ChannelStore.SaveMultipleMembers(members)
  2116  		if err == nil {
  2117  			return result, nil
  2118  		}
  2119  		if !isRepeatableError(err) {
  2120  			return result, err
  2121  		}
  2122  		tries++
  2123  		if tries >= 3 {
  2124  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2125  			return result, err
  2126  		}
  2127  	}
  2128  
  2129  }
  2130  
  2131  func (s *RetryLayerChannelStore) SearchAllChannels(term string, opts store.ChannelSearchOpts) (*model.ChannelListWithTeamData, int64, error) {
  2132  
  2133  	tries := 0
  2134  	for {
  2135  		result, resultVar1, err := s.ChannelStore.SearchAllChannels(term, opts)
  2136  		if err == nil {
  2137  			return result, resultVar1, nil
  2138  		}
  2139  		if !isRepeatableError(err) {
  2140  			return result, resultVar1, err
  2141  		}
  2142  		tries++
  2143  		if tries >= 3 {
  2144  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2145  			return result, resultVar1, err
  2146  		}
  2147  	}
  2148  
  2149  }
  2150  
  2151  func (s *RetryLayerChannelStore) SearchArchivedInTeam(teamID string, term string, userID string) (*model.ChannelList, error) {
  2152  
  2153  	tries := 0
  2154  	for {
  2155  		result, err := s.ChannelStore.SearchArchivedInTeam(teamID, term, userID)
  2156  		if err == nil {
  2157  			return result, nil
  2158  		}
  2159  		if !isRepeatableError(err) {
  2160  			return result, err
  2161  		}
  2162  		tries++
  2163  		if tries >= 3 {
  2164  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2165  			return result, err
  2166  		}
  2167  	}
  2168  
  2169  }
  2170  
  2171  func (s *RetryLayerChannelStore) SearchForUserInTeam(userID string, teamID string, term string, includeDeleted bool) (*model.ChannelList, error) {
  2172  
  2173  	tries := 0
  2174  	for {
  2175  		result, err := s.ChannelStore.SearchForUserInTeam(userID, teamID, term, includeDeleted)
  2176  		if err == nil {
  2177  			return result, nil
  2178  		}
  2179  		if !isRepeatableError(err) {
  2180  			return result, err
  2181  		}
  2182  		tries++
  2183  		if tries >= 3 {
  2184  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2185  			return result, err
  2186  		}
  2187  	}
  2188  
  2189  }
  2190  
  2191  func (s *RetryLayerChannelStore) SearchGroupChannels(userID string, term string) (*model.ChannelList, error) {
  2192  
  2193  	tries := 0
  2194  	for {
  2195  		result, err := s.ChannelStore.SearchGroupChannels(userID, term)
  2196  		if err == nil {
  2197  			return result, nil
  2198  		}
  2199  		if !isRepeatableError(err) {
  2200  			return result, err
  2201  		}
  2202  		tries++
  2203  		if tries >= 3 {
  2204  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2205  			return result, err
  2206  		}
  2207  	}
  2208  
  2209  }
  2210  
  2211  func (s *RetryLayerChannelStore) SearchInTeam(teamID string, term string, includeDeleted bool) (*model.ChannelList, error) {
  2212  
  2213  	tries := 0
  2214  	for {
  2215  		result, err := s.ChannelStore.SearchInTeam(teamID, term, includeDeleted)
  2216  		if err == nil {
  2217  			return result, nil
  2218  		}
  2219  		if !isRepeatableError(err) {
  2220  			return result, err
  2221  		}
  2222  		tries++
  2223  		if tries >= 3 {
  2224  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2225  			return result, err
  2226  		}
  2227  	}
  2228  
  2229  }
  2230  
  2231  func (s *RetryLayerChannelStore) SearchMore(userID string, teamID string, term string) (*model.ChannelList, error) {
  2232  
  2233  	tries := 0
  2234  	for {
  2235  		result, err := s.ChannelStore.SearchMore(userID, teamID, term)
  2236  		if err == nil {
  2237  			return result, nil
  2238  		}
  2239  		if !isRepeatableError(err) {
  2240  			return result, err
  2241  		}
  2242  		tries++
  2243  		if tries >= 3 {
  2244  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2245  			return result, err
  2246  		}
  2247  	}
  2248  
  2249  }
  2250  
  2251  func (s *RetryLayerChannelStore) SetDeleteAt(channelID string, deleteAt int64, updateAt int64) error {
  2252  
  2253  	tries := 0
  2254  	for {
  2255  		err := s.ChannelStore.SetDeleteAt(channelID, deleteAt, updateAt)
  2256  		if err == nil {
  2257  			return nil
  2258  		}
  2259  		if !isRepeatableError(err) {
  2260  			return err
  2261  		}
  2262  		tries++
  2263  		if tries >= 3 {
  2264  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2265  			return err
  2266  		}
  2267  	}
  2268  
  2269  }
  2270  
  2271  func (s *RetryLayerChannelStore) SetShared(channelId string, shared bool) error {
  2272  
  2273  	tries := 0
  2274  	for {
  2275  		err := s.ChannelStore.SetShared(channelId, shared)
  2276  		if err == nil {
  2277  			return nil
  2278  		}
  2279  		if !isRepeatableError(err) {
  2280  			return err
  2281  		}
  2282  		tries++
  2283  		if tries >= 3 {
  2284  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2285  			return err
  2286  		}
  2287  	}
  2288  
  2289  }
  2290  
  2291  func (s *RetryLayerChannelStore) Update(channel *model.Channel) (*model.Channel, error) {
  2292  
  2293  	tries := 0
  2294  	for {
  2295  		result, err := s.ChannelStore.Update(channel)
  2296  		if err == nil {
  2297  			return result, nil
  2298  		}
  2299  		if !isRepeatableError(err) {
  2300  			return result, err
  2301  		}
  2302  		tries++
  2303  		if tries >= 3 {
  2304  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2305  			return result, err
  2306  		}
  2307  	}
  2308  
  2309  }
  2310  
  2311  func (s *RetryLayerChannelStore) UpdateLastViewedAt(channelIds []string, userID string, updateThreads bool) (map[string]int64, error) {
  2312  
  2313  	tries := 0
  2314  	for {
  2315  		result, err := s.ChannelStore.UpdateLastViewedAt(channelIds, userID, updateThreads)
  2316  		if err == nil {
  2317  			return result, nil
  2318  		}
  2319  		if !isRepeatableError(err) {
  2320  			return result, err
  2321  		}
  2322  		tries++
  2323  		if tries >= 3 {
  2324  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2325  			return result, err
  2326  		}
  2327  	}
  2328  
  2329  }
  2330  
  2331  func (s *RetryLayerChannelStore) UpdateLastViewedAtPost(unreadPost *model.Post, userID string, mentionCount int, mentionCountRoot int, updateThreads bool, setUnreadCountRoot bool) (*model.ChannelUnreadAt, error) {
  2332  
  2333  	tries := 0
  2334  	for {
  2335  		result, err := s.ChannelStore.UpdateLastViewedAtPost(unreadPost, userID, mentionCount, mentionCountRoot, updateThreads, setUnreadCountRoot)
  2336  		if err == nil {
  2337  			return result, nil
  2338  		}
  2339  		if !isRepeatableError(err) {
  2340  			return result, err
  2341  		}
  2342  		tries++
  2343  		if tries >= 3 {
  2344  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2345  			return result, err
  2346  		}
  2347  	}
  2348  
  2349  }
  2350  
  2351  func (s *RetryLayerChannelStore) UpdateMember(member *model.ChannelMember) (*model.ChannelMember, error) {
  2352  
  2353  	tries := 0
  2354  	for {
  2355  		result, err := s.ChannelStore.UpdateMember(member)
  2356  		if err == nil {
  2357  			return result, nil
  2358  		}
  2359  		if !isRepeatableError(err) {
  2360  			return result, err
  2361  		}
  2362  		tries++
  2363  		if tries >= 3 {
  2364  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2365  			return result, err
  2366  		}
  2367  	}
  2368  
  2369  }
  2370  
  2371  func (s *RetryLayerChannelStore) UpdateMembersRole(channelID string, userIDs []string) error {
  2372  
  2373  	tries := 0
  2374  	for {
  2375  		err := s.ChannelStore.UpdateMembersRole(channelID, userIDs)
  2376  		if err == nil {
  2377  			return nil
  2378  		}
  2379  		if !isRepeatableError(err) {
  2380  			return err
  2381  		}
  2382  		tries++
  2383  		if tries >= 3 {
  2384  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2385  			return err
  2386  		}
  2387  	}
  2388  
  2389  }
  2390  
  2391  func (s *RetryLayerChannelStore) UpdateMultipleMembers(members []*model.ChannelMember) ([]*model.ChannelMember, error) {
  2392  
  2393  	tries := 0
  2394  	for {
  2395  		result, err := s.ChannelStore.UpdateMultipleMembers(members)
  2396  		if err == nil {
  2397  			return result, nil
  2398  		}
  2399  		if !isRepeatableError(err) {
  2400  			return result, err
  2401  		}
  2402  		tries++
  2403  		if tries >= 3 {
  2404  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2405  			return result, err
  2406  		}
  2407  	}
  2408  
  2409  }
  2410  
  2411  func (s *RetryLayerChannelStore) UpdateSidebarCategories(userID string, teamID string, categories []*model.SidebarCategoryWithChannels) ([]*model.SidebarCategoryWithChannels, []*model.SidebarCategoryWithChannels, error) {
  2412  
  2413  	tries := 0
  2414  	for {
  2415  		result, resultVar1, err := s.ChannelStore.UpdateSidebarCategories(userID, teamID, categories)
  2416  		if err == nil {
  2417  			return result, resultVar1, nil
  2418  		}
  2419  		if !isRepeatableError(err) {
  2420  			return result, resultVar1, err
  2421  		}
  2422  		tries++
  2423  		if tries >= 3 {
  2424  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2425  			return result, resultVar1, err
  2426  		}
  2427  	}
  2428  
  2429  }
  2430  
  2431  func (s *RetryLayerChannelStore) UpdateSidebarCategoryOrder(userID string, teamID string, categoryOrder []string) error {
  2432  
  2433  	tries := 0
  2434  	for {
  2435  		err := s.ChannelStore.UpdateSidebarCategoryOrder(userID, teamID, categoryOrder)
  2436  		if err == nil {
  2437  			return nil
  2438  		}
  2439  		if !isRepeatableError(err) {
  2440  			return err
  2441  		}
  2442  		tries++
  2443  		if tries >= 3 {
  2444  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2445  			return err
  2446  		}
  2447  	}
  2448  
  2449  }
  2450  
  2451  func (s *RetryLayerChannelStore) UpdateSidebarChannelCategoryOnMove(channel *model.Channel, newTeamID string) error {
  2452  
  2453  	tries := 0
  2454  	for {
  2455  		err := s.ChannelStore.UpdateSidebarChannelCategoryOnMove(channel, newTeamID)
  2456  		if err == nil {
  2457  			return nil
  2458  		}
  2459  		if !isRepeatableError(err) {
  2460  			return err
  2461  		}
  2462  		tries++
  2463  		if tries >= 3 {
  2464  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2465  			return err
  2466  		}
  2467  	}
  2468  
  2469  }
  2470  
  2471  func (s *RetryLayerChannelStore) UpdateSidebarChannelsByPreferences(preferences *model.Preferences) error {
  2472  
  2473  	tries := 0
  2474  	for {
  2475  		err := s.ChannelStore.UpdateSidebarChannelsByPreferences(preferences)
  2476  		if err == nil {
  2477  			return nil
  2478  		}
  2479  		if !isRepeatableError(err) {
  2480  			return err
  2481  		}
  2482  		tries++
  2483  		if tries >= 3 {
  2484  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2485  			return err
  2486  		}
  2487  	}
  2488  
  2489  }
  2490  
  2491  func (s *RetryLayerChannelStore) UserBelongsToChannels(userID string, channelIds []string) (bool, error) {
  2492  
  2493  	tries := 0
  2494  	for {
  2495  		result, err := s.ChannelStore.UserBelongsToChannels(userID, channelIds)
  2496  		if err == nil {
  2497  			return result, nil
  2498  		}
  2499  		if !isRepeatableError(err) {
  2500  			return result, err
  2501  		}
  2502  		tries++
  2503  		if tries >= 3 {
  2504  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2505  			return result, err
  2506  		}
  2507  	}
  2508  
  2509  }
  2510  
  2511  func (s *RetryLayerChannelMemberHistoryStore) DeleteOrphanedRows(limit int) (int64, error) {
  2512  
  2513  	tries := 0
  2514  	for {
  2515  		result, err := s.ChannelMemberHistoryStore.DeleteOrphanedRows(limit)
  2516  		if err == nil {
  2517  			return result, nil
  2518  		}
  2519  		if !isRepeatableError(err) {
  2520  			return result, err
  2521  		}
  2522  		tries++
  2523  		if tries >= 3 {
  2524  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2525  			return result, err
  2526  		}
  2527  	}
  2528  
  2529  }
  2530  
  2531  func (s *RetryLayerChannelMemberHistoryStore) GetUsersInChannelDuring(startTime int64, endTime int64, channelID string) ([]*model.ChannelMemberHistoryResult, error) {
  2532  
  2533  	tries := 0
  2534  	for {
  2535  		result, err := s.ChannelMemberHistoryStore.GetUsersInChannelDuring(startTime, endTime, channelID)
  2536  		if err == nil {
  2537  			return result, nil
  2538  		}
  2539  		if !isRepeatableError(err) {
  2540  			return result, err
  2541  		}
  2542  		tries++
  2543  		if tries >= 3 {
  2544  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2545  			return result, err
  2546  		}
  2547  	}
  2548  
  2549  }
  2550  
  2551  func (s *RetryLayerChannelMemberHistoryStore) LogJoinEvent(userID string, channelID string, joinTime int64) error {
  2552  
  2553  	tries := 0
  2554  	for {
  2555  		err := s.ChannelMemberHistoryStore.LogJoinEvent(userID, channelID, joinTime)
  2556  		if err == nil {
  2557  			return nil
  2558  		}
  2559  		if !isRepeatableError(err) {
  2560  			return err
  2561  		}
  2562  		tries++
  2563  		if tries >= 3 {
  2564  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2565  			return err
  2566  		}
  2567  	}
  2568  
  2569  }
  2570  
  2571  func (s *RetryLayerChannelMemberHistoryStore) LogLeaveEvent(userID string, channelID string, leaveTime int64) error {
  2572  
  2573  	tries := 0
  2574  	for {
  2575  		err := s.ChannelMemberHistoryStore.LogLeaveEvent(userID, channelID, leaveTime)
  2576  		if err == nil {
  2577  			return nil
  2578  		}
  2579  		if !isRepeatableError(err) {
  2580  			return err
  2581  		}
  2582  		tries++
  2583  		if tries >= 3 {
  2584  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2585  			return err
  2586  		}
  2587  	}
  2588  
  2589  }
  2590  
  2591  func (s *RetryLayerChannelMemberHistoryStore) PermanentDeleteBatch(endTime int64, limit int64) (int64, error) {
  2592  
  2593  	tries := 0
  2594  	for {
  2595  		result, err := s.ChannelMemberHistoryStore.PermanentDeleteBatch(endTime, limit)
  2596  		if err == nil {
  2597  			return result, nil
  2598  		}
  2599  		if !isRepeatableError(err) {
  2600  			return result, err
  2601  		}
  2602  		tries++
  2603  		if tries >= 3 {
  2604  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2605  			return result, err
  2606  		}
  2607  	}
  2608  
  2609  }
  2610  
  2611  func (s *RetryLayerChannelMemberHistoryStore) PermanentDeleteBatchForRetentionPolicies(now int64, globalPolicyEndTime int64, limit int64, cursor model.RetentionPolicyCursor) (int64, model.RetentionPolicyCursor, error) {
  2612  
  2613  	tries := 0
  2614  	for {
  2615  		result, resultVar1, err := s.ChannelMemberHistoryStore.PermanentDeleteBatchForRetentionPolicies(now, globalPolicyEndTime, limit, cursor)
  2616  		if err == nil {
  2617  			return result, resultVar1, nil
  2618  		}
  2619  		if !isRepeatableError(err) {
  2620  			return result, resultVar1, err
  2621  		}
  2622  		tries++
  2623  		if tries >= 3 {
  2624  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2625  			return result, resultVar1, err
  2626  		}
  2627  	}
  2628  
  2629  }
  2630  
  2631  func (s *RetryLayerClusterDiscoveryStore) Cleanup() error {
  2632  
  2633  	tries := 0
  2634  	for {
  2635  		err := s.ClusterDiscoveryStore.Cleanup()
  2636  		if err == nil {
  2637  			return nil
  2638  		}
  2639  		if !isRepeatableError(err) {
  2640  			return err
  2641  		}
  2642  		tries++
  2643  		if tries >= 3 {
  2644  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2645  			return err
  2646  		}
  2647  	}
  2648  
  2649  }
  2650  
  2651  func (s *RetryLayerClusterDiscoveryStore) Delete(discovery *model.ClusterDiscovery) (bool, error) {
  2652  
  2653  	tries := 0
  2654  	for {
  2655  		result, err := s.ClusterDiscoveryStore.Delete(discovery)
  2656  		if err == nil {
  2657  			return result, nil
  2658  		}
  2659  		if !isRepeatableError(err) {
  2660  			return result, err
  2661  		}
  2662  		tries++
  2663  		if tries >= 3 {
  2664  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2665  			return result, err
  2666  		}
  2667  	}
  2668  
  2669  }
  2670  
  2671  func (s *RetryLayerClusterDiscoveryStore) Exists(discovery *model.ClusterDiscovery) (bool, error) {
  2672  
  2673  	tries := 0
  2674  	for {
  2675  		result, err := s.ClusterDiscoveryStore.Exists(discovery)
  2676  		if err == nil {
  2677  			return result, nil
  2678  		}
  2679  		if !isRepeatableError(err) {
  2680  			return result, err
  2681  		}
  2682  		tries++
  2683  		if tries >= 3 {
  2684  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2685  			return result, err
  2686  		}
  2687  	}
  2688  
  2689  }
  2690  
  2691  func (s *RetryLayerClusterDiscoveryStore) GetAll(discoveryType string, clusterName string) ([]*model.ClusterDiscovery, error) {
  2692  
  2693  	tries := 0
  2694  	for {
  2695  		result, err := s.ClusterDiscoveryStore.GetAll(discoveryType, clusterName)
  2696  		if err == nil {
  2697  			return result, nil
  2698  		}
  2699  		if !isRepeatableError(err) {
  2700  			return result, err
  2701  		}
  2702  		tries++
  2703  		if tries >= 3 {
  2704  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2705  			return result, err
  2706  		}
  2707  	}
  2708  
  2709  }
  2710  
  2711  func (s *RetryLayerClusterDiscoveryStore) Save(discovery *model.ClusterDiscovery) error {
  2712  
  2713  	tries := 0
  2714  	for {
  2715  		err := s.ClusterDiscoveryStore.Save(discovery)
  2716  		if err == nil {
  2717  			return nil
  2718  		}
  2719  		if !isRepeatableError(err) {
  2720  			return err
  2721  		}
  2722  		tries++
  2723  		if tries >= 3 {
  2724  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2725  			return err
  2726  		}
  2727  	}
  2728  
  2729  }
  2730  
  2731  func (s *RetryLayerClusterDiscoveryStore) SetLastPingAt(discovery *model.ClusterDiscovery) error {
  2732  
  2733  	tries := 0
  2734  	for {
  2735  		err := s.ClusterDiscoveryStore.SetLastPingAt(discovery)
  2736  		if err == nil {
  2737  			return nil
  2738  		}
  2739  		if !isRepeatableError(err) {
  2740  			return err
  2741  		}
  2742  		tries++
  2743  		if tries >= 3 {
  2744  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2745  			return err
  2746  		}
  2747  	}
  2748  
  2749  }
  2750  
  2751  func (s *RetryLayerCommandStore) AnalyticsCommandCount(teamID string) (int64, error) {
  2752  
  2753  	tries := 0
  2754  	for {
  2755  		result, err := s.CommandStore.AnalyticsCommandCount(teamID)
  2756  		if err == nil {
  2757  			return result, nil
  2758  		}
  2759  		if !isRepeatableError(err) {
  2760  			return result, err
  2761  		}
  2762  		tries++
  2763  		if tries >= 3 {
  2764  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2765  			return result, err
  2766  		}
  2767  	}
  2768  
  2769  }
  2770  
  2771  func (s *RetryLayerCommandStore) Delete(commandID string, time int64) error {
  2772  
  2773  	tries := 0
  2774  	for {
  2775  		err := s.CommandStore.Delete(commandID, time)
  2776  		if err == nil {
  2777  			return nil
  2778  		}
  2779  		if !isRepeatableError(err) {
  2780  			return err
  2781  		}
  2782  		tries++
  2783  		if tries >= 3 {
  2784  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2785  			return err
  2786  		}
  2787  	}
  2788  
  2789  }
  2790  
  2791  func (s *RetryLayerCommandStore) Get(id string) (*model.Command, error) {
  2792  
  2793  	tries := 0
  2794  	for {
  2795  		result, err := s.CommandStore.Get(id)
  2796  		if err == nil {
  2797  			return result, nil
  2798  		}
  2799  		if !isRepeatableError(err) {
  2800  			return result, err
  2801  		}
  2802  		tries++
  2803  		if tries >= 3 {
  2804  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2805  			return result, err
  2806  		}
  2807  	}
  2808  
  2809  }
  2810  
  2811  func (s *RetryLayerCommandStore) GetByTeam(teamID string) ([]*model.Command, error) {
  2812  
  2813  	tries := 0
  2814  	for {
  2815  		result, err := s.CommandStore.GetByTeam(teamID)
  2816  		if err == nil {
  2817  			return result, nil
  2818  		}
  2819  		if !isRepeatableError(err) {
  2820  			return result, err
  2821  		}
  2822  		tries++
  2823  		if tries >= 3 {
  2824  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2825  			return result, err
  2826  		}
  2827  	}
  2828  
  2829  }
  2830  
  2831  func (s *RetryLayerCommandStore) GetByTrigger(teamID string, trigger string) (*model.Command, error) {
  2832  
  2833  	tries := 0
  2834  	for {
  2835  		result, err := s.CommandStore.GetByTrigger(teamID, trigger)
  2836  		if err == nil {
  2837  			return result, nil
  2838  		}
  2839  		if !isRepeatableError(err) {
  2840  			return result, err
  2841  		}
  2842  		tries++
  2843  		if tries >= 3 {
  2844  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2845  			return result, err
  2846  		}
  2847  	}
  2848  
  2849  }
  2850  
  2851  func (s *RetryLayerCommandStore) PermanentDeleteByTeam(teamID string) error {
  2852  
  2853  	tries := 0
  2854  	for {
  2855  		err := s.CommandStore.PermanentDeleteByTeam(teamID)
  2856  		if err == nil {
  2857  			return nil
  2858  		}
  2859  		if !isRepeatableError(err) {
  2860  			return err
  2861  		}
  2862  		tries++
  2863  		if tries >= 3 {
  2864  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2865  			return err
  2866  		}
  2867  	}
  2868  
  2869  }
  2870  
  2871  func (s *RetryLayerCommandStore) PermanentDeleteByUser(userID string) error {
  2872  
  2873  	tries := 0
  2874  	for {
  2875  		err := s.CommandStore.PermanentDeleteByUser(userID)
  2876  		if err == nil {
  2877  			return nil
  2878  		}
  2879  		if !isRepeatableError(err) {
  2880  			return err
  2881  		}
  2882  		tries++
  2883  		if tries >= 3 {
  2884  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2885  			return err
  2886  		}
  2887  	}
  2888  
  2889  }
  2890  
  2891  func (s *RetryLayerCommandStore) Save(webhook *model.Command) (*model.Command, error) {
  2892  
  2893  	tries := 0
  2894  	for {
  2895  		result, err := s.CommandStore.Save(webhook)
  2896  		if err == nil {
  2897  			return result, nil
  2898  		}
  2899  		if !isRepeatableError(err) {
  2900  			return result, err
  2901  		}
  2902  		tries++
  2903  		if tries >= 3 {
  2904  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2905  			return result, err
  2906  		}
  2907  	}
  2908  
  2909  }
  2910  
  2911  func (s *RetryLayerCommandStore) Update(hook *model.Command) (*model.Command, error) {
  2912  
  2913  	tries := 0
  2914  	for {
  2915  		result, err := s.CommandStore.Update(hook)
  2916  		if err == nil {
  2917  			return result, nil
  2918  		}
  2919  		if !isRepeatableError(err) {
  2920  			return result, err
  2921  		}
  2922  		tries++
  2923  		if tries >= 3 {
  2924  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2925  			return result, err
  2926  		}
  2927  	}
  2928  
  2929  }
  2930  
  2931  func (s *RetryLayerCommandWebhookStore) Cleanup() {
  2932  
  2933  	s.CommandWebhookStore.Cleanup()
  2934  
  2935  }
  2936  
  2937  func (s *RetryLayerCommandWebhookStore) Get(id string) (*model.CommandWebhook, error) {
  2938  
  2939  	tries := 0
  2940  	for {
  2941  		result, err := s.CommandWebhookStore.Get(id)
  2942  		if err == nil {
  2943  			return result, nil
  2944  		}
  2945  		if !isRepeatableError(err) {
  2946  			return result, err
  2947  		}
  2948  		tries++
  2949  		if tries >= 3 {
  2950  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2951  			return result, err
  2952  		}
  2953  	}
  2954  
  2955  }
  2956  
  2957  func (s *RetryLayerCommandWebhookStore) Save(webhook *model.CommandWebhook) (*model.CommandWebhook, error) {
  2958  
  2959  	tries := 0
  2960  	for {
  2961  		result, err := s.CommandWebhookStore.Save(webhook)
  2962  		if err == nil {
  2963  			return result, nil
  2964  		}
  2965  		if !isRepeatableError(err) {
  2966  			return result, err
  2967  		}
  2968  		tries++
  2969  		if tries >= 3 {
  2970  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2971  			return result, err
  2972  		}
  2973  	}
  2974  
  2975  }
  2976  
  2977  func (s *RetryLayerCommandWebhookStore) TryUse(id string, limit int) error {
  2978  
  2979  	tries := 0
  2980  	for {
  2981  		err := s.CommandWebhookStore.TryUse(id, limit)
  2982  		if err == nil {
  2983  			return nil
  2984  		}
  2985  		if !isRepeatableError(err) {
  2986  			return err
  2987  		}
  2988  		tries++
  2989  		if tries >= 3 {
  2990  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  2991  			return err
  2992  		}
  2993  	}
  2994  
  2995  }
  2996  
  2997  func (s *RetryLayerComplianceStore) ComplianceExport(compliance *model.Compliance, cursor model.ComplianceExportCursor, limit int) ([]*model.CompliancePost, model.ComplianceExportCursor, error) {
  2998  
  2999  	tries := 0
  3000  	for {
  3001  		result, resultVar1, err := s.ComplianceStore.ComplianceExport(compliance, cursor, limit)
  3002  		if err == nil {
  3003  			return result, resultVar1, nil
  3004  		}
  3005  		if !isRepeatableError(err) {
  3006  			return result, resultVar1, err
  3007  		}
  3008  		tries++
  3009  		if tries >= 3 {
  3010  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3011  			return result, resultVar1, err
  3012  		}
  3013  	}
  3014  
  3015  }
  3016  
  3017  func (s *RetryLayerComplianceStore) Get(id string) (*model.Compliance, error) {
  3018  
  3019  	tries := 0
  3020  	for {
  3021  		result, err := s.ComplianceStore.Get(id)
  3022  		if err == nil {
  3023  			return result, nil
  3024  		}
  3025  		if !isRepeatableError(err) {
  3026  			return result, err
  3027  		}
  3028  		tries++
  3029  		if tries >= 3 {
  3030  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3031  			return result, err
  3032  		}
  3033  	}
  3034  
  3035  }
  3036  
  3037  func (s *RetryLayerComplianceStore) GetAll(offset int, limit int) (model.Compliances, error) {
  3038  
  3039  	tries := 0
  3040  	for {
  3041  		result, err := s.ComplianceStore.GetAll(offset, limit)
  3042  		if err == nil {
  3043  			return result, nil
  3044  		}
  3045  		if !isRepeatableError(err) {
  3046  			return result, err
  3047  		}
  3048  		tries++
  3049  		if tries >= 3 {
  3050  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3051  			return result, err
  3052  		}
  3053  	}
  3054  
  3055  }
  3056  
  3057  func (s *RetryLayerComplianceStore) MessageExport(cursor model.MessageExportCursor, limit int) ([]*model.MessageExport, model.MessageExportCursor, error) {
  3058  
  3059  	tries := 0
  3060  	for {
  3061  		result, resultVar1, err := s.ComplianceStore.MessageExport(cursor, limit)
  3062  		if err == nil {
  3063  			return result, resultVar1, nil
  3064  		}
  3065  		if !isRepeatableError(err) {
  3066  			return result, resultVar1, err
  3067  		}
  3068  		tries++
  3069  		if tries >= 3 {
  3070  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3071  			return result, resultVar1, err
  3072  		}
  3073  	}
  3074  
  3075  }
  3076  
  3077  func (s *RetryLayerComplianceStore) Save(compliance *model.Compliance) (*model.Compliance, error) {
  3078  
  3079  	tries := 0
  3080  	for {
  3081  		result, err := s.ComplianceStore.Save(compliance)
  3082  		if err == nil {
  3083  			return result, nil
  3084  		}
  3085  		if !isRepeatableError(err) {
  3086  			return result, err
  3087  		}
  3088  		tries++
  3089  		if tries >= 3 {
  3090  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3091  			return result, err
  3092  		}
  3093  	}
  3094  
  3095  }
  3096  
  3097  func (s *RetryLayerComplianceStore) Update(compliance *model.Compliance) (*model.Compliance, error) {
  3098  
  3099  	tries := 0
  3100  	for {
  3101  		result, err := s.ComplianceStore.Update(compliance)
  3102  		if err == nil {
  3103  			return result, nil
  3104  		}
  3105  		if !isRepeatableError(err) {
  3106  			return result, err
  3107  		}
  3108  		tries++
  3109  		if tries >= 3 {
  3110  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3111  			return result, err
  3112  		}
  3113  	}
  3114  
  3115  }
  3116  
  3117  func (s *RetryLayerEmojiStore) Delete(emoji *model.Emoji, time int64) error {
  3118  
  3119  	tries := 0
  3120  	for {
  3121  		err := s.EmojiStore.Delete(emoji, time)
  3122  		if err == nil {
  3123  			return nil
  3124  		}
  3125  		if !isRepeatableError(err) {
  3126  			return err
  3127  		}
  3128  		tries++
  3129  		if tries >= 3 {
  3130  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3131  			return err
  3132  		}
  3133  	}
  3134  
  3135  }
  3136  
  3137  func (s *RetryLayerEmojiStore) Get(ctx context.Context, id string, allowFromCache bool) (*model.Emoji, error) {
  3138  
  3139  	tries := 0
  3140  	for {
  3141  		result, err := s.EmojiStore.Get(ctx, id, allowFromCache)
  3142  		if err == nil {
  3143  			return result, nil
  3144  		}
  3145  		if !isRepeatableError(err) {
  3146  			return result, err
  3147  		}
  3148  		tries++
  3149  		if tries >= 3 {
  3150  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3151  			return result, err
  3152  		}
  3153  	}
  3154  
  3155  }
  3156  
  3157  func (s *RetryLayerEmojiStore) GetByName(ctx context.Context, name string, allowFromCache bool) (*model.Emoji, error) {
  3158  
  3159  	tries := 0
  3160  	for {
  3161  		result, err := s.EmojiStore.GetByName(ctx, name, allowFromCache)
  3162  		if err == nil {
  3163  			return result, nil
  3164  		}
  3165  		if !isRepeatableError(err) {
  3166  			return result, err
  3167  		}
  3168  		tries++
  3169  		if tries >= 3 {
  3170  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3171  			return result, err
  3172  		}
  3173  	}
  3174  
  3175  }
  3176  
  3177  func (s *RetryLayerEmojiStore) GetList(offset int, limit int, sort string) ([]*model.Emoji, error) {
  3178  
  3179  	tries := 0
  3180  	for {
  3181  		result, err := s.EmojiStore.GetList(offset, limit, sort)
  3182  		if err == nil {
  3183  			return result, nil
  3184  		}
  3185  		if !isRepeatableError(err) {
  3186  			return result, err
  3187  		}
  3188  		tries++
  3189  		if tries >= 3 {
  3190  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3191  			return result, err
  3192  		}
  3193  	}
  3194  
  3195  }
  3196  
  3197  func (s *RetryLayerEmojiStore) GetMultipleByName(names []string) ([]*model.Emoji, error) {
  3198  
  3199  	tries := 0
  3200  	for {
  3201  		result, err := s.EmojiStore.GetMultipleByName(names)
  3202  		if err == nil {
  3203  			return result, nil
  3204  		}
  3205  		if !isRepeatableError(err) {
  3206  			return result, err
  3207  		}
  3208  		tries++
  3209  		if tries >= 3 {
  3210  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3211  			return result, err
  3212  		}
  3213  	}
  3214  
  3215  }
  3216  
  3217  func (s *RetryLayerEmojiStore) Save(emoji *model.Emoji) (*model.Emoji, error) {
  3218  
  3219  	tries := 0
  3220  	for {
  3221  		result, err := s.EmojiStore.Save(emoji)
  3222  		if err == nil {
  3223  			return result, nil
  3224  		}
  3225  		if !isRepeatableError(err) {
  3226  			return result, err
  3227  		}
  3228  		tries++
  3229  		if tries >= 3 {
  3230  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3231  			return result, err
  3232  		}
  3233  	}
  3234  
  3235  }
  3236  
  3237  func (s *RetryLayerEmojiStore) Search(name string, prefixOnly bool, limit int) ([]*model.Emoji, error) {
  3238  
  3239  	tries := 0
  3240  	for {
  3241  		result, err := s.EmojiStore.Search(name, prefixOnly, limit)
  3242  		if err == nil {
  3243  			return result, nil
  3244  		}
  3245  		if !isRepeatableError(err) {
  3246  			return result, err
  3247  		}
  3248  		tries++
  3249  		if tries >= 3 {
  3250  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3251  			return result, err
  3252  		}
  3253  	}
  3254  
  3255  }
  3256  
  3257  func (s *RetryLayerFileInfoStore) AttachToPost(fileID string, postID string, creatorID string) error {
  3258  
  3259  	tries := 0
  3260  	for {
  3261  		err := s.FileInfoStore.AttachToPost(fileID, postID, creatorID)
  3262  		if err == nil {
  3263  			return nil
  3264  		}
  3265  		if !isRepeatableError(err) {
  3266  			return err
  3267  		}
  3268  		tries++
  3269  		if tries >= 3 {
  3270  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3271  			return err
  3272  		}
  3273  	}
  3274  
  3275  }
  3276  
  3277  func (s *RetryLayerFileInfoStore) ClearCaches() {
  3278  
  3279  	s.FileInfoStore.ClearCaches()
  3280  
  3281  }
  3282  
  3283  func (s *RetryLayerFileInfoStore) CountAll() (int64, error) {
  3284  
  3285  	tries := 0
  3286  	for {
  3287  		result, err := s.FileInfoStore.CountAll()
  3288  		if err == nil {
  3289  			return result, nil
  3290  		}
  3291  		if !isRepeatableError(err) {
  3292  			return result, err
  3293  		}
  3294  		tries++
  3295  		if tries >= 3 {
  3296  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3297  			return result, err
  3298  		}
  3299  	}
  3300  
  3301  }
  3302  
  3303  func (s *RetryLayerFileInfoStore) DeleteForPost(postID string) (string, error) {
  3304  
  3305  	tries := 0
  3306  	for {
  3307  		result, err := s.FileInfoStore.DeleteForPost(postID)
  3308  		if err == nil {
  3309  			return result, nil
  3310  		}
  3311  		if !isRepeatableError(err) {
  3312  			return result, err
  3313  		}
  3314  		tries++
  3315  		if tries >= 3 {
  3316  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3317  			return result, err
  3318  		}
  3319  	}
  3320  
  3321  }
  3322  
  3323  func (s *RetryLayerFileInfoStore) Get(id string) (*model.FileInfo, error) {
  3324  
  3325  	tries := 0
  3326  	for {
  3327  		result, err := s.FileInfoStore.Get(id)
  3328  		if err == nil {
  3329  			return result, nil
  3330  		}
  3331  		if !isRepeatableError(err) {
  3332  			return result, err
  3333  		}
  3334  		tries++
  3335  		if tries >= 3 {
  3336  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3337  			return result, err
  3338  		}
  3339  	}
  3340  
  3341  }
  3342  
  3343  func (s *RetryLayerFileInfoStore) GetByIds(ids []string) ([]*model.FileInfo, error) {
  3344  
  3345  	tries := 0
  3346  	for {
  3347  		result, err := s.FileInfoStore.GetByIds(ids)
  3348  		if err == nil {
  3349  			return result, nil
  3350  		}
  3351  		if !isRepeatableError(err) {
  3352  			return result, err
  3353  		}
  3354  		tries++
  3355  		if tries >= 3 {
  3356  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3357  			return result, err
  3358  		}
  3359  	}
  3360  
  3361  }
  3362  
  3363  func (s *RetryLayerFileInfoStore) GetByPath(path string) (*model.FileInfo, error) {
  3364  
  3365  	tries := 0
  3366  	for {
  3367  		result, err := s.FileInfoStore.GetByPath(path)
  3368  		if err == nil {
  3369  			return result, nil
  3370  		}
  3371  		if !isRepeatableError(err) {
  3372  			return result, err
  3373  		}
  3374  		tries++
  3375  		if tries >= 3 {
  3376  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3377  			return result, err
  3378  		}
  3379  	}
  3380  
  3381  }
  3382  
  3383  func (s *RetryLayerFileInfoStore) GetFilesBatchForIndexing(startTime int64, endTime int64, limit int) ([]*model.FileForIndexing, error) {
  3384  
  3385  	tries := 0
  3386  	for {
  3387  		result, err := s.FileInfoStore.GetFilesBatchForIndexing(startTime, endTime, limit)
  3388  		if err == nil {
  3389  			return result, nil
  3390  		}
  3391  		if !isRepeatableError(err) {
  3392  			return result, err
  3393  		}
  3394  		tries++
  3395  		if tries >= 3 {
  3396  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3397  			return result, err
  3398  		}
  3399  	}
  3400  
  3401  }
  3402  
  3403  func (s *RetryLayerFileInfoStore) GetForPost(postID string, readFromMaster bool, includeDeleted bool, allowFromCache bool) ([]*model.FileInfo, error) {
  3404  
  3405  	tries := 0
  3406  	for {
  3407  		result, err := s.FileInfoStore.GetForPost(postID, readFromMaster, includeDeleted, allowFromCache)
  3408  		if err == nil {
  3409  			return result, nil
  3410  		}
  3411  		if !isRepeatableError(err) {
  3412  			return result, err
  3413  		}
  3414  		tries++
  3415  		if tries >= 3 {
  3416  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3417  			return result, err
  3418  		}
  3419  	}
  3420  
  3421  }
  3422  
  3423  func (s *RetryLayerFileInfoStore) GetForUser(userID string) ([]*model.FileInfo, error) {
  3424  
  3425  	tries := 0
  3426  	for {
  3427  		result, err := s.FileInfoStore.GetForUser(userID)
  3428  		if err == nil {
  3429  			return result, nil
  3430  		}
  3431  		if !isRepeatableError(err) {
  3432  			return result, err
  3433  		}
  3434  		tries++
  3435  		if tries >= 3 {
  3436  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3437  			return result, err
  3438  		}
  3439  	}
  3440  
  3441  }
  3442  
  3443  func (s *RetryLayerFileInfoStore) GetFromMaster(id string) (*model.FileInfo, error) {
  3444  
  3445  	tries := 0
  3446  	for {
  3447  		result, err := s.FileInfoStore.GetFromMaster(id)
  3448  		if err == nil {
  3449  			return result, nil
  3450  		}
  3451  		if !isRepeatableError(err) {
  3452  			return result, err
  3453  		}
  3454  		tries++
  3455  		if tries >= 3 {
  3456  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3457  			return result, err
  3458  		}
  3459  	}
  3460  
  3461  }
  3462  
  3463  func (s *RetryLayerFileInfoStore) GetWithOptions(page int, perPage int, opt *model.GetFileInfosOptions) ([]*model.FileInfo, error) {
  3464  
  3465  	tries := 0
  3466  	for {
  3467  		result, err := s.FileInfoStore.GetWithOptions(page, perPage, opt)
  3468  		if err == nil {
  3469  			return result, nil
  3470  		}
  3471  		if !isRepeatableError(err) {
  3472  			return result, err
  3473  		}
  3474  		tries++
  3475  		if tries >= 3 {
  3476  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3477  			return result, err
  3478  		}
  3479  	}
  3480  
  3481  }
  3482  
  3483  func (s *RetryLayerFileInfoStore) InvalidateFileInfosForPostCache(postID string, deleted bool) {
  3484  
  3485  	s.FileInfoStore.InvalidateFileInfosForPostCache(postID, deleted)
  3486  
  3487  }
  3488  
  3489  func (s *RetryLayerFileInfoStore) PermanentDelete(fileID string) error {
  3490  
  3491  	tries := 0
  3492  	for {
  3493  		err := s.FileInfoStore.PermanentDelete(fileID)
  3494  		if err == nil {
  3495  			return nil
  3496  		}
  3497  		if !isRepeatableError(err) {
  3498  			return err
  3499  		}
  3500  		tries++
  3501  		if tries >= 3 {
  3502  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3503  			return err
  3504  		}
  3505  	}
  3506  
  3507  }
  3508  
  3509  func (s *RetryLayerFileInfoStore) PermanentDeleteBatch(endTime int64, limit int64) (int64, error) {
  3510  
  3511  	tries := 0
  3512  	for {
  3513  		result, err := s.FileInfoStore.PermanentDeleteBatch(endTime, limit)
  3514  		if err == nil {
  3515  			return result, nil
  3516  		}
  3517  		if !isRepeatableError(err) {
  3518  			return result, err
  3519  		}
  3520  		tries++
  3521  		if tries >= 3 {
  3522  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3523  			return result, err
  3524  		}
  3525  	}
  3526  
  3527  }
  3528  
  3529  func (s *RetryLayerFileInfoStore) PermanentDeleteByUser(userID string) (int64, error) {
  3530  
  3531  	tries := 0
  3532  	for {
  3533  		result, err := s.FileInfoStore.PermanentDeleteByUser(userID)
  3534  		if err == nil {
  3535  			return result, nil
  3536  		}
  3537  		if !isRepeatableError(err) {
  3538  			return result, err
  3539  		}
  3540  		tries++
  3541  		if tries >= 3 {
  3542  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3543  			return result, err
  3544  		}
  3545  	}
  3546  
  3547  }
  3548  
  3549  func (s *RetryLayerFileInfoStore) Save(info *model.FileInfo) (*model.FileInfo, error) {
  3550  
  3551  	tries := 0
  3552  	for {
  3553  		result, err := s.FileInfoStore.Save(info)
  3554  		if err == nil {
  3555  			return result, nil
  3556  		}
  3557  		if !isRepeatableError(err) {
  3558  			return result, err
  3559  		}
  3560  		tries++
  3561  		if tries >= 3 {
  3562  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3563  			return result, err
  3564  		}
  3565  	}
  3566  
  3567  }
  3568  
  3569  func (s *RetryLayerFileInfoStore) Search(paramsList []*model.SearchParams, userID string, teamID string, page int, perPage int) (*model.FileInfoList, error) {
  3570  
  3571  	tries := 0
  3572  	for {
  3573  		result, err := s.FileInfoStore.Search(paramsList, userID, teamID, page, perPage)
  3574  		if err == nil {
  3575  			return result, nil
  3576  		}
  3577  		if !isRepeatableError(err) {
  3578  			return result, err
  3579  		}
  3580  		tries++
  3581  		if tries >= 3 {
  3582  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3583  			return result, err
  3584  		}
  3585  	}
  3586  
  3587  }
  3588  
  3589  func (s *RetryLayerFileInfoStore) SetContent(fileID string, content string) error {
  3590  
  3591  	tries := 0
  3592  	for {
  3593  		err := s.FileInfoStore.SetContent(fileID, content)
  3594  		if err == nil {
  3595  			return nil
  3596  		}
  3597  		if !isRepeatableError(err) {
  3598  			return err
  3599  		}
  3600  		tries++
  3601  		if tries >= 3 {
  3602  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3603  			return err
  3604  		}
  3605  	}
  3606  
  3607  }
  3608  
  3609  func (s *RetryLayerFileInfoStore) Upsert(info *model.FileInfo) (*model.FileInfo, error) {
  3610  
  3611  	tries := 0
  3612  	for {
  3613  		result, err := s.FileInfoStore.Upsert(info)
  3614  		if err == nil {
  3615  			return result, nil
  3616  		}
  3617  		if !isRepeatableError(err) {
  3618  			return result, err
  3619  		}
  3620  		tries++
  3621  		if tries >= 3 {
  3622  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3623  			return result, err
  3624  		}
  3625  	}
  3626  
  3627  }
  3628  
  3629  func (s *RetryLayerGroupStore) AdminRoleGroupsForSyncableMember(userID string, syncableID string, syncableType model.GroupSyncableType) ([]string, error) {
  3630  
  3631  	tries := 0
  3632  	for {
  3633  		result, err := s.GroupStore.AdminRoleGroupsForSyncableMember(userID, syncableID, syncableType)
  3634  		if err == nil {
  3635  			return result, nil
  3636  		}
  3637  		if !isRepeatableError(err) {
  3638  			return result, err
  3639  		}
  3640  		tries++
  3641  		if tries >= 3 {
  3642  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3643  			return result, err
  3644  		}
  3645  	}
  3646  
  3647  }
  3648  
  3649  func (s *RetryLayerGroupStore) ChannelMembersMinusGroupMembers(channelID string, groupIDs []string, page int, perPage int) ([]*model.UserWithGroups, error) {
  3650  
  3651  	tries := 0
  3652  	for {
  3653  		result, err := s.GroupStore.ChannelMembersMinusGroupMembers(channelID, groupIDs, page, perPage)
  3654  		if err == nil {
  3655  			return result, nil
  3656  		}
  3657  		if !isRepeatableError(err) {
  3658  			return result, err
  3659  		}
  3660  		tries++
  3661  		if tries >= 3 {
  3662  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3663  			return result, err
  3664  		}
  3665  	}
  3666  
  3667  }
  3668  
  3669  func (s *RetryLayerGroupStore) ChannelMembersToAdd(since int64, channelID *string, includeRemovedMembers bool) ([]*model.UserChannelIDPair, error) {
  3670  
  3671  	tries := 0
  3672  	for {
  3673  		result, err := s.GroupStore.ChannelMembersToAdd(since, channelID, includeRemovedMembers)
  3674  		if err == nil {
  3675  			return result, nil
  3676  		}
  3677  		if !isRepeatableError(err) {
  3678  			return result, err
  3679  		}
  3680  		tries++
  3681  		if tries >= 3 {
  3682  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3683  			return result, err
  3684  		}
  3685  	}
  3686  
  3687  }
  3688  
  3689  func (s *RetryLayerGroupStore) ChannelMembersToRemove(channelID *string) ([]*model.ChannelMember, error) {
  3690  
  3691  	tries := 0
  3692  	for {
  3693  		result, err := s.GroupStore.ChannelMembersToRemove(channelID)
  3694  		if err == nil {
  3695  			return result, nil
  3696  		}
  3697  		if !isRepeatableError(err) {
  3698  			return result, err
  3699  		}
  3700  		tries++
  3701  		if tries >= 3 {
  3702  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3703  			return result, err
  3704  		}
  3705  	}
  3706  
  3707  }
  3708  
  3709  func (s *RetryLayerGroupStore) CountChannelMembersMinusGroupMembers(channelID string, groupIDs []string) (int64, error) {
  3710  
  3711  	tries := 0
  3712  	for {
  3713  		result, err := s.GroupStore.CountChannelMembersMinusGroupMembers(channelID, groupIDs)
  3714  		if err == nil {
  3715  			return result, nil
  3716  		}
  3717  		if !isRepeatableError(err) {
  3718  			return result, err
  3719  		}
  3720  		tries++
  3721  		if tries >= 3 {
  3722  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3723  			return result, err
  3724  		}
  3725  	}
  3726  
  3727  }
  3728  
  3729  func (s *RetryLayerGroupStore) CountGroupsByChannel(channelID string, opts model.GroupSearchOpts) (int64, error) {
  3730  
  3731  	tries := 0
  3732  	for {
  3733  		result, err := s.GroupStore.CountGroupsByChannel(channelID, opts)
  3734  		if err == nil {
  3735  			return result, nil
  3736  		}
  3737  		if !isRepeatableError(err) {
  3738  			return result, err
  3739  		}
  3740  		tries++
  3741  		if tries >= 3 {
  3742  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3743  			return result, err
  3744  		}
  3745  	}
  3746  
  3747  }
  3748  
  3749  func (s *RetryLayerGroupStore) CountGroupsByTeam(teamID string, opts model.GroupSearchOpts) (int64, error) {
  3750  
  3751  	tries := 0
  3752  	for {
  3753  		result, err := s.GroupStore.CountGroupsByTeam(teamID, opts)
  3754  		if err == nil {
  3755  			return result, nil
  3756  		}
  3757  		if !isRepeatableError(err) {
  3758  			return result, err
  3759  		}
  3760  		tries++
  3761  		if tries >= 3 {
  3762  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3763  			return result, err
  3764  		}
  3765  	}
  3766  
  3767  }
  3768  
  3769  func (s *RetryLayerGroupStore) CountTeamMembersMinusGroupMembers(teamID string, groupIDs []string) (int64, error) {
  3770  
  3771  	tries := 0
  3772  	for {
  3773  		result, err := s.GroupStore.CountTeamMembersMinusGroupMembers(teamID, groupIDs)
  3774  		if err == nil {
  3775  			return result, nil
  3776  		}
  3777  		if !isRepeatableError(err) {
  3778  			return result, err
  3779  		}
  3780  		tries++
  3781  		if tries >= 3 {
  3782  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3783  			return result, err
  3784  		}
  3785  	}
  3786  
  3787  }
  3788  
  3789  func (s *RetryLayerGroupStore) Create(group *model.Group) (*model.Group, error) {
  3790  
  3791  	tries := 0
  3792  	for {
  3793  		result, err := s.GroupStore.Create(group)
  3794  		if err == nil {
  3795  			return result, nil
  3796  		}
  3797  		if !isRepeatableError(err) {
  3798  			return result, err
  3799  		}
  3800  		tries++
  3801  		if tries >= 3 {
  3802  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3803  			return result, err
  3804  		}
  3805  	}
  3806  
  3807  }
  3808  
  3809  func (s *RetryLayerGroupStore) CreateGroupSyncable(groupSyncable *model.GroupSyncable) (*model.GroupSyncable, error) {
  3810  
  3811  	tries := 0
  3812  	for {
  3813  		result, err := s.GroupStore.CreateGroupSyncable(groupSyncable)
  3814  		if err == nil {
  3815  			return result, nil
  3816  		}
  3817  		if !isRepeatableError(err) {
  3818  			return result, err
  3819  		}
  3820  		tries++
  3821  		if tries >= 3 {
  3822  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3823  			return result, err
  3824  		}
  3825  	}
  3826  
  3827  }
  3828  
  3829  func (s *RetryLayerGroupStore) Delete(groupID string) (*model.Group, error) {
  3830  
  3831  	tries := 0
  3832  	for {
  3833  		result, err := s.GroupStore.Delete(groupID)
  3834  		if err == nil {
  3835  			return result, nil
  3836  		}
  3837  		if !isRepeatableError(err) {
  3838  			return result, err
  3839  		}
  3840  		tries++
  3841  		if tries >= 3 {
  3842  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3843  			return result, err
  3844  		}
  3845  	}
  3846  
  3847  }
  3848  
  3849  func (s *RetryLayerGroupStore) DeleteGroupSyncable(groupID string, syncableID string, syncableType model.GroupSyncableType) (*model.GroupSyncable, error) {
  3850  
  3851  	tries := 0
  3852  	for {
  3853  		result, err := s.GroupStore.DeleteGroupSyncable(groupID, syncableID, syncableType)
  3854  		if err == nil {
  3855  			return result, nil
  3856  		}
  3857  		if !isRepeatableError(err) {
  3858  			return result, err
  3859  		}
  3860  		tries++
  3861  		if tries >= 3 {
  3862  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3863  			return result, err
  3864  		}
  3865  	}
  3866  
  3867  }
  3868  
  3869  func (s *RetryLayerGroupStore) DeleteMember(groupID string, userID string) (*model.GroupMember, error) {
  3870  
  3871  	tries := 0
  3872  	for {
  3873  		result, err := s.GroupStore.DeleteMember(groupID, userID)
  3874  		if err == nil {
  3875  			return result, nil
  3876  		}
  3877  		if !isRepeatableError(err) {
  3878  			return result, err
  3879  		}
  3880  		tries++
  3881  		if tries >= 3 {
  3882  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3883  			return result, err
  3884  		}
  3885  	}
  3886  
  3887  }
  3888  
  3889  func (s *RetryLayerGroupStore) DistinctGroupMemberCount() (int64, error) {
  3890  
  3891  	tries := 0
  3892  	for {
  3893  		result, err := s.GroupStore.DistinctGroupMemberCount()
  3894  		if err == nil {
  3895  			return result, nil
  3896  		}
  3897  		if !isRepeatableError(err) {
  3898  			return result, err
  3899  		}
  3900  		tries++
  3901  		if tries >= 3 {
  3902  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3903  			return result, err
  3904  		}
  3905  	}
  3906  
  3907  }
  3908  
  3909  func (s *RetryLayerGroupStore) Get(groupID string) (*model.Group, error) {
  3910  
  3911  	tries := 0
  3912  	for {
  3913  		result, err := s.GroupStore.Get(groupID)
  3914  		if err == nil {
  3915  			return result, nil
  3916  		}
  3917  		if !isRepeatableError(err) {
  3918  			return result, err
  3919  		}
  3920  		tries++
  3921  		if tries >= 3 {
  3922  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3923  			return result, err
  3924  		}
  3925  	}
  3926  
  3927  }
  3928  
  3929  func (s *RetryLayerGroupStore) GetAllBySource(groupSource model.GroupSource) ([]*model.Group, error) {
  3930  
  3931  	tries := 0
  3932  	for {
  3933  		result, err := s.GroupStore.GetAllBySource(groupSource)
  3934  		if err == nil {
  3935  			return result, nil
  3936  		}
  3937  		if !isRepeatableError(err) {
  3938  			return result, err
  3939  		}
  3940  		tries++
  3941  		if tries >= 3 {
  3942  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3943  			return result, err
  3944  		}
  3945  	}
  3946  
  3947  }
  3948  
  3949  func (s *RetryLayerGroupStore) GetAllGroupSyncablesByGroupId(groupID string, syncableType model.GroupSyncableType) ([]*model.GroupSyncable, error) {
  3950  
  3951  	tries := 0
  3952  	for {
  3953  		result, err := s.GroupStore.GetAllGroupSyncablesByGroupId(groupID, syncableType)
  3954  		if err == nil {
  3955  			return result, nil
  3956  		}
  3957  		if !isRepeatableError(err) {
  3958  			return result, err
  3959  		}
  3960  		tries++
  3961  		if tries >= 3 {
  3962  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3963  			return result, err
  3964  		}
  3965  	}
  3966  
  3967  }
  3968  
  3969  func (s *RetryLayerGroupStore) GetByIDs(groupIDs []string) ([]*model.Group, error) {
  3970  
  3971  	tries := 0
  3972  	for {
  3973  		result, err := s.GroupStore.GetByIDs(groupIDs)
  3974  		if err == nil {
  3975  			return result, nil
  3976  		}
  3977  		if !isRepeatableError(err) {
  3978  			return result, err
  3979  		}
  3980  		tries++
  3981  		if tries >= 3 {
  3982  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  3983  			return result, err
  3984  		}
  3985  	}
  3986  
  3987  }
  3988  
  3989  func (s *RetryLayerGroupStore) GetByName(name string, opts model.GroupSearchOpts) (*model.Group, error) {
  3990  
  3991  	tries := 0
  3992  	for {
  3993  		result, err := s.GroupStore.GetByName(name, opts)
  3994  		if err == nil {
  3995  			return result, nil
  3996  		}
  3997  		if !isRepeatableError(err) {
  3998  			return result, err
  3999  		}
  4000  		tries++
  4001  		if tries >= 3 {
  4002  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4003  			return result, err
  4004  		}
  4005  	}
  4006  
  4007  }
  4008  
  4009  func (s *RetryLayerGroupStore) GetByRemoteID(remoteID string, groupSource model.GroupSource) (*model.Group, error) {
  4010  
  4011  	tries := 0
  4012  	for {
  4013  		result, err := s.GroupStore.GetByRemoteID(remoteID, groupSource)
  4014  		if err == nil {
  4015  			return result, nil
  4016  		}
  4017  		if !isRepeatableError(err) {
  4018  			return result, err
  4019  		}
  4020  		tries++
  4021  		if tries >= 3 {
  4022  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4023  			return result, err
  4024  		}
  4025  	}
  4026  
  4027  }
  4028  
  4029  func (s *RetryLayerGroupStore) GetByUser(userID string) ([]*model.Group, error) {
  4030  
  4031  	tries := 0
  4032  	for {
  4033  		result, err := s.GroupStore.GetByUser(userID)
  4034  		if err == nil {
  4035  			return result, nil
  4036  		}
  4037  		if !isRepeatableError(err) {
  4038  			return result, err
  4039  		}
  4040  		tries++
  4041  		if tries >= 3 {
  4042  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4043  			return result, err
  4044  		}
  4045  	}
  4046  
  4047  }
  4048  
  4049  func (s *RetryLayerGroupStore) GetGroupSyncable(groupID string, syncableID string, syncableType model.GroupSyncableType) (*model.GroupSyncable, error) {
  4050  
  4051  	tries := 0
  4052  	for {
  4053  		result, err := s.GroupStore.GetGroupSyncable(groupID, syncableID, syncableType)
  4054  		if err == nil {
  4055  			return result, nil
  4056  		}
  4057  		if !isRepeatableError(err) {
  4058  			return result, err
  4059  		}
  4060  		tries++
  4061  		if tries >= 3 {
  4062  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4063  			return result, err
  4064  		}
  4065  	}
  4066  
  4067  }
  4068  
  4069  func (s *RetryLayerGroupStore) GetGroups(page int, perPage int, opts model.GroupSearchOpts) ([]*model.Group, error) {
  4070  
  4071  	tries := 0
  4072  	for {
  4073  		result, err := s.GroupStore.GetGroups(page, perPage, opts)
  4074  		if err == nil {
  4075  			return result, nil
  4076  		}
  4077  		if !isRepeatableError(err) {
  4078  			return result, err
  4079  		}
  4080  		tries++
  4081  		if tries >= 3 {
  4082  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4083  			return result, err
  4084  		}
  4085  	}
  4086  
  4087  }
  4088  
  4089  func (s *RetryLayerGroupStore) GetGroupsAssociatedToChannelsByTeam(teamID string, opts model.GroupSearchOpts) (map[string][]*model.GroupWithSchemeAdmin, error) {
  4090  
  4091  	tries := 0
  4092  	for {
  4093  		result, err := s.GroupStore.GetGroupsAssociatedToChannelsByTeam(teamID, opts)
  4094  		if err == nil {
  4095  			return result, nil
  4096  		}
  4097  		if !isRepeatableError(err) {
  4098  			return result, err
  4099  		}
  4100  		tries++
  4101  		if tries >= 3 {
  4102  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4103  			return result, err
  4104  		}
  4105  	}
  4106  
  4107  }
  4108  
  4109  func (s *RetryLayerGroupStore) GetGroupsByChannel(channelID string, opts model.GroupSearchOpts) ([]*model.GroupWithSchemeAdmin, error) {
  4110  
  4111  	tries := 0
  4112  	for {
  4113  		result, err := s.GroupStore.GetGroupsByChannel(channelID, opts)
  4114  		if err == nil {
  4115  			return result, nil
  4116  		}
  4117  		if !isRepeatableError(err) {
  4118  			return result, err
  4119  		}
  4120  		tries++
  4121  		if tries >= 3 {
  4122  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4123  			return result, err
  4124  		}
  4125  	}
  4126  
  4127  }
  4128  
  4129  func (s *RetryLayerGroupStore) GetGroupsByTeam(teamID string, opts model.GroupSearchOpts) ([]*model.GroupWithSchemeAdmin, error) {
  4130  
  4131  	tries := 0
  4132  	for {
  4133  		result, err := s.GroupStore.GetGroupsByTeam(teamID, opts)
  4134  		if err == nil {
  4135  			return result, nil
  4136  		}
  4137  		if !isRepeatableError(err) {
  4138  			return result, err
  4139  		}
  4140  		tries++
  4141  		if tries >= 3 {
  4142  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4143  			return result, err
  4144  		}
  4145  	}
  4146  
  4147  }
  4148  
  4149  func (s *RetryLayerGroupStore) GetMemberCount(groupID string) (int64, error) {
  4150  
  4151  	tries := 0
  4152  	for {
  4153  		result, err := s.GroupStore.GetMemberCount(groupID)
  4154  		if err == nil {
  4155  			return result, nil
  4156  		}
  4157  		if !isRepeatableError(err) {
  4158  			return result, err
  4159  		}
  4160  		tries++
  4161  		if tries >= 3 {
  4162  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4163  			return result, err
  4164  		}
  4165  	}
  4166  
  4167  }
  4168  
  4169  func (s *RetryLayerGroupStore) GetMemberUsers(groupID string) ([]*model.User, error) {
  4170  
  4171  	tries := 0
  4172  	for {
  4173  		result, err := s.GroupStore.GetMemberUsers(groupID)
  4174  		if err == nil {
  4175  			return result, nil
  4176  		}
  4177  		if !isRepeatableError(err) {
  4178  			return result, err
  4179  		}
  4180  		tries++
  4181  		if tries >= 3 {
  4182  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4183  			return result, err
  4184  		}
  4185  	}
  4186  
  4187  }
  4188  
  4189  func (s *RetryLayerGroupStore) GetMemberUsersInTeam(groupID string, teamID string) ([]*model.User, error) {
  4190  
  4191  	tries := 0
  4192  	for {
  4193  		result, err := s.GroupStore.GetMemberUsersInTeam(groupID, teamID)
  4194  		if err == nil {
  4195  			return result, nil
  4196  		}
  4197  		if !isRepeatableError(err) {
  4198  			return result, err
  4199  		}
  4200  		tries++
  4201  		if tries >= 3 {
  4202  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4203  			return result, err
  4204  		}
  4205  	}
  4206  
  4207  }
  4208  
  4209  func (s *RetryLayerGroupStore) GetMemberUsersNotInChannel(groupID string, channelID string) ([]*model.User, error) {
  4210  
  4211  	tries := 0
  4212  	for {
  4213  		result, err := s.GroupStore.GetMemberUsersNotInChannel(groupID, channelID)
  4214  		if err == nil {
  4215  			return result, nil
  4216  		}
  4217  		if !isRepeatableError(err) {
  4218  			return result, err
  4219  		}
  4220  		tries++
  4221  		if tries >= 3 {
  4222  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4223  			return result, err
  4224  		}
  4225  	}
  4226  
  4227  }
  4228  
  4229  func (s *RetryLayerGroupStore) GetMemberUsersPage(groupID string, page int, perPage int) ([]*model.User, error) {
  4230  
  4231  	tries := 0
  4232  	for {
  4233  		result, err := s.GroupStore.GetMemberUsersPage(groupID, page, perPage)
  4234  		if err == nil {
  4235  			return result, nil
  4236  		}
  4237  		if !isRepeatableError(err) {
  4238  			return result, err
  4239  		}
  4240  		tries++
  4241  		if tries >= 3 {
  4242  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4243  			return result, err
  4244  		}
  4245  	}
  4246  
  4247  }
  4248  
  4249  func (s *RetryLayerGroupStore) GroupChannelCount() (int64, error) {
  4250  
  4251  	tries := 0
  4252  	for {
  4253  		result, err := s.GroupStore.GroupChannelCount()
  4254  		if err == nil {
  4255  			return result, nil
  4256  		}
  4257  		if !isRepeatableError(err) {
  4258  			return result, err
  4259  		}
  4260  		tries++
  4261  		if tries >= 3 {
  4262  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4263  			return result, err
  4264  		}
  4265  	}
  4266  
  4267  }
  4268  
  4269  func (s *RetryLayerGroupStore) GroupCount() (int64, error) {
  4270  
  4271  	tries := 0
  4272  	for {
  4273  		result, err := s.GroupStore.GroupCount()
  4274  		if err == nil {
  4275  			return result, nil
  4276  		}
  4277  		if !isRepeatableError(err) {
  4278  			return result, err
  4279  		}
  4280  		tries++
  4281  		if tries >= 3 {
  4282  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4283  			return result, err
  4284  		}
  4285  	}
  4286  
  4287  }
  4288  
  4289  func (s *RetryLayerGroupStore) GroupCountWithAllowReference() (int64, error) {
  4290  
  4291  	tries := 0
  4292  	for {
  4293  		result, err := s.GroupStore.GroupCountWithAllowReference()
  4294  		if err == nil {
  4295  			return result, nil
  4296  		}
  4297  		if !isRepeatableError(err) {
  4298  			return result, err
  4299  		}
  4300  		tries++
  4301  		if tries >= 3 {
  4302  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4303  			return result, err
  4304  		}
  4305  	}
  4306  
  4307  }
  4308  
  4309  func (s *RetryLayerGroupStore) GroupMemberCount() (int64, error) {
  4310  
  4311  	tries := 0
  4312  	for {
  4313  		result, err := s.GroupStore.GroupMemberCount()
  4314  		if err == nil {
  4315  			return result, nil
  4316  		}
  4317  		if !isRepeatableError(err) {
  4318  			return result, err
  4319  		}
  4320  		tries++
  4321  		if tries >= 3 {
  4322  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4323  			return result, err
  4324  		}
  4325  	}
  4326  
  4327  }
  4328  
  4329  func (s *RetryLayerGroupStore) GroupTeamCount() (int64, error) {
  4330  
  4331  	tries := 0
  4332  	for {
  4333  		result, err := s.GroupStore.GroupTeamCount()
  4334  		if err == nil {
  4335  			return result, nil
  4336  		}
  4337  		if !isRepeatableError(err) {
  4338  			return result, err
  4339  		}
  4340  		tries++
  4341  		if tries >= 3 {
  4342  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4343  			return result, err
  4344  		}
  4345  	}
  4346  
  4347  }
  4348  
  4349  func (s *RetryLayerGroupStore) PermanentDeleteMembersByUser(userID string) error {
  4350  
  4351  	tries := 0
  4352  	for {
  4353  		err := s.GroupStore.PermanentDeleteMembersByUser(userID)
  4354  		if err == nil {
  4355  			return nil
  4356  		}
  4357  		if !isRepeatableError(err) {
  4358  			return err
  4359  		}
  4360  		tries++
  4361  		if tries >= 3 {
  4362  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4363  			return err
  4364  		}
  4365  	}
  4366  
  4367  }
  4368  
  4369  func (s *RetryLayerGroupStore) PermittedSyncableAdmins(syncableID string, syncableType model.GroupSyncableType) ([]string, error) {
  4370  
  4371  	tries := 0
  4372  	for {
  4373  		result, err := s.GroupStore.PermittedSyncableAdmins(syncableID, syncableType)
  4374  		if err == nil {
  4375  			return result, nil
  4376  		}
  4377  		if !isRepeatableError(err) {
  4378  			return result, err
  4379  		}
  4380  		tries++
  4381  		if tries >= 3 {
  4382  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4383  			return result, err
  4384  		}
  4385  	}
  4386  
  4387  }
  4388  
  4389  func (s *RetryLayerGroupStore) TeamMembersMinusGroupMembers(teamID string, groupIDs []string, page int, perPage int) ([]*model.UserWithGroups, error) {
  4390  
  4391  	tries := 0
  4392  	for {
  4393  		result, err := s.GroupStore.TeamMembersMinusGroupMembers(teamID, groupIDs, page, perPage)
  4394  		if err == nil {
  4395  			return result, nil
  4396  		}
  4397  		if !isRepeatableError(err) {
  4398  			return result, err
  4399  		}
  4400  		tries++
  4401  		if tries >= 3 {
  4402  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4403  			return result, err
  4404  		}
  4405  	}
  4406  
  4407  }
  4408  
  4409  func (s *RetryLayerGroupStore) TeamMembersToAdd(since int64, teamID *string, includeRemovedMembers bool) ([]*model.UserTeamIDPair, error) {
  4410  
  4411  	tries := 0
  4412  	for {
  4413  		result, err := s.GroupStore.TeamMembersToAdd(since, teamID, includeRemovedMembers)
  4414  		if err == nil {
  4415  			return result, nil
  4416  		}
  4417  		if !isRepeatableError(err) {
  4418  			return result, err
  4419  		}
  4420  		tries++
  4421  		if tries >= 3 {
  4422  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4423  			return result, err
  4424  		}
  4425  	}
  4426  
  4427  }
  4428  
  4429  func (s *RetryLayerGroupStore) TeamMembersToRemove(teamID *string) ([]*model.TeamMember, error) {
  4430  
  4431  	tries := 0
  4432  	for {
  4433  		result, err := s.GroupStore.TeamMembersToRemove(teamID)
  4434  		if err == nil {
  4435  			return result, nil
  4436  		}
  4437  		if !isRepeatableError(err) {
  4438  			return result, err
  4439  		}
  4440  		tries++
  4441  		if tries >= 3 {
  4442  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4443  			return result, err
  4444  		}
  4445  	}
  4446  
  4447  }
  4448  
  4449  func (s *RetryLayerGroupStore) Update(group *model.Group) (*model.Group, error) {
  4450  
  4451  	tries := 0
  4452  	for {
  4453  		result, err := s.GroupStore.Update(group)
  4454  		if err == nil {
  4455  			return result, nil
  4456  		}
  4457  		if !isRepeatableError(err) {
  4458  			return result, err
  4459  		}
  4460  		tries++
  4461  		if tries >= 3 {
  4462  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4463  			return result, err
  4464  		}
  4465  	}
  4466  
  4467  }
  4468  
  4469  func (s *RetryLayerGroupStore) UpdateGroupSyncable(groupSyncable *model.GroupSyncable) (*model.GroupSyncable, error) {
  4470  
  4471  	tries := 0
  4472  	for {
  4473  		result, err := s.GroupStore.UpdateGroupSyncable(groupSyncable)
  4474  		if err == nil {
  4475  			return result, nil
  4476  		}
  4477  		if !isRepeatableError(err) {
  4478  			return result, err
  4479  		}
  4480  		tries++
  4481  		if tries >= 3 {
  4482  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4483  			return result, err
  4484  		}
  4485  	}
  4486  
  4487  }
  4488  
  4489  func (s *RetryLayerGroupStore) UpsertMember(groupID string, userID string) (*model.GroupMember, error) {
  4490  
  4491  	tries := 0
  4492  	for {
  4493  		result, err := s.GroupStore.UpsertMember(groupID, userID)
  4494  		if err == nil {
  4495  			return result, nil
  4496  		}
  4497  		if !isRepeatableError(err) {
  4498  			return result, err
  4499  		}
  4500  		tries++
  4501  		if tries >= 3 {
  4502  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4503  			return result, err
  4504  		}
  4505  	}
  4506  
  4507  }
  4508  
  4509  func (s *RetryLayerJobStore) Delete(id string) (string, error) {
  4510  
  4511  	tries := 0
  4512  	for {
  4513  		result, err := s.JobStore.Delete(id)
  4514  		if err == nil {
  4515  			return result, nil
  4516  		}
  4517  		if !isRepeatableError(err) {
  4518  			return result, err
  4519  		}
  4520  		tries++
  4521  		if tries >= 3 {
  4522  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4523  			return result, err
  4524  		}
  4525  	}
  4526  
  4527  }
  4528  
  4529  func (s *RetryLayerJobStore) Get(id string) (*model.Job, error) {
  4530  
  4531  	tries := 0
  4532  	for {
  4533  		result, err := s.JobStore.Get(id)
  4534  		if err == nil {
  4535  			return result, nil
  4536  		}
  4537  		if !isRepeatableError(err) {
  4538  			return result, err
  4539  		}
  4540  		tries++
  4541  		if tries >= 3 {
  4542  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4543  			return result, err
  4544  		}
  4545  	}
  4546  
  4547  }
  4548  
  4549  func (s *RetryLayerJobStore) GetAllByStatus(status string) ([]*model.Job, error) {
  4550  
  4551  	tries := 0
  4552  	for {
  4553  		result, err := s.JobStore.GetAllByStatus(status)
  4554  		if err == nil {
  4555  			return result, nil
  4556  		}
  4557  		if !isRepeatableError(err) {
  4558  			return result, err
  4559  		}
  4560  		tries++
  4561  		if tries >= 3 {
  4562  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4563  			return result, err
  4564  		}
  4565  	}
  4566  
  4567  }
  4568  
  4569  func (s *RetryLayerJobStore) GetAllByType(jobType string) ([]*model.Job, error) {
  4570  
  4571  	tries := 0
  4572  	for {
  4573  		result, err := s.JobStore.GetAllByType(jobType)
  4574  		if err == nil {
  4575  			return result, nil
  4576  		}
  4577  		if !isRepeatableError(err) {
  4578  			return result, err
  4579  		}
  4580  		tries++
  4581  		if tries >= 3 {
  4582  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4583  			return result, err
  4584  		}
  4585  	}
  4586  
  4587  }
  4588  
  4589  func (s *RetryLayerJobStore) GetAllByTypePage(jobType string, offset int, limit int) ([]*model.Job, error) {
  4590  
  4591  	tries := 0
  4592  	for {
  4593  		result, err := s.JobStore.GetAllByTypePage(jobType, offset, limit)
  4594  		if err == nil {
  4595  			return result, nil
  4596  		}
  4597  		if !isRepeatableError(err) {
  4598  			return result, err
  4599  		}
  4600  		tries++
  4601  		if tries >= 3 {
  4602  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4603  			return result, err
  4604  		}
  4605  	}
  4606  
  4607  }
  4608  
  4609  func (s *RetryLayerJobStore) GetAllByTypesPage(jobTypes []string, offset int, limit int) ([]*model.Job, error) {
  4610  
  4611  	tries := 0
  4612  	for {
  4613  		result, err := s.JobStore.GetAllByTypesPage(jobTypes, offset, limit)
  4614  		if err == nil {
  4615  			return result, nil
  4616  		}
  4617  		if !isRepeatableError(err) {
  4618  			return result, err
  4619  		}
  4620  		tries++
  4621  		if tries >= 3 {
  4622  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4623  			return result, err
  4624  		}
  4625  	}
  4626  
  4627  }
  4628  
  4629  func (s *RetryLayerJobStore) GetAllPage(offset int, limit int) ([]*model.Job, error) {
  4630  
  4631  	tries := 0
  4632  	for {
  4633  		result, err := s.JobStore.GetAllPage(offset, limit)
  4634  		if err == nil {
  4635  			return result, nil
  4636  		}
  4637  		if !isRepeatableError(err) {
  4638  			return result, err
  4639  		}
  4640  		tries++
  4641  		if tries >= 3 {
  4642  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4643  			return result, err
  4644  		}
  4645  	}
  4646  
  4647  }
  4648  
  4649  func (s *RetryLayerJobStore) GetCountByStatusAndType(status string, jobType string) (int64, error) {
  4650  
  4651  	tries := 0
  4652  	for {
  4653  		result, err := s.JobStore.GetCountByStatusAndType(status, jobType)
  4654  		if err == nil {
  4655  			return result, nil
  4656  		}
  4657  		if !isRepeatableError(err) {
  4658  			return result, err
  4659  		}
  4660  		tries++
  4661  		if tries >= 3 {
  4662  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4663  			return result, err
  4664  		}
  4665  	}
  4666  
  4667  }
  4668  
  4669  func (s *RetryLayerJobStore) GetNewestJobByStatusAndType(status string, jobType string) (*model.Job, error) {
  4670  
  4671  	tries := 0
  4672  	for {
  4673  		result, err := s.JobStore.GetNewestJobByStatusAndType(status, jobType)
  4674  		if err == nil {
  4675  			return result, nil
  4676  		}
  4677  		if !isRepeatableError(err) {
  4678  			return result, err
  4679  		}
  4680  		tries++
  4681  		if tries >= 3 {
  4682  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4683  			return result, err
  4684  		}
  4685  	}
  4686  
  4687  }
  4688  
  4689  func (s *RetryLayerJobStore) GetNewestJobByStatusesAndType(statuses []string, jobType string) (*model.Job, error) {
  4690  
  4691  	tries := 0
  4692  	for {
  4693  		result, err := s.JobStore.GetNewestJobByStatusesAndType(statuses, jobType)
  4694  		if err == nil {
  4695  			return result, nil
  4696  		}
  4697  		if !isRepeatableError(err) {
  4698  			return result, err
  4699  		}
  4700  		tries++
  4701  		if tries >= 3 {
  4702  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4703  			return result, err
  4704  		}
  4705  	}
  4706  
  4707  }
  4708  
  4709  func (s *RetryLayerJobStore) Save(job *model.Job) (*model.Job, error) {
  4710  
  4711  	tries := 0
  4712  	for {
  4713  		result, err := s.JobStore.Save(job)
  4714  		if err == nil {
  4715  			return result, nil
  4716  		}
  4717  		if !isRepeatableError(err) {
  4718  			return result, err
  4719  		}
  4720  		tries++
  4721  		if tries >= 3 {
  4722  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4723  			return result, err
  4724  		}
  4725  	}
  4726  
  4727  }
  4728  
  4729  func (s *RetryLayerJobStore) UpdateOptimistically(job *model.Job, currentStatus string) (bool, error) {
  4730  
  4731  	tries := 0
  4732  	for {
  4733  		result, err := s.JobStore.UpdateOptimistically(job, currentStatus)
  4734  		if err == nil {
  4735  			return result, nil
  4736  		}
  4737  		if !isRepeatableError(err) {
  4738  			return result, err
  4739  		}
  4740  		tries++
  4741  		if tries >= 3 {
  4742  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4743  			return result, err
  4744  		}
  4745  	}
  4746  
  4747  }
  4748  
  4749  func (s *RetryLayerJobStore) UpdateStatus(id string, status string) (*model.Job, error) {
  4750  
  4751  	tries := 0
  4752  	for {
  4753  		result, err := s.JobStore.UpdateStatus(id, status)
  4754  		if err == nil {
  4755  			return result, nil
  4756  		}
  4757  		if !isRepeatableError(err) {
  4758  			return result, err
  4759  		}
  4760  		tries++
  4761  		if tries >= 3 {
  4762  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4763  			return result, err
  4764  		}
  4765  	}
  4766  
  4767  }
  4768  
  4769  func (s *RetryLayerJobStore) UpdateStatusOptimistically(id string, currentStatus string, newStatus string) (bool, error) {
  4770  
  4771  	tries := 0
  4772  	for {
  4773  		result, err := s.JobStore.UpdateStatusOptimistically(id, currentStatus, newStatus)
  4774  		if err == nil {
  4775  			return result, nil
  4776  		}
  4777  		if !isRepeatableError(err) {
  4778  			return result, err
  4779  		}
  4780  		tries++
  4781  		if tries >= 3 {
  4782  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4783  			return result, err
  4784  		}
  4785  	}
  4786  
  4787  }
  4788  
  4789  func (s *RetryLayerLicenseStore) Get(id string) (*model.LicenseRecord, error) {
  4790  
  4791  	tries := 0
  4792  	for {
  4793  		result, err := s.LicenseStore.Get(id)
  4794  		if err == nil {
  4795  			return result, nil
  4796  		}
  4797  		if !isRepeatableError(err) {
  4798  			return result, err
  4799  		}
  4800  		tries++
  4801  		if tries >= 3 {
  4802  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4803  			return result, err
  4804  		}
  4805  	}
  4806  
  4807  }
  4808  
  4809  func (s *RetryLayerLicenseStore) GetAll() ([]*model.LicenseRecord, error) {
  4810  
  4811  	tries := 0
  4812  	for {
  4813  		result, err := s.LicenseStore.GetAll()
  4814  		if err == nil {
  4815  			return result, nil
  4816  		}
  4817  		if !isRepeatableError(err) {
  4818  			return result, err
  4819  		}
  4820  		tries++
  4821  		if tries >= 3 {
  4822  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4823  			return result, err
  4824  		}
  4825  	}
  4826  
  4827  }
  4828  
  4829  func (s *RetryLayerLicenseStore) Save(license *model.LicenseRecord) (*model.LicenseRecord, error) {
  4830  
  4831  	tries := 0
  4832  	for {
  4833  		result, err := s.LicenseStore.Save(license)
  4834  		if err == nil {
  4835  			return result, nil
  4836  		}
  4837  		if !isRepeatableError(err) {
  4838  			return result, err
  4839  		}
  4840  		tries++
  4841  		if tries >= 3 {
  4842  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4843  			return result, err
  4844  		}
  4845  	}
  4846  
  4847  }
  4848  
  4849  func (s *RetryLayerLinkMetadataStore) Get(url string, timestamp int64) (*model.LinkMetadata, error) {
  4850  
  4851  	tries := 0
  4852  	for {
  4853  		result, err := s.LinkMetadataStore.Get(url, timestamp)
  4854  		if err == nil {
  4855  			return result, nil
  4856  		}
  4857  		if !isRepeatableError(err) {
  4858  			return result, err
  4859  		}
  4860  		tries++
  4861  		if tries >= 3 {
  4862  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4863  			return result, err
  4864  		}
  4865  	}
  4866  
  4867  }
  4868  
  4869  func (s *RetryLayerLinkMetadataStore) Save(linkMetadata *model.LinkMetadata) (*model.LinkMetadata, error) {
  4870  
  4871  	tries := 0
  4872  	for {
  4873  		result, err := s.LinkMetadataStore.Save(linkMetadata)
  4874  		if err == nil {
  4875  			return result, nil
  4876  		}
  4877  		if !isRepeatableError(err) {
  4878  			return result, err
  4879  		}
  4880  		tries++
  4881  		if tries >= 3 {
  4882  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4883  			return result, err
  4884  		}
  4885  	}
  4886  
  4887  }
  4888  
  4889  func (s *RetryLayerOAuthStore) DeleteApp(id string) error {
  4890  
  4891  	tries := 0
  4892  	for {
  4893  		err := s.OAuthStore.DeleteApp(id)
  4894  		if err == nil {
  4895  			return nil
  4896  		}
  4897  		if !isRepeatableError(err) {
  4898  			return err
  4899  		}
  4900  		tries++
  4901  		if tries >= 3 {
  4902  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4903  			return err
  4904  		}
  4905  	}
  4906  
  4907  }
  4908  
  4909  func (s *RetryLayerOAuthStore) GetAccessData(token string) (*model.AccessData, error) {
  4910  
  4911  	tries := 0
  4912  	for {
  4913  		result, err := s.OAuthStore.GetAccessData(token)
  4914  		if err == nil {
  4915  			return result, nil
  4916  		}
  4917  		if !isRepeatableError(err) {
  4918  			return result, err
  4919  		}
  4920  		tries++
  4921  		if tries >= 3 {
  4922  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4923  			return result, err
  4924  		}
  4925  	}
  4926  
  4927  }
  4928  
  4929  func (s *RetryLayerOAuthStore) GetAccessDataByRefreshToken(token string) (*model.AccessData, error) {
  4930  
  4931  	tries := 0
  4932  	for {
  4933  		result, err := s.OAuthStore.GetAccessDataByRefreshToken(token)
  4934  		if err == nil {
  4935  			return result, nil
  4936  		}
  4937  		if !isRepeatableError(err) {
  4938  			return result, err
  4939  		}
  4940  		tries++
  4941  		if tries >= 3 {
  4942  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4943  			return result, err
  4944  		}
  4945  	}
  4946  
  4947  }
  4948  
  4949  func (s *RetryLayerOAuthStore) GetAccessDataByUserForApp(userID string, clientId string) ([]*model.AccessData, error) {
  4950  
  4951  	tries := 0
  4952  	for {
  4953  		result, err := s.OAuthStore.GetAccessDataByUserForApp(userID, clientId)
  4954  		if err == nil {
  4955  			return result, nil
  4956  		}
  4957  		if !isRepeatableError(err) {
  4958  			return result, err
  4959  		}
  4960  		tries++
  4961  		if tries >= 3 {
  4962  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4963  			return result, err
  4964  		}
  4965  	}
  4966  
  4967  }
  4968  
  4969  func (s *RetryLayerOAuthStore) GetApp(id string) (*model.OAuthApp, error) {
  4970  
  4971  	tries := 0
  4972  	for {
  4973  		result, err := s.OAuthStore.GetApp(id)
  4974  		if err == nil {
  4975  			return result, nil
  4976  		}
  4977  		if !isRepeatableError(err) {
  4978  			return result, err
  4979  		}
  4980  		tries++
  4981  		if tries >= 3 {
  4982  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  4983  			return result, err
  4984  		}
  4985  	}
  4986  
  4987  }
  4988  
  4989  func (s *RetryLayerOAuthStore) GetAppByUser(userID string, offset int, limit int) ([]*model.OAuthApp, error) {
  4990  
  4991  	tries := 0
  4992  	for {
  4993  		result, err := s.OAuthStore.GetAppByUser(userID, offset, limit)
  4994  		if err == nil {
  4995  			return result, nil
  4996  		}
  4997  		if !isRepeatableError(err) {
  4998  			return result, err
  4999  		}
  5000  		tries++
  5001  		if tries >= 3 {
  5002  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5003  			return result, err
  5004  		}
  5005  	}
  5006  
  5007  }
  5008  
  5009  func (s *RetryLayerOAuthStore) GetApps(offset int, limit int) ([]*model.OAuthApp, error) {
  5010  
  5011  	tries := 0
  5012  	for {
  5013  		result, err := s.OAuthStore.GetApps(offset, limit)
  5014  		if err == nil {
  5015  			return result, nil
  5016  		}
  5017  		if !isRepeatableError(err) {
  5018  			return result, err
  5019  		}
  5020  		tries++
  5021  		if tries >= 3 {
  5022  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5023  			return result, err
  5024  		}
  5025  	}
  5026  
  5027  }
  5028  
  5029  func (s *RetryLayerOAuthStore) GetAuthData(code string) (*model.AuthData, error) {
  5030  
  5031  	tries := 0
  5032  	for {
  5033  		result, err := s.OAuthStore.GetAuthData(code)
  5034  		if err == nil {
  5035  			return result, nil
  5036  		}
  5037  		if !isRepeatableError(err) {
  5038  			return result, err
  5039  		}
  5040  		tries++
  5041  		if tries >= 3 {
  5042  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5043  			return result, err
  5044  		}
  5045  	}
  5046  
  5047  }
  5048  
  5049  func (s *RetryLayerOAuthStore) GetAuthorizedApps(userID string, offset int, limit int) ([]*model.OAuthApp, error) {
  5050  
  5051  	tries := 0
  5052  	for {
  5053  		result, err := s.OAuthStore.GetAuthorizedApps(userID, offset, limit)
  5054  		if err == nil {
  5055  			return result, nil
  5056  		}
  5057  		if !isRepeatableError(err) {
  5058  			return result, err
  5059  		}
  5060  		tries++
  5061  		if tries >= 3 {
  5062  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5063  			return result, err
  5064  		}
  5065  	}
  5066  
  5067  }
  5068  
  5069  func (s *RetryLayerOAuthStore) GetPreviousAccessData(userID string, clientId string) (*model.AccessData, error) {
  5070  
  5071  	tries := 0
  5072  	for {
  5073  		result, err := s.OAuthStore.GetPreviousAccessData(userID, clientId)
  5074  		if err == nil {
  5075  			return result, nil
  5076  		}
  5077  		if !isRepeatableError(err) {
  5078  			return result, err
  5079  		}
  5080  		tries++
  5081  		if tries >= 3 {
  5082  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5083  			return result, err
  5084  		}
  5085  	}
  5086  
  5087  }
  5088  
  5089  func (s *RetryLayerOAuthStore) PermanentDeleteAuthDataByUser(userID string) error {
  5090  
  5091  	tries := 0
  5092  	for {
  5093  		err := s.OAuthStore.PermanentDeleteAuthDataByUser(userID)
  5094  		if err == nil {
  5095  			return nil
  5096  		}
  5097  		if !isRepeatableError(err) {
  5098  			return err
  5099  		}
  5100  		tries++
  5101  		if tries >= 3 {
  5102  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5103  			return err
  5104  		}
  5105  	}
  5106  
  5107  }
  5108  
  5109  func (s *RetryLayerOAuthStore) RemoveAccessData(token string) error {
  5110  
  5111  	tries := 0
  5112  	for {
  5113  		err := s.OAuthStore.RemoveAccessData(token)
  5114  		if err == nil {
  5115  			return nil
  5116  		}
  5117  		if !isRepeatableError(err) {
  5118  			return err
  5119  		}
  5120  		tries++
  5121  		if tries >= 3 {
  5122  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5123  			return err
  5124  		}
  5125  	}
  5126  
  5127  }
  5128  
  5129  func (s *RetryLayerOAuthStore) RemoveAllAccessData() error {
  5130  
  5131  	tries := 0
  5132  	for {
  5133  		err := s.OAuthStore.RemoveAllAccessData()
  5134  		if err == nil {
  5135  			return nil
  5136  		}
  5137  		if !isRepeatableError(err) {
  5138  			return err
  5139  		}
  5140  		tries++
  5141  		if tries >= 3 {
  5142  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5143  			return err
  5144  		}
  5145  	}
  5146  
  5147  }
  5148  
  5149  func (s *RetryLayerOAuthStore) RemoveAuthData(code string) error {
  5150  
  5151  	tries := 0
  5152  	for {
  5153  		err := s.OAuthStore.RemoveAuthData(code)
  5154  		if err == nil {
  5155  			return nil
  5156  		}
  5157  		if !isRepeatableError(err) {
  5158  			return err
  5159  		}
  5160  		tries++
  5161  		if tries >= 3 {
  5162  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5163  			return err
  5164  		}
  5165  	}
  5166  
  5167  }
  5168  
  5169  func (s *RetryLayerOAuthStore) SaveAccessData(accessData *model.AccessData) (*model.AccessData, error) {
  5170  
  5171  	tries := 0
  5172  	for {
  5173  		result, err := s.OAuthStore.SaveAccessData(accessData)
  5174  		if err == nil {
  5175  			return result, nil
  5176  		}
  5177  		if !isRepeatableError(err) {
  5178  			return result, err
  5179  		}
  5180  		tries++
  5181  		if tries >= 3 {
  5182  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5183  			return result, err
  5184  		}
  5185  	}
  5186  
  5187  }
  5188  
  5189  func (s *RetryLayerOAuthStore) SaveApp(app *model.OAuthApp) (*model.OAuthApp, error) {
  5190  
  5191  	tries := 0
  5192  	for {
  5193  		result, err := s.OAuthStore.SaveApp(app)
  5194  		if err == nil {
  5195  			return result, nil
  5196  		}
  5197  		if !isRepeatableError(err) {
  5198  			return result, err
  5199  		}
  5200  		tries++
  5201  		if tries >= 3 {
  5202  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5203  			return result, err
  5204  		}
  5205  	}
  5206  
  5207  }
  5208  
  5209  func (s *RetryLayerOAuthStore) SaveAuthData(authData *model.AuthData) (*model.AuthData, error) {
  5210  
  5211  	tries := 0
  5212  	for {
  5213  		result, err := s.OAuthStore.SaveAuthData(authData)
  5214  		if err == nil {
  5215  			return result, nil
  5216  		}
  5217  		if !isRepeatableError(err) {
  5218  			return result, err
  5219  		}
  5220  		tries++
  5221  		if tries >= 3 {
  5222  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5223  			return result, err
  5224  		}
  5225  	}
  5226  
  5227  }
  5228  
  5229  func (s *RetryLayerOAuthStore) UpdateAccessData(accessData *model.AccessData) (*model.AccessData, error) {
  5230  
  5231  	tries := 0
  5232  	for {
  5233  		result, err := s.OAuthStore.UpdateAccessData(accessData)
  5234  		if err == nil {
  5235  			return result, nil
  5236  		}
  5237  		if !isRepeatableError(err) {
  5238  			return result, err
  5239  		}
  5240  		tries++
  5241  		if tries >= 3 {
  5242  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5243  			return result, err
  5244  		}
  5245  	}
  5246  
  5247  }
  5248  
  5249  func (s *RetryLayerOAuthStore) UpdateApp(app *model.OAuthApp) (*model.OAuthApp, error) {
  5250  
  5251  	tries := 0
  5252  	for {
  5253  		result, err := s.OAuthStore.UpdateApp(app)
  5254  		if err == nil {
  5255  			return result, nil
  5256  		}
  5257  		if !isRepeatableError(err) {
  5258  			return result, err
  5259  		}
  5260  		tries++
  5261  		if tries >= 3 {
  5262  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5263  			return result, err
  5264  		}
  5265  	}
  5266  
  5267  }
  5268  
  5269  func (s *RetryLayerPluginStore) CompareAndDelete(keyVal *model.PluginKeyValue, oldValue []byte) (bool, error) {
  5270  
  5271  	tries := 0
  5272  	for {
  5273  		result, err := s.PluginStore.CompareAndDelete(keyVal, oldValue)
  5274  		if err == nil {
  5275  			return result, nil
  5276  		}
  5277  		if !isRepeatableError(err) {
  5278  			return result, err
  5279  		}
  5280  		tries++
  5281  		if tries >= 3 {
  5282  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5283  			return result, err
  5284  		}
  5285  	}
  5286  
  5287  }
  5288  
  5289  func (s *RetryLayerPluginStore) CompareAndSet(keyVal *model.PluginKeyValue, oldValue []byte) (bool, error) {
  5290  
  5291  	tries := 0
  5292  	for {
  5293  		result, err := s.PluginStore.CompareAndSet(keyVal, oldValue)
  5294  		if err == nil {
  5295  			return result, nil
  5296  		}
  5297  		if !isRepeatableError(err) {
  5298  			return result, err
  5299  		}
  5300  		tries++
  5301  		if tries >= 3 {
  5302  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5303  			return result, err
  5304  		}
  5305  	}
  5306  
  5307  }
  5308  
  5309  func (s *RetryLayerPluginStore) Delete(pluginID string, key string) error {
  5310  
  5311  	tries := 0
  5312  	for {
  5313  		err := s.PluginStore.Delete(pluginID, key)
  5314  		if err == nil {
  5315  			return nil
  5316  		}
  5317  		if !isRepeatableError(err) {
  5318  			return err
  5319  		}
  5320  		tries++
  5321  		if tries >= 3 {
  5322  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5323  			return err
  5324  		}
  5325  	}
  5326  
  5327  }
  5328  
  5329  func (s *RetryLayerPluginStore) DeleteAllExpired() error {
  5330  
  5331  	tries := 0
  5332  	for {
  5333  		err := s.PluginStore.DeleteAllExpired()
  5334  		if err == nil {
  5335  			return nil
  5336  		}
  5337  		if !isRepeatableError(err) {
  5338  			return err
  5339  		}
  5340  		tries++
  5341  		if tries >= 3 {
  5342  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5343  			return err
  5344  		}
  5345  	}
  5346  
  5347  }
  5348  
  5349  func (s *RetryLayerPluginStore) DeleteAllForPlugin(PluginID string) error {
  5350  
  5351  	tries := 0
  5352  	for {
  5353  		err := s.PluginStore.DeleteAllForPlugin(PluginID)
  5354  		if err == nil {
  5355  			return nil
  5356  		}
  5357  		if !isRepeatableError(err) {
  5358  			return err
  5359  		}
  5360  		tries++
  5361  		if tries >= 3 {
  5362  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5363  			return err
  5364  		}
  5365  	}
  5366  
  5367  }
  5368  
  5369  func (s *RetryLayerPluginStore) Get(pluginID string, key string) (*model.PluginKeyValue, error) {
  5370  
  5371  	tries := 0
  5372  	for {
  5373  		result, err := s.PluginStore.Get(pluginID, key)
  5374  		if err == nil {
  5375  			return result, nil
  5376  		}
  5377  		if !isRepeatableError(err) {
  5378  			return result, err
  5379  		}
  5380  		tries++
  5381  		if tries >= 3 {
  5382  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5383  			return result, err
  5384  		}
  5385  	}
  5386  
  5387  }
  5388  
  5389  func (s *RetryLayerPluginStore) List(pluginID string, page int, perPage int) ([]string, error) {
  5390  
  5391  	tries := 0
  5392  	for {
  5393  		result, err := s.PluginStore.List(pluginID, page, perPage)
  5394  		if err == nil {
  5395  			return result, nil
  5396  		}
  5397  		if !isRepeatableError(err) {
  5398  			return result, err
  5399  		}
  5400  		tries++
  5401  		if tries >= 3 {
  5402  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5403  			return result, err
  5404  		}
  5405  	}
  5406  
  5407  }
  5408  
  5409  func (s *RetryLayerPluginStore) SaveOrUpdate(keyVal *model.PluginKeyValue) (*model.PluginKeyValue, error) {
  5410  
  5411  	tries := 0
  5412  	for {
  5413  		result, err := s.PluginStore.SaveOrUpdate(keyVal)
  5414  		if err == nil {
  5415  			return result, nil
  5416  		}
  5417  		if !isRepeatableError(err) {
  5418  			return result, err
  5419  		}
  5420  		tries++
  5421  		if tries >= 3 {
  5422  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5423  			return result, err
  5424  		}
  5425  	}
  5426  
  5427  }
  5428  
  5429  func (s *RetryLayerPluginStore) SetWithOptions(pluginID string, key string, value []byte, options model.PluginKVSetOptions) (bool, error) {
  5430  
  5431  	tries := 0
  5432  	for {
  5433  		result, err := s.PluginStore.SetWithOptions(pluginID, key, value, options)
  5434  		if err == nil {
  5435  			return result, nil
  5436  		}
  5437  		if !isRepeatableError(err) {
  5438  			return result, err
  5439  		}
  5440  		tries++
  5441  		if tries >= 3 {
  5442  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5443  			return result, err
  5444  		}
  5445  	}
  5446  
  5447  }
  5448  
  5449  func (s *RetryLayerPostStore) AnalyticsPostCount(teamID string, mustHaveFile bool, mustHaveHashtag bool) (int64, error) {
  5450  
  5451  	tries := 0
  5452  	for {
  5453  		result, err := s.PostStore.AnalyticsPostCount(teamID, mustHaveFile, mustHaveHashtag)
  5454  		if err == nil {
  5455  			return result, nil
  5456  		}
  5457  		if !isRepeatableError(err) {
  5458  			return result, err
  5459  		}
  5460  		tries++
  5461  		if tries >= 3 {
  5462  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5463  			return result, err
  5464  		}
  5465  	}
  5466  
  5467  }
  5468  
  5469  func (s *RetryLayerPostStore) AnalyticsPostCountsByDay(options *model.AnalyticsPostCountsOptions) (model.AnalyticsRows, error) {
  5470  
  5471  	tries := 0
  5472  	for {
  5473  		result, err := s.PostStore.AnalyticsPostCountsByDay(options)
  5474  		if err == nil {
  5475  			return result, nil
  5476  		}
  5477  		if !isRepeatableError(err) {
  5478  			return result, err
  5479  		}
  5480  		tries++
  5481  		if tries >= 3 {
  5482  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5483  			return result, err
  5484  		}
  5485  	}
  5486  
  5487  }
  5488  
  5489  func (s *RetryLayerPostStore) AnalyticsUserCountsWithPostsByDay(teamID string) (model.AnalyticsRows, error) {
  5490  
  5491  	tries := 0
  5492  	for {
  5493  		result, err := s.PostStore.AnalyticsUserCountsWithPostsByDay(teamID)
  5494  		if err == nil {
  5495  			return result, nil
  5496  		}
  5497  		if !isRepeatableError(err) {
  5498  			return result, err
  5499  		}
  5500  		tries++
  5501  		if tries >= 3 {
  5502  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5503  			return result, err
  5504  		}
  5505  	}
  5506  
  5507  }
  5508  
  5509  func (s *RetryLayerPostStore) ClearCaches() {
  5510  
  5511  	s.PostStore.ClearCaches()
  5512  
  5513  }
  5514  
  5515  func (s *RetryLayerPostStore) Delete(postID string, time int64, deleteByID string) error {
  5516  
  5517  	tries := 0
  5518  	for {
  5519  		err := s.PostStore.Delete(postID, time, deleteByID)
  5520  		if err == nil {
  5521  			return nil
  5522  		}
  5523  		if !isRepeatableError(err) {
  5524  			return err
  5525  		}
  5526  		tries++
  5527  		if tries >= 3 {
  5528  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5529  			return err
  5530  		}
  5531  	}
  5532  
  5533  }
  5534  
  5535  func (s *RetryLayerPostStore) DeleteOrphanedRows(limit int) (int64, error) {
  5536  
  5537  	tries := 0
  5538  	for {
  5539  		result, err := s.PostStore.DeleteOrphanedRows(limit)
  5540  		if err == nil {
  5541  			return result, nil
  5542  		}
  5543  		if !isRepeatableError(err) {
  5544  			return result, err
  5545  		}
  5546  		tries++
  5547  		if tries >= 3 {
  5548  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5549  			return result, err
  5550  		}
  5551  	}
  5552  
  5553  }
  5554  
  5555  func (s *RetryLayerPostStore) Get(ctx context.Context, id string, skipFetchThreads bool, collapsedThreads bool, collapsedThreadsExtended bool, userID string) (*model.PostList, error) {
  5556  
  5557  	tries := 0
  5558  	for {
  5559  		result, err := s.PostStore.Get(ctx, id, skipFetchThreads, collapsedThreads, collapsedThreadsExtended, userID)
  5560  		if err == nil {
  5561  			return result, nil
  5562  		}
  5563  		if !isRepeatableError(err) {
  5564  			return result, err
  5565  		}
  5566  		tries++
  5567  		if tries >= 3 {
  5568  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5569  			return result, err
  5570  		}
  5571  	}
  5572  
  5573  }
  5574  
  5575  func (s *RetryLayerPostStore) GetDirectPostParentsForExportAfter(limit int, afterID string) ([]*model.DirectPostForExport, error) {
  5576  
  5577  	tries := 0
  5578  	for {
  5579  		result, err := s.PostStore.GetDirectPostParentsForExportAfter(limit, afterID)
  5580  		if err == nil {
  5581  			return result, nil
  5582  		}
  5583  		if !isRepeatableError(err) {
  5584  			return result, err
  5585  		}
  5586  		tries++
  5587  		if tries >= 3 {
  5588  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5589  			return result, err
  5590  		}
  5591  	}
  5592  
  5593  }
  5594  
  5595  func (s *RetryLayerPostStore) GetEtag(channelID string, allowFromCache bool, collapsedThreads bool) string {
  5596  
  5597  	return s.PostStore.GetEtag(channelID, allowFromCache, collapsedThreads)
  5598  
  5599  }
  5600  
  5601  func (s *RetryLayerPostStore) GetFlaggedPosts(userID string, offset int, limit int) (*model.PostList, error) {
  5602  
  5603  	tries := 0
  5604  	for {
  5605  		result, err := s.PostStore.GetFlaggedPosts(userID, offset, limit)
  5606  		if err == nil {
  5607  			return result, nil
  5608  		}
  5609  		if !isRepeatableError(err) {
  5610  			return result, err
  5611  		}
  5612  		tries++
  5613  		if tries >= 3 {
  5614  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5615  			return result, err
  5616  		}
  5617  	}
  5618  
  5619  }
  5620  
  5621  func (s *RetryLayerPostStore) GetFlaggedPostsForChannel(userID string, channelID string, offset int, limit int) (*model.PostList, error) {
  5622  
  5623  	tries := 0
  5624  	for {
  5625  		result, err := s.PostStore.GetFlaggedPostsForChannel(userID, channelID, offset, limit)
  5626  		if err == nil {
  5627  			return result, nil
  5628  		}
  5629  		if !isRepeatableError(err) {
  5630  			return result, err
  5631  		}
  5632  		tries++
  5633  		if tries >= 3 {
  5634  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5635  			return result, err
  5636  		}
  5637  	}
  5638  
  5639  }
  5640  
  5641  func (s *RetryLayerPostStore) GetFlaggedPostsForTeam(userID string, teamID string, offset int, limit int) (*model.PostList, error) {
  5642  
  5643  	tries := 0
  5644  	for {
  5645  		result, err := s.PostStore.GetFlaggedPostsForTeam(userID, teamID, offset, limit)
  5646  		if err == nil {
  5647  			return result, nil
  5648  		}
  5649  		if !isRepeatableError(err) {
  5650  			return result, err
  5651  		}
  5652  		tries++
  5653  		if tries >= 3 {
  5654  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5655  			return result, err
  5656  		}
  5657  	}
  5658  
  5659  }
  5660  
  5661  func (s *RetryLayerPostStore) GetMaxPostSize() int {
  5662  
  5663  	return s.PostStore.GetMaxPostSize()
  5664  
  5665  }
  5666  
  5667  func (s *RetryLayerPostStore) GetOldest() (*model.Post, error) {
  5668  
  5669  	tries := 0
  5670  	for {
  5671  		result, err := s.PostStore.GetOldest()
  5672  		if err == nil {
  5673  			return result, nil
  5674  		}
  5675  		if !isRepeatableError(err) {
  5676  			return result, err
  5677  		}
  5678  		tries++
  5679  		if tries >= 3 {
  5680  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5681  			return result, err
  5682  		}
  5683  	}
  5684  
  5685  }
  5686  
  5687  func (s *RetryLayerPostStore) GetOldestEntityCreationTime() (int64, error) {
  5688  
  5689  	tries := 0
  5690  	for {
  5691  		result, err := s.PostStore.GetOldestEntityCreationTime()
  5692  		if err == nil {
  5693  			return result, nil
  5694  		}
  5695  		if !isRepeatableError(err) {
  5696  			return result, err
  5697  		}
  5698  		tries++
  5699  		if tries >= 3 {
  5700  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5701  			return result, err
  5702  		}
  5703  	}
  5704  
  5705  }
  5706  
  5707  func (s *RetryLayerPostStore) GetParentsForExportAfter(limit int, afterID string) ([]*model.PostForExport, error) {
  5708  
  5709  	tries := 0
  5710  	for {
  5711  		result, err := s.PostStore.GetParentsForExportAfter(limit, afterID)
  5712  		if err == nil {
  5713  			return result, nil
  5714  		}
  5715  		if !isRepeatableError(err) {
  5716  			return result, err
  5717  		}
  5718  		tries++
  5719  		if tries >= 3 {
  5720  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5721  			return result, err
  5722  		}
  5723  	}
  5724  
  5725  }
  5726  
  5727  func (s *RetryLayerPostStore) GetPostAfterTime(channelID string, time int64, collapsedThreads bool) (*model.Post, error) {
  5728  
  5729  	tries := 0
  5730  	for {
  5731  		result, err := s.PostStore.GetPostAfterTime(channelID, time, collapsedThreads)
  5732  		if err == nil {
  5733  			return result, nil
  5734  		}
  5735  		if !isRepeatableError(err) {
  5736  			return result, err
  5737  		}
  5738  		tries++
  5739  		if tries >= 3 {
  5740  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5741  			return result, err
  5742  		}
  5743  	}
  5744  
  5745  }
  5746  
  5747  func (s *RetryLayerPostStore) GetPostIdAfterTime(channelID string, time int64, collapsedThreads bool) (string, error) {
  5748  
  5749  	tries := 0
  5750  	for {
  5751  		result, err := s.PostStore.GetPostIdAfterTime(channelID, time, collapsedThreads)
  5752  		if err == nil {
  5753  			return result, nil
  5754  		}
  5755  		if !isRepeatableError(err) {
  5756  			return result, err
  5757  		}
  5758  		tries++
  5759  		if tries >= 3 {
  5760  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5761  			return result, err
  5762  		}
  5763  	}
  5764  
  5765  }
  5766  
  5767  func (s *RetryLayerPostStore) GetPostIdBeforeTime(channelID string, time int64, collapsedThreads bool) (string, error) {
  5768  
  5769  	tries := 0
  5770  	for {
  5771  		result, err := s.PostStore.GetPostIdBeforeTime(channelID, time, collapsedThreads)
  5772  		if err == nil {
  5773  			return result, nil
  5774  		}
  5775  		if !isRepeatableError(err) {
  5776  			return result, err
  5777  		}
  5778  		tries++
  5779  		if tries >= 3 {
  5780  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5781  			return result, err
  5782  		}
  5783  	}
  5784  
  5785  }
  5786  
  5787  func (s *RetryLayerPostStore) GetPosts(options model.GetPostsOptions, allowFromCache bool) (*model.PostList, error) {
  5788  
  5789  	tries := 0
  5790  	for {
  5791  		result, err := s.PostStore.GetPosts(options, allowFromCache)
  5792  		if err == nil {
  5793  			return result, nil
  5794  		}
  5795  		if !isRepeatableError(err) {
  5796  			return result, err
  5797  		}
  5798  		tries++
  5799  		if tries >= 3 {
  5800  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5801  			return result, err
  5802  		}
  5803  	}
  5804  
  5805  }
  5806  
  5807  func (s *RetryLayerPostStore) GetPostsAfter(options model.GetPostsOptions) (*model.PostList, error) {
  5808  
  5809  	tries := 0
  5810  	for {
  5811  		result, err := s.PostStore.GetPostsAfter(options)
  5812  		if err == nil {
  5813  			return result, nil
  5814  		}
  5815  		if !isRepeatableError(err) {
  5816  			return result, err
  5817  		}
  5818  		tries++
  5819  		if tries >= 3 {
  5820  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5821  			return result, err
  5822  		}
  5823  	}
  5824  
  5825  }
  5826  
  5827  func (s *RetryLayerPostStore) GetPostsBatchForIndexing(startTime int64, endTime int64, limit int) ([]*model.PostForIndexing, error) {
  5828  
  5829  	tries := 0
  5830  	for {
  5831  		result, err := s.PostStore.GetPostsBatchForIndexing(startTime, endTime, limit)
  5832  		if err == nil {
  5833  			return result, nil
  5834  		}
  5835  		if !isRepeatableError(err) {
  5836  			return result, err
  5837  		}
  5838  		tries++
  5839  		if tries >= 3 {
  5840  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5841  			return result, err
  5842  		}
  5843  	}
  5844  
  5845  }
  5846  
  5847  func (s *RetryLayerPostStore) GetPostsBefore(options model.GetPostsOptions) (*model.PostList, error) {
  5848  
  5849  	tries := 0
  5850  	for {
  5851  		result, err := s.PostStore.GetPostsBefore(options)
  5852  		if err == nil {
  5853  			return result, nil
  5854  		}
  5855  		if !isRepeatableError(err) {
  5856  			return result, err
  5857  		}
  5858  		tries++
  5859  		if tries >= 3 {
  5860  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5861  			return result, err
  5862  		}
  5863  	}
  5864  
  5865  }
  5866  
  5867  func (s *RetryLayerPostStore) GetPostsByIds(postIds []string) ([]*model.Post, error) {
  5868  
  5869  	tries := 0
  5870  	for {
  5871  		result, err := s.PostStore.GetPostsByIds(postIds)
  5872  		if err == nil {
  5873  			return result, nil
  5874  		}
  5875  		if !isRepeatableError(err) {
  5876  			return result, err
  5877  		}
  5878  		tries++
  5879  		if tries >= 3 {
  5880  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5881  			return result, err
  5882  		}
  5883  	}
  5884  
  5885  }
  5886  
  5887  func (s *RetryLayerPostStore) GetPostsCreatedAt(channelID string, time int64) ([]*model.Post, error) {
  5888  
  5889  	tries := 0
  5890  	for {
  5891  		result, err := s.PostStore.GetPostsCreatedAt(channelID, time)
  5892  		if err == nil {
  5893  			return result, nil
  5894  		}
  5895  		if !isRepeatableError(err) {
  5896  			return result, err
  5897  		}
  5898  		tries++
  5899  		if tries >= 3 {
  5900  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5901  			return result, err
  5902  		}
  5903  	}
  5904  
  5905  }
  5906  
  5907  func (s *RetryLayerPostStore) GetPostsSince(options model.GetPostsSinceOptions, allowFromCache bool) (*model.PostList, error) {
  5908  
  5909  	tries := 0
  5910  	for {
  5911  		result, err := s.PostStore.GetPostsSince(options, allowFromCache)
  5912  		if err == nil {
  5913  			return result, nil
  5914  		}
  5915  		if !isRepeatableError(err) {
  5916  			return result, err
  5917  		}
  5918  		tries++
  5919  		if tries >= 3 {
  5920  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5921  			return result, err
  5922  		}
  5923  	}
  5924  
  5925  }
  5926  
  5927  func (s *RetryLayerPostStore) GetPostsSinceForSync(options model.GetPostsSinceForSyncOptions, cursor model.GetPostsSinceForSyncCursor, limit int) ([]*model.Post, model.GetPostsSinceForSyncCursor, error) {
  5928  
  5929  	tries := 0
  5930  	for {
  5931  		result, resultVar1, err := s.PostStore.GetPostsSinceForSync(options, cursor, limit)
  5932  		if err == nil {
  5933  			return result, resultVar1, nil
  5934  		}
  5935  		if !isRepeatableError(err) {
  5936  			return result, resultVar1, err
  5937  		}
  5938  		tries++
  5939  		if tries >= 3 {
  5940  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5941  			return result, resultVar1, err
  5942  		}
  5943  	}
  5944  
  5945  }
  5946  
  5947  func (s *RetryLayerPostStore) GetRepliesForExport(parentID string) ([]*model.ReplyForExport, error) {
  5948  
  5949  	tries := 0
  5950  	for {
  5951  		result, err := s.PostStore.GetRepliesForExport(parentID)
  5952  		if err == nil {
  5953  			return result, nil
  5954  		}
  5955  		if !isRepeatableError(err) {
  5956  			return result, err
  5957  		}
  5958  		tries++
  5959  		if tries >= 3 {
  5960  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5961  			return result, err
  5962  		}
  5963  	}
  5964  
  5965  }
  5966  
  5967  func (s *RetryLayerPostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error) {
  5968  
  5969  	tries := 0
  5970  	for {
  5971  		result, err := s.PostStore.GetSingle(id, inclDeleted)
  5972  		if err == nil {
  5973  			return result, nil
  5974  		}
  5975  		if !isRepeatableError(err) {
  5976  			return result, err
  5977  		}
  5978  		tries++
  5979  		if tries >= 3 {
  5980  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  5981  			return result, err
  5982  		}
  5983  	}
  5984  
  5985  }
  5986  
  5987  func (s *RetryLayerPostStore) HasAutoResponsePostByUserSince(options model.GetPostsSinceOptions, userId string) (bool, error) {
  5988  
  5989  	tries := 0
  5990  	for {
  5991  		result, err := s.PostStore.HasAutoResponsePostByUserSince(options, userId)
  5992  		if err == nil {
  5993  			return result, nil
  5994  		}
  5995  		if !isRepeatableError(err) {
  5996  			return result, err
  5997  		}
  5998  		tries++
  5999  		if tries >= 3 {
  6000  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6001  			return result, err
  6002  		}
  6003  	}
  6004  
  6005  }
  6006  
  6007  func (s *RetryLayerPostStore) InvalidateLastPostTimeCache(channelID string) {
  6008  
  6009  	s.PostStore.InvalidateLastPostTimeCache(channelID)
  6010  
  6011  }
  6012  
  6013  func (s *RetryLayerPostStore) Overwrite(post *model.Post) (*model.Post, error) {
  6014  
  6015  	tries := 0
  6016  	for {
  6017  		result, err := s.PostStore.Overwrite(post)
  6018  		if err == nil {
  6019  			return result, nil
  6020  		}
  6021  		if !isRepeatableError(err) {
  6022  			return result, err
  6023  		}
  6024  		tries++
  6025  		if tries >= 3 {
  6026  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6027  			return result, err
  6028  		}
  6029  	}
  6030  
  6031  }
  6032  
  6033  func (s *RetryLayerPostStore) OverwriteMultiple(posts []*model.Post) ([]*model.Post, int, error) {
  6034  
  6035  	tries := 0
  6036  	for {
  6037  		result, resultVar1, err := s.PostStore.OverwriteMultiple(posts)
  6038  		if err == nil {
  6039  			return result, resultVar1, nil
  6040  		}
  6041  		if !isRepeatableError(err) {
  6042  			return result, resultVar1, err
  6043  		}
  6044  		tries++
  6045  		if tries >= 3 {
  6046  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6047  			return result, resultVar1, err
  6048  		}
  6049  	}
  6050  
  6051  }
  6052  
  6053  func (s *RetryLayerPostStore) PermanentDeleteBatch(endTime int64, limit int64) (int64, error) {
  6054  
  6055  	tries := 0
  6056  	for {
  6057  		result, err := s.PostStore.PermanentDeleteBatch(endTime, limit)
  6058  		if err == nil {
  6059  			return result, nil
  6060  		}
  6061  		if !isRepeatableError(err) {
  6062  			return result, err
  6063  		}
  6064  		tries++
  6065  		if tries >= 3 {
  6066  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6067  			return result, err
  6068  		}
  6069  	}
  6070  
  6071  }
  6072  
  6073  func (s *RetryLayerPostStore) PermanentDeleteBatchForRetentionPolicies(now int64, globalPolicyEndTime int64, limit int64, cursor model.RetentionPolicyCursor) (int64, model.RetentionPolicyCursor, error) {
  6074  
  6075  	tries := 0
  6076  	for {
  6077  		result, resultVar1, err := s.PostStore.PermanentDeleteBatchForRetentionPolicies(now, globalPolicyEndTime, limit, cursor)
  6078  		if err == nil {
  6079  			return result, resultVar1, nil
  6080  		}
  6081  		if !isRepeatableError(err) {
  6082  			return result, resultVar1, err
  6083  		}
  6084  		tries++
  6085  		if tries >= 3 {
  6086  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6087  			return result, resultVar1, err
  6088  		}
  6089  	}
  6090  
  6091  }
  6092  
  6093  func (s *RetryLayerPostStore) PermanentDeleteByChannel(channelID string) error {
  6094  
  6095  	tries := 0
  6096  	for {
  6097  		err := s.PostStore.PermanentDeleteByChannel(channelID)
  6098  		if err == nil {
  6099  			return nil
  6100  		}
  6101  		if !isRepeatableError(err) {
  6102  			return err
  6103  		}
  6104  		tries++
  6105  		if tries >= 3 {
  6106  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6107  			return err
  6108  		}
  6109  	}
  6110  
  6111  }
  6112  
  6113  func (s *RetryLayerPostStore) PermanentDeleteByUser(userID string) error {
  6114  
  6115  	tries := 0
  6116  	for {
  6117  		err := s.PostStore.PermanentDeleteByUser(userID)
  6118  		if err == nil {
  6119  			return nil
  6120  		}
  6121  		if !isRepeatableError(err) {
  6122  			return err
  6123  		}
  6124  		tries++
  6125  		if tries >= 3 {
  6126  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6127  			return err
  6128  		}
  6129  	}
  6130  
  6131  }
  6132  
  6133  func (s *RetryLayerPostStore) Save(post *model.Post) (*model.Post, error) {
  6134  
  6135  	tries := 0
  6136  	for {
  6137  		result, err := s.PostStore.Save(post)
  6138  		if err == nil {
  6139  			return result, nil
  6140  		}
  6141  		if !isRepeatableError(err) {
  6142  			return result, err
  6143  		}
  6144  		tries++
  6145  		if tries >= 3 {
  6146  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6147  			return result, err
  6148  		}
  6149  	}
  6150  
  6151  }
  6152  
  6153  func (s *RetryLayerPostStore) SaveMultiple(posts []*model.Post) ([]*model.Post, int, error) {
  6154  
  6155  	tries := 0
  6156  	for {
  6157  		result, resultVar1, err := s.PostStore.SaveMultiple(posts)
  6158  		if err == nil {
  6159  			return result, resultVar1, nil
  6160  		}
  6161  		if !isRepeatableError(err) {
  6162  			return result, resultVar1, err
  6163  		}
  6164  		tries++
  6165  		if tries >= 3 {
  6166  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6167  			return result, resultVar1, err
  6168  		}
  6169  	}
  6170  
  6171  }
  6172  
  6173  func (s *RetryLayerPostStore) Search(teamID string, userID string, params *model.SearchParams) (*model.PostList, error) {
  6174  
  6175  	tries := 0
  6176  	for {
  6177  		result, err := s.PostStore.Search(teamID, userID, params)
  6178  		if err == nil {
  6179  			return result, nil
  6180  		}
  6181  		if !isRepeatableError(err) {
  6182  			return result, err
  6183  		}
  6184  		tries++
  6185  		if tries >= 3 {
  6186  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6187  			return result, err
  6188  		}
  6189  	}
  6190  
  6191  }
  6192  
  6193  func (s *RetryLayerPostStore) SearchPostsInTeamForUser(paramsList []*model.SearchParams, userID string, teamID string, page int, perPage int) (*model.PostSearchResults, error) {
  6194  
  6195  	tries := 0
  6196  	for {
  6197  		result, err := s.PostStore.SearchPostsInTeamForUser(paramsList, userID, teamID, page, perPage)
  6198  		if err == nil {
  6199  			return result, nil
  6200  		}
  6201  		if !isRepeatableError(err) {
  6202  			return result, err
  6203  		}
  6204  		tries++
  6205  		if tries >= 3 {
  6206  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6207  			return result, err
  6208  		}
  6209  	}
  6210  
  6211  }
  6212  
  6213  func (s *RetryLayerPostStore) Update(newPost *model.Post, oldPost *model.Post) (*model.Post, error) {
  6214  
  6215  	tries := 0
  6216  	for {
  6217  		result, err := s.PostStore.Update(newPost, oldPost)
  6218  		if err == nil {
  6219  			return result, nil
  6220  		}
  6221  		if !isRepeatableError(err) {
  6222  			return result, err
  6223  		}
  6224  		tries++
  6225  		if tries >= 3 {
  6226  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6227  			return result, err
  6228  		}
  6229  	}
  6230  
  6231  }
  6232  
  6233  func (s *RetryLayerPreferenceStore) CleanupFlagsBatch(limit int64) (int64, error) {
  6234  
  6235  	tries := 0
  6236  	for {
  6237  		result, err := s.PreferenceStore.CleanupFlagsBatch(limit)
  6238  		if err == nil {
  6239  			return result, nil
  6240  		}
  6241  		if !isRepeatableError(err) {
  6242  			return result, err
  6243  		}
  6244  		tries++
  6245  		if tries >= 3 {
  6246  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6247  			return result, err
  6248  		}
  6249  	}
  6250  
  6251  }
  6252  
  6253  func (s *RetryLayerPreferenceStore) Delete(userID string, category string, name string) error {
  6254  
  6255  	tries := 0
  6256  	for {
  6257  		err := s.PreferenceStore.Delete(userID, category, name)
  6258  		if err == nil {
  6259  			return nil
  6260  		}
  6261  		if !isRepeatableError(err) {
  6262  			return err
  6263  		}
  6264  		tries++
  6265  		if tries >= 3 {
  6266  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6267  			return err
  6268  		}
  6269  	}
  6270  
  6271  }
  6272  
  6273  func (s *RetryLayerPreferenceStore) DeleteCategory(userID string, category string) error {
  6274  
  6275  	tries := 0
  6276  	for {
  6277  		err := s.PreferenceStore.DeleteCategory(userID, category)
  6278  		if err == nil {
  6279  			return nil
  6280  		}
  6281  		if !isRepeatableError(err) {
  6282  			return err
  6283  		}
  6284  		tries++
  6285  		if tries >= 3 {
  6286  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6287  			return err
  6288  		}
  6289  	}
  6290  
  6291  }
  6292  
  6293  func (s *RetryLayerPreferenceStore) DeleteCategoryAndName(category string, name string) error {
  6294  
  6295  	tries := 0
  6296  	for {
  6297  		err := s.PreferenceStore.DeleteCategoryAndName(category, name)
  6298  		if err == nil {
  6299  			return nil
  6300  		}
  6301  		if !isRepeatableError(err) {
  6302  			return err
  6303  		}
  6304  		tries++
  6305  		if tries >= 3 {
  6306  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6307  			return err
  6308  		}
  6309  	}
  6310  
  6311  }
  6312  
  6313  func (s *RetryLayerPreferenceStore) DeleteOrphanedRows(limit int) (int64, error) {
  6314  
  6315  	tries := 0
  6316  	for {
  6317  		result, err := s.PreferenceStore.DeleteOrphanedRows(limit)
  6318  		if err == nil {
  6319  			return result, nil
  6320  		}
  6321  		if !isRepeatableError(err) {
  6322  			return result, err
  6323  		}
  6324  		tries++
  6325  		if tries >= 3 {
  6326  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6327  			return result, err
  6328  		}
  6329  	}
  6330  
  6331  }
  6332  
  6333  func (s *RetryLayerPreferenceStore) Get(userID string, category string, name string) (*model.Preference, error) {
  6334  
  6335  	tries := 0
  6336  	for {
  6337  		result, err := s.PreferenceStore.Get(userID, category, name)
  6338  		if err == nil {
  6339  			return result, nil
  6340  		}
  6341  		if !isRepeatableError(err) {
  6342  			return result, err
  6343  		}
  6344  		tries++
  6345  		if tries >= 3 {
  6346  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6347  			return result, err
  6348  		}
  6349  	}
  6350  
  6351  }
  6352  
  6353  func (s *RetryLayerPreferenceStore) GetAll(userID string) (model.Preferences, error) {
  6354  
  6355  	tries := 0
  6356  	for {
  6357  		result, err := s.PreferenceStore.GetAll(userID)
  6358  		if err == nil {
  6359  			return result, nil
  6360  		}
  6361  		if !isRepeatableError(err) {
  6362  			return result, err
  6363  		}
  6364  		tries++
  6365  		if tries >= 3 {
  6366  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6367  			return result, err
  6368  		}
  6369  	}
  6370  
  6371  }
  6372  
  6373  func (s *RetryLayerPreferenceStore) GetCategory(userID string, category string) (model.Preferences, error) {
  6374  
  6375  	tries := 0
  6376  	for {
  6377  		result, err := s.PreferenceStore.GetCategory(userID, category)
  6378  		if err == nil {
  6379  			return result, nil
  6380  		}
  6381  		if !isRepeatableError(err) {
  6382  			return result, err
  6383  		}
  6384  		tries++
  6385  		if tries >= 3 {
  6386  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6387  			return result, err
  6388  		}
  6389  	}
  6390  
  6391  }
  6392  
  6393  func (s *RetryLayerPreferenceStore) PermanentDeleteByUser(userID string) error {
  6394  
  6395  	tries := 0
  6396  	for {
  6397  		err := s.PreferenceStore.PermanentDeleteByUser(userID)
  6398  		if err == nil {
  6399  			return nil
  6400  		}
  6401  		if !isRepeatableError(err) {
  6402  			return err
  6403  		}
  6404  		tries++
  6405  		if tries >= 3 {
  6406  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6407  			return err
  6408  		}
  6409  	}
  6410  
  6411  }
  6412  
  6413  func (s *RetryLayerPreferenceStore) Save(preferences *model.Preferences) error {
  6414  
  6415  	tries := 0
  6416  	for {
  6417  		err := s.PreferenceStore.Save(preferences)
  6418  		if err == nil {
  6419  			return nil
  6420  		}
  6421  		if !isRepeatableError(err) {
  6422  			return err
  6423  		}
  6424  		tries++
  6425  		if tries >= 3 {
  6426  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6427  			return err
  6428  		}
  6429  	}
  6430  
  6431  }
  6432  
  6433  func (s *RetryLayerProductNoticesStore) Clear(notices []string) error {
  6434  
  6435  	tries := 0
  6436  	for {
  6437  		err := s.ProductNoticesStore.Clear(notices)
  6438  		if err == nil {
  6439  			return nil
  6440  		}
  6441  		if !isRepeatableError(err) {
  6442  			return err
  6443  		}
  6444  		tries++
  6445  		if tries >= 3 {
  6446  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6447  			return err
  6448  		}
  6449  	}
  6450  
  6451  }
  6452  
  6453  func (s *RetryLayerProductNoticesStore) ClearOldNotices(currentNotices *model.ProductNotices) error {
  6454  
  6455  	tries := 0
  6456  	for {
  6457  		err := s.ProductNoticesStore.ClearOldNotices(currentNotices)
  6458  		if err == nil {
  6459  			return nil
  6460  		}
  6461  		if !isRepeatableError(err) {
  6462  			return err
  6463  		}
  6464  		tries++
  6465  		if tries >= 3 {
  6466  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6467  			return err
  6468  		}
  6469  	}
  6470  
  6471  }
  6472  
  6473  func (s *RetryLayerProductNoticesStore) GetViews(userID string) ([]model.ProductNoticeViewState, error) {
  6474  
  6475  	tries := 0
  6476  	for {
  6477  		result, err := s.ProductNoticesStore.GetViews(userID)
  6478  		if err == nil {
  6479  			return result, nil
  6480  		}
  6481  		if !isRepeatableError(err) {
  6482  			return result, err
  6483  		}
  6484  		tries++
  6485  		if tries >= 3 {
  6486  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6487  			return result, err
  6488  		}
  6489  	}
  6490  
  6491  }
  6492  
  6493  func (s *RetryLayerProductNoticesStore) View(userID string, notices []string) error {
  6494  
  6495  	tries := 0
  6496  	for {
  6497  		err := s.ProductNoticesStore.View(userID, notices)
  6498  		if err == nil {
  6499  			return nil
  6500  		}
  6501  		if !isRepeatableError(err) {
  6502  			return err
  6503  		}
  6504  		tries++
  6505  		if tries >= 3 {
  6506  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6507  			return err
  6508  		}
  6509  	}
  6510  
  6511  }
  6512  
  6513  func (s *RetryLayerReactionStore) BulkGetForPosts(postIds []string) ([]*model.Reaction, error) {
  6514  
  6515  	tries := 0
  6516  	for {
  6517  		result, err := s.ReactionStore.BulkGetForPosts(postIds)
  6518  		if err == nil {
  6519  			return result, nil
  6520  		}
  6521  		if !isRepeatableError(err) {
  6522  			return result, err
  6523  		}
  6524  		tries++
  6525  		if tries >= 3 {
  6526  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6527  			return result, err
  6528  		}
  6529  	}
  6530  
  6531  }
  6532  
  6533  func (s *RetryLayerReactionStore) Delete(reaction *model.Reaction) (*model.Reaction, error) {
  6534  
  6535  	tries := 0
  6536  	for {
  6537  		result, err := s.ReactionStore.Delete(reaction)
  6538  		if err == nil {
  6539  			return result, nil
  6540  		}
  6541  		if !isRepeatableError(err) {
  6542  			return result, err
  6543  		}
  6544  		tries++
  6545  		if tries >= 3 {
  6546  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6547  			return result, err
  6548  		}
  6549  	}
  6550  
  6551  }
  6552  
  6553  func (s *RetryLayerReactionStore) DeleteAllWithEmojiName(emojiName string) error {
  6554  
  6555  	tries := 0
  6556  	for {
  6557  		err := s.ReactionStore.DeleteAllWithEmojiName(emojiName)
  6558  		if err == nil {
  6559  			return nil
  6560  		}
  6561  		if !isRepeatableError(err) {
  6562  			return err
  6563  		}
  6564  		tries++
  6565  		if tries >= 3 {
  6566  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6567  			return err
  6568  		}
  6569  	}
  6570  
  6571  }
  6572  
  6573  func (s *RetryLayerReactionStore) DeleteOrphanedRows(limit int) (int64, error) {
  6574  
  6575  	tries := 0
  6576  	for {
  6577  		result, err := s.ReactionStore.DeleteOrphanedRows(limit)
  6578  		if err == nil {
  6579  			return result, nil
  6580  		}
  6581  		if !isRepeatableError(err) {
  6582  			return result, err
  6583  		}
  6584  		tries++
  6585  		if tries >= 3 {
  6586  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6587  			return result, err
  6588  		}
  6589  	}
  6590  
  6591  }
  6592  
  6593  func (s *RetryLayerReactionStore) GetForPost(postID string, allowFromCache bool) ([]*model.Reaction, error) {
  6594  
  6595  	tries := 0
  6596  	for {
  6597  		result, err := s.ReactionStore.GetForPost(postID, allowFromCache)
  6598  		if err == nil {
  6599  			return result, nil
  6600  		}
  6601  		if !isRepeatableError(err) {
  6602  			return result, err
  6603  		}
  6604  		tries++
  6605  		if tries >= 3 {
  6606  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6607  			return result, err
  6608  		}
  6609  	}
  6610  
  6611  }
  6612  
  6613  func (s *RetryLayerReactionStore) GetForPostSince(postId string, since int64, excludeRemoteId string, inclDeleted bool) ([]*model.Reaction, error) {
  6614  
  6615  	tries := 0
  6616  	for {
  6617  		result, err := s.ReactionStore.GetForPostSince(postId, since, excludeRemoteId, inclDeleted)
  6618  		if err == nil {
  6619  			return result, nil
  6620  		}
  6621  		if !isRepeatableError(err) {
  6622  			return result, err
  6623  		}
  6624  		tries++
  6625  		if tries >= 3 {
  6626  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6627  			return result, err
  6628  		}
  6629  	}
  6630  
  6631  }
  6632  
  6633  func (s *RetryLayerReactionStore) PermanentDeleteBatch(endTime int64, limit int64) (int64, error) {
  6634  
  6635  	tries := 0
  6636  	for {
  6637  		result, err := s.ReactionStore.PermanentDeleteBatch(endTime, limit)
  6638  		if err == nil {
  6639  			return result, nil
  6640  		}
  6641  		if !isRepeatableError(err) {
  6642  			return result, err
  6643  		}
  6644  		tries++
  6645  		if tries >= 3 {
  6646  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6647  			return result, err
  6648  		}
  6649  	}
  6650  
  6651  }
  6652  
  6653  func (s *RetryLayerReactionStore) Save(reaction *model.Reaction) (*model.Reaction, error) {
  6654  
  6655  	tries := 0
  6656  	for {
  6657  		result, err := s.ReactionStore.Save(reaction)
  6658  		if err == nil {
  6659  			return result, nil
  6660  		}
  6661  		if !isRepeatableError(err) {
  6662  			return result, err
  6663  		}
  6664  		tries++
  6665  		if tries >= 3 {
  6666  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6667  			return result, err
  6668  		}
  6669  	}
  6670  
  6671  }
  6672  
  6673  func (s *RetryLayerRemoteClusterStore) Delete(remoteClusterId string) (bool, error) {
  6674  
  6675  	tries := 0
  6676  	for {
  6677  		result, err := s.RemoteClusterStore.Delete(remoteClusterId)
  6678  		if err == nil {
  6679  			return result, nil
  6680  		}
  6681  		if !isRepeatableError(err) {
  6682  			return result, err
  6683  		}
  6684  		tries++
  6685  		if tries >= 3 {
  6686  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6687  			return result, err
  6688  		}
  6689  	}
  6690  
  6691  }
  6692  
  6693  func (s *RetryLayerRemoteClusterStore) Get(remoteClusterId string) (*model.RemoteCluster, error) {
  6694  
  6695  	tries := 0
  6696  	for {
  6697  		result, err := s.RemoteClusterStore.Get(remoteClusterId)
  6698  		if err == nil {
  6699  			return result, nil
  6700  		}
  6701  		if !isRepeatableError(err) {
  6702  			return result, err
  6703  		}
  6704  		tries++
  6705  		if tries >= 3 {
  6706  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6707  			return result, err
  6708  		}
  6709  	}
  6710  
  6711  }
  6712  
  6713  func (s *RetryLayerRemoteClusterStore) GetAll(filter model.RemoteClusterQueryFilter) ([]*model.RemoteCluster, error) {
  6714  
  6715  	tries := 0
  6716  	for {
  6717  		result, err := s.RemoteClusterStore.GetAll(filter)
  6718  		if err == nil {
  6719  			return result, nil
  6720  		}
  6721  		if !isRepeatableError(err) {
  6722  			return result, err
  6723  		}
  6724  		tries++
  6725  		if tries >= 3 {
  6726  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6727  			return result, err
  6728  		}
  6729  	}
  6730  
  6731  }
  6732  
  6733  func (s *RetryLayerRemoteClusterStore) Save(rc *model.RemoteCluster) (*model.RemoteCluster, error) {
  6734  
  6735  	tries := 0
  6736  	for {
  6737  		result, err := s.RemoteClusterStore.Save(rc)
  6738  		if err == nil {
  6739  			return result, nil
  6740  		}
  6741  		if !isRepeatableError(err) {
  6742  			return result, err
  6743  		}
  6744  		tries++
  6745  		if tries >= 3 {
  6746  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6747  			return result, err
  6748  		}
  6749  	}
  6750  
  6751  }
  6752  
  6753  func (s *RetryLayerRemoteClusterStore) SetLastPingAt(remoteClusterId string) error {
  6754  
  6755  	tries := 0
  6756  	for {
  6757  		err := s.RemoteClusterStore.SetLastPingAt(remoteClusterId)
  6758  		if err == nil {
  6759  			return nil
  6760  		}
  6761  		if !isRepeatableError(err) {
  6762  			return err
  6763  		}
  6764  		tries++
  6765  		if tries >= 3 {
  6766  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6767  			return err
  6768  		}
  6769  	}
  6770  
  6771  }
  6772  
  6773  func (s *RetryLayerRemoteClusterStore) Update(rc *model.RemoteCluster) (*model.RemoteCluster, error) {
  6774  
  6775  	tries := 0
  6776  	for {
  6777  		result, err := s.RemoteClusterStore.Update(rc)
  6778  		if err == nil {
  6779  			return result, nil
  6780  		}
  6781  		if !isRepeatableError(err) {
  6782  			return result, err
  6783  		}
  6784  		tries++
  6785  		if tries >= 3 {
  6786  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6787  			return result, err
  6788  		}
  6789  	}
  6790  
  6791  }
  6792  
  6793  func (s *RetryLayerRemoteClusterStore) UpdateTopics(remoteClusterId string, topics string) (*model.RemoteCluster, error) {
  6794  
  6795  	tries := 0
  6796  	for {
  6797  		result, err := s.RemoteClusterStore.UpdateTopics(remoteClusterId, topics)
  6798  		if err == nil {
  6799  			return result, nil
  6800  		}
  6801  		if !isRepeatableError(err) {
  6802  			return result, err
  6803  		}
  6804  		tries++
  6805  		if tries >= 3 {
  6806  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6807  			return result, err
  6808  		}
  6809  	}
  6810  
  6811  }
  6812  
  6813  func (s *RetryLayerRetentionPolicyStore) AddChannels(policyId string, channelIds []string) error {
  6814  
  6815  	tries := 0
  6816  	for {
  6817  		err := s.RetentionPolicyStore.AddChannels(policyId, channelIds)
  6818  		if err == nil {
  6819  			return nil
  6820  		}
  6821  		if !isRepeatableError(err) {
  6822  			return err
  6823  		}
  6824  		tries++
  6825  		if tries >= 3 {
  6826  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6827  			return err
  6828  		}
  6829  	}
  6830  
  6831  }
  6832  
  6833  func (s *RetryLayerRetentionPolicyStore) AddTeams(policyId string, teamIds []string) error {
  6834  
  6835  	tries := 0
  6836  	for {
  6837  		err := s.RetentionPolicyStore.AddTeams(policyId, teamIds)
  6838  		if err == nil {
  6839  			return nil
  6840  		}
  6841  		if !isRepeatableError(err) {
  6842  			return err
  6843  		}
  6844  		tries++
  6845  		if tries >= 3 {
  6846  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6847  			return err
  6848  		}
  6849  	}
  6850  
  6851  }
  6852  
  6853  func (s *RetryLayerRetentionPolicyStore) Delete(id string) error {
  6854  
  6855  	tries := 0
  6856  	for {
  6857  		err := s.RetentionPolicyStore.Delete(id)
  6858  		if err == nil {
  6859  			return nil
  6860  		}
  6861  		if !isRepeatableError(err) {
  6862  			return err
  6863  		}
  6864  		tries++
  6865  		if tries >= 3 {
  6866  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6867  			return err
  6868  		}
  6869  	}
  6870  
  6871  }
  6872  
  6873  func (s *RetryLayerRetentionPolicyStore) DeleteOrphanedRows(limit int) (int64, error) {
  6874  
  6875  	tries := 0
  6876  	for {
  6877  		result, err := s.RetentionPolicyStore.DeleteOrphanedRows(limit)
  6878  		if err == nil {
  6879  			return result, nil
  6880  		}
  6881  		if !isRepeatableError(err) {
  6882  			return result, err
  6883  		}
  6884  		tries++
  6885  		if tries >= 3 {
  6886  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6887  			return result, err
  6888  		}
  6889  	}
  6890  
  6891  }
  6892  
  6893  func (s *RetryLayerRetentionPolicyStore) Get(id string) (*model.RetentionPolicyWithTeamAndChannelCounts, error) {
  6894  
  6895  	tries := 0
  6896  	for {
  6897  		result, err := s.RetentionPolicyStore.Get(id)
  6898  		if err == nil {
  6899  			return result, nil
  6900  		}
  6901  		if !isRepeatableError(err) {
  6902  			return result, err
  6903  		}
  6904  		tries++
  6905  		if tries >= 3 {
  6906  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6907  			return result, err
  6908  		}
  6909  	}
  6910  
  6911  }
  6912  
  6913  func (s *RetryLayerRetentionPolicyStore) GetAll(offset int, limit int) ([]*model.RetentionPolicyWithTeamAndChannelCounts, error) {
  6914  
  6915  	tries := 0
  6916  	for {
  6917  		result, err := s.RetentionPolicyStore.GetAll(offset, limit)
  6918  		if err == nil {
  6919  			return result, nil
  6920  		}
  6921  		if !isRepeatableError(err) {
  6922  			return result, err
  6923  		}
  6924  		tries++
  6925  		if tries >= 3 {
  6926  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6927  			return result, err
  6928  		}
  6929  	}
  6930  
  6931  }
  6932  
  6933  func (s *RetryLayerRetentionPolicyStore) GetChannelPoliciesCountForUser(userID string) (int64, error) {
  6934  
  6935  	tries := 0
  6936  	for {
  6937  		result, err := s.RetentionPolicyStore.GetChannelPoliciesCountForUser(userID)
  6938  		if err == nil {
  6939  			return result, nil
  6940  		}
  6941  		if !isRepeatableError(err) {
  6942  			return result, err
  6943  		}
  6944  		tries++
  6945  		if tries >= 3 {
  6946  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6947  			return result, err
  6948  		}
  6949  	}
  6950  
  6951  }
  6952  
  6953  func (s *RetryLayerRetentionPolicyStore) GetChannelPoliciesForUser(userID string, offset int, limit int) ([]*model.RetentionPolicyForChannel, error) {
  6954  
  6955  	tries := 0
  6956  	for {
  6957  		result, err := s.RetentionPolicyStore.GetChannelPoliciesForUser(userID, offset, limit)
  6958  		if err == nil {
  6959  			return result, nil
  6960  		}
  6961  		if !isRepeatableError(err) {
  6962  			return result, err
  6963  		}
  6964  		tries++
  6965  		if tries >= 3 {
  6966  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6967  			return result, err
  6968  		}
  6969  	}
  6970  
  6971  }
  6972  
  6973  func (s *RetryLayerRetentionPolicyStore) GetChannels(policyId string, offset int, limit int) (model.ChannelListWithTeamData, error) {
  6974  
  6975  	tries := 0
  6976  	for {
  6977  		result, err := s.RetentionPolicyStore.GetChannels(policyId, offset, limit)
  6978  		if err == nil {
  6979  			return result, nil
  6980  		}
  6981  		if !isRepeatableError(err) {
  6982  			return result, err
  6983  		}
  6984  		tries++
  6985  		if tries >= 3 {
  6986  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  6987  			return result, err
  6988  		}
  6989  	}
  6990  
  6991  }
  6992  
  6993  func (s *RetryLayerRetentionPolicyStore) GetChannelsCount(policyId string) (int64, error) {
  6994  
  6995  	tries := 0
  6996  	for {
  6997  		result, err := s.RetentionPolicyStore.GetChannelsCount(policyId)
  6998  		if err == nil {
  6999  			return result, nil
  7000  		}
  7001  		if !isRepeatableError(err) {
  7002  			return result, err
  7003  		}
  7004  		tries++
  7005  		if tries >= 3 {
  7006  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7007  			return result, err
  7008  		}
  7009  	}
  7010  
  7011  }
  7012  
  7013  func (s *RetryLayerRetentionPolicyStore) GetCount() (int64, error) {
  7014  
  7015  	tries := 0
  7016  	for {
  7017  		result, err := s.RetentionPolicyStore.GetCount()
  7018  		if err == nil {
  7019  			return result, nil
  7020  		}
  7021  		if !isRepeatableError(err) {
  7022  			return result, err
  7023  		}
  7024  		tries++
  7025  		if tries >= 3 {
  7026  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7027  			return result, err
  7028  		}
  7029  	}
  7030  
  7031  }
  7032  
  7033  func (s *RetryLayerRetentionPolicyStore) GetTeamPoliciesCountForUser(userID string) (int64, error) {
  7034  
  7035  	tries := 0
  7036  	for {
  7037  		result, err := s.RetentionPolicyStore.GetTeamPoliciesCountForUser(userID)
  7038  		if err == nil {
  7039  			return result, nil
  7040  		}
  7041  		if !isRepeatableError(err) {
  7042  			return result, err
  7043  		}
  7044  		tries++
  7045  		if tries >= 3 {
  7046  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7047  			return result, err
  7048  		}
  7049  	}
  7050  
  7051  }
  7052  
  7053  func (s *RetryLayerRetentionPolicyStore) GetTeamPoliciesForUser(userID string, offset int, limit int) ([]*model.RetentionPolicyForTeam, error) {
  7054  
  7055  	tries := 0
  7056  	for {
  7057  		result, err := s.RetentionPolicyStore.GetTeamPoliciesForUser(userID, offset, limit)
  7058  		if err == nil {
  7059  			return result, nil
  7060  		}
  7061  		if !isRepeatableError(err) {
  7062  			return result, err
  7063  		}
  7064  		tries++
  7065  		if tries >= 3 {
  7066  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7067  			return result, err
  7068  		}
  7069  	}
  7070  
  7071  }
  7072  
  7073  func (s *RetryLayerRetentionPolicyStore) GetTeams(policyId string, offset int, limit int) ([]*model.Team, error) {
  7074  
  7075  	tries := 0
  7076  	for {
  7077  		result, err := s.RetentionPolicyStore.GetTeams(policyId, offset, limit)
  7078  		if err == nil {
  7079  			return result, nil
  7080  		}
  7081  		if !isRepeatableError(err) {
  7082  			return result, err
  7083  		}
  7084  		tries++
  7085  		if tries >= 3 {
  7086  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7087  			return result, err
  7088  		}
  7089  	}
  7090  
  7091  }
  7092  
  7093  func (s *RetryLayerRetentionPolicyStore) GetTeamsCount(policyId string) (int64, error) {
  7094  
  7095  	tries := 0
  7096  	for {
  7097  		result, err := s.RetentionPolicyStore.GetTeamsCount(policyId)
  7098  		if err == nil {
  7099  			return result, nil
  7100  		}
  7101  		if !isRepeatableError(err) {
  7102  			return result, err
  7103  		}
  7104  		tries++
  7105  		if tries >= 3 {
  7106  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7107  			return result, err
  7108  		}
  7109  	}
  7110  
  7111  }
  7112  
  7113  func (s *RetryLayerRetentionPolicyStore) Patch(patch *model.RetentionPolicyWithTeamAndChannelIDs) (*model.RetentionPolicyWithTeamAndChannelCounts, error) {
  7114  
  7115  	tries := 0
  7116  	for {
  7117  		result, err := s.RetentionPolicyStore.Patch(patch)
  7118  		if err == nil {
  7119  			return result, nil
  7120  		}
  7121  		if !isRepeatableError(err) {
  7122  			return result, err
  7123  		}
  7124  		tries++
  7125  		if tries >= 3 {
  7126  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7127  			return result, err
  7128  		}
  7129  	}
  7130  
  7131  }
  7132  
  7133  func (s *RetryLayerRetentionPolicyStore) RemoveChannels(policyId string, channelIds []string) error {
  7134  
  7135  	tries := 0
  7136  	for {
  7137  		err := s.RetentionPolicyStore.RemoveChannels(policyId, channelIds)
  7138  		if err == nil {
  7139  			return nil
  7140  		}
  7141  		if !isRepeatableError(err) {
  7142  			return err
  7143  		}
  7144  		tries++
  7145  		if tries >= 3 {
  7146  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7147  			return err
  7148  		}
  7149  	}
  7150  
  7151  }
  7152  
  7153  func (s *RetryLayerRetentionPolicyStore) RemoveTeams(policyId string, teamIds []string) error {
  7154  
  7155  	tries := 0
  7156  	for {
  7157  		err := s.RetentionPolicyStore.RemoveTeams(policyId, teamIds)
  7158  		if err == nil {
  7159  			return nil
  7160  		}
  7161  		if !isRepeatableError(err) {
  7162  			return err
  7163  		}
  7164  		tries++
  7165  		if tries >= 3 {
  7166  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7167  			return err
  7168  		}
  7169  	}
  7170  
  7171  }
  7172  
  7173  func (s *RetryLayerRetentionPolicyStore) Save(policy *model.RetentionPolicyWithTeamAndChannelIDs) (*model.RetentionPolicyWithTeamAndChannelCounts, error) {
  7174  
  7175  	tries := 0
  7176  	for {
  7177  		result, err := s.RetentionPolicyStore.Save(policy)
  7178  		if err == nil {
  7179  			return result, nil
  7180  		}
  7181  		if !isRepeatableError(err) {
  7182  			return result, err
  7183  		}
  7184  		tries++
  7185  		if tries >= 3 {
  7186  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7187  			return result, err
  7188  		}
  7189  	}
  7190  
  7191  }
  7192  
  7193  func (s *RetryLayerRoleStore) AllChannelSchemeRoles() ([]*model.Role, error) {
  7194  
  7195  	tries := 0
  7196  	for {
  7197  		result, err := s.RoleStore.AllChannelSchemeRoles()
  7198  		if err == nil {
  7199  			return result, nil
  7200  		}
  7201  		if !isRepeatableError(err) {
  7202  			return result, err
  7203  		}
  7204  		tries++
  7205  		if tries >= 3 {
  7206  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7207  			return result, err
  7208  		}
  7209  	}
  7210  
  7211  }
  7212  
  7213  func (s *RetryLayerRoleStore) ChannelHigherScopedPermissions(roleNames []string) (map[string]*model.RolePermissions, error) {
  7214  
  7215  	tries := 0
  7216  	for {
  7217  		result, err := s.RoleStore.ChannelHigherScopedPermissions(roleNames)
  7218  		if err == nil {
  7219  			return result, nil
  7220  		}
  7221  		if !isRepeatableError(err) {
  7222  			return result, err
  7223  		}
  7224  		tries++
  7225  		if tries >= 3 {
  7226  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7227  			return result, err
  7228  		}
  7229  	}
  7230  
  7231  }
  7232  
  7233  func (s *RetryLayerRoleStore) ChannelRolesUnderTeamRole(roleName string) ([]*model.Role, error) {
  7234  
  7235  	tries := 0
  7236  	for {
  7237  		result, err := s.RoleStore.ChannelRolesUnderTeamRole(roleName)
  7238  		if err == nil {
  7239  			return result, nil
  7240  		}
  7241  		if !isRepeatableError(err) {
  7242  			return result, err
  7243  		}
  7244  		tries++
  7245  		if tries >= 3 {
  7246  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7247  			return result, err
  7248  		}
  7249  	}
  7250  
  7251  }
  7252  
  7253  func (s *RetryLayerRoleStore) Delete(roleID string) (*model.Role, error) {
  7254  
  7255  	tries := 0
  7256  	for {
  7257  		result, err := s.RoleStore.Delete(roleID)
  7258  		if err == nil {
  7259  			return result, nil
  7260  		}
  7261  		if !isRepeatableError(err) {
  7262  			return result, err
  7263  		}
  7264  		tries++
  7265  		if tries >= 3 {
  7266  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7267  			return result, err
  7268  		}
  7269  	}
  7270  
  7271  }
  7272  
  7273  func (s *RetryLayerRoleStore) Get(roleID string) (*model.Role, error) {
  7274  
  7275  	tries := 0
  7276  	for {
  7277  		result, err := s.RoleStore.Get(roleID)
  7278  		if err == nil {
  7279  			return result, nil
  7280  		}
  7281  		if !isRepeatableError(err) {
  7282  			return result, err
  7283  		}
  7284  		tries++
  7285  		if tries >= 3 {
  7286  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7287  			return result, err
  7288  		}
  7289  	}
  7290  
  7291  }
  7292  
  7293  func (s *RetryLayerRoleStore) GetAll() ([]*model.Role, error) {
  7294  
  7295  	tries := 0
  7296  	for {
  7297  		result, err := s.RoleStore.GetAll()
  7298  		if err == nil {
  7299  			return result, nil
  7300  		}
  7301  		if !isRepeatableError(err) {
  7302  			return result, err
  7303  		}
  7304  		tries++
  7305  		if tries >= 3 {
  7306  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7307  			return result, err
  7308  		}
  7309  	}
  7310  
  7311  }
  7312  
  7313  func (s *RetryLayerRoleStore) GetByName(ctx context.Context, name string) (*model.Role, error) {
  7314  
  7315  	tries := 0
  7316  	for {
  7317  		result, err := s.RoleStore.GetByName(ctx, name)
  7318  		if err == nil {
  7319  			return result, nil
  7320  		}
  7321  		if !isRepeatableError(err) {
  7322  			return result, err
  7323  		}
  7324  		tries++
  7325  		if tries >= 3 {
  7326  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7327  			return result, err
  7328  		}
  7329  	}
  7330  
  7331  }
  7332  
  7333  func (s *RetryLayerRoleStore) GetByNames(names []string) ([]*model.Role, error) {
  7334  
  7335  	tries := 0
  7336  	for {
  7337  		result, err := s.RoleStore.GetByNames(names)
  7338  		if err == nil {
  7339  			return result, nil
  7340  		}
  7341  		if !isRepeatableError(err) {
  7342  			return result, err
  7343  		}
  7344  		tries++
  7345  		if tries >= 3 {
  7346  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7347  			return result, err
  7348  		}
  7349  	}
  7350  
  7351  }
  7352  
  7353  func (s *RetryLayerRoleStore) PermanentDeleteAll() error {
  7354  
  7355  	tries := 0
  7356  	for {
  7357  		err := s.RoleStore.PermanentDeleteAll()
  7358  		if err == nil {
  7359  			return nil
  7360  		}
  7361  		if !isRepeatableError(err) {
  7362  			return err
  7363  		}
  7364  		tries++
  7365  		if tries >= 3 {
  7366  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7367  			return err
  7368  		}
  7369  	}
  7370  
  7371  }
  7372  
  7373  func (s *RetryLayerRoleStore) Save(role *model.Role) (*model.Role, error) {
  7374  
  7375  	tries := 0
  7376  	for {
  7377  		result, err := s.RoleStore.Save(role)
  7378  		if err == nil {
  7379  			return result, nil
  7380  		}
  7381  		if !isRepeatableError(err) {
  7382  			return result, err
  7383  		}
  7384  		tries++
  7385  		if tries >= 3 {
  7386  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7387  			return result, err
  7388  		}
  7389  	}
  7390  
  7391  }
  7392  
  7393  func (s *RetryLayerSchemeStore) CountByScope(scope string) (int64, error) {
  7394  
  7395  	tries := 0
  7396  	for {
  7397  		result, err := s.SchemeStore.CountByScope(scope)
  7398  		if err == nil {
  7399  			return result, nil
  7400  		}
  7401  		if !isRepeatableError(err) {
  7402  			return result, err
  7403  		}
  7404  		tries++
  7405  		if tries >= 3 {
  7406  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7407  			return result, err
  7408  		}
  7409  	}
  7410  
  7411  }
  7412  
  7413  func (s *RetryLayerSchemeStore) CountWithoutPermission(scope string, permissionID string, roleScope model.RoleScope, roleType model.RoleType) (int64, error) {
  7414  
  7415  	tries := 0
  7416  	for {
  7417  		result, err := s.SchemeStore.CountWithoutPermission(scope, permissionID, roleScope, roleType)
  7418  		if err == nil {
  7419  			return result, nil
  7420  		}
  7421  		if !isRepeatableError(err) {
  7422  			return result, err
  7423  		}
  7424  		tries++
  7425  		if tries >= 3 {
  7426  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7427  			return result, err
  7428  		}
  7429  	}
  7430  
  7431  }
  7432  
  7433  func (s *RetryLayerSchemeStore) Delete(schemeID string) (*model.Scheme, error) {
  7434  
  7435  	tries := 0
  7436  	for {
  7437  		result, err := s.SchemeStore.Delete(schemeID)
  7438  		if err == nil {
  7439  			return result, nil
  7440  		}
  7441  		if !isRepeatableError(err) {
  7442  			return result, err
  7443  		}
  7444  		tries++
  7445  		if tries >= 3 {
  7446  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7447  			return result, err
  7448  		}
  7449  	}
  7450  
  7451  }
  7452  
  7453  func (s *RetryLayerSchemeStore) Get(schemeID string) (*model.Scheme, error) {
  7454  
  7455  	tries := 0
  7456  	for {
  7457  		result, err := s.SchemeStore.Get(schemeID)
  7458  		if err == nil {
  7459  			return result, nil
  7460  		}
  7461  		if !isRepeatableError(err) {
  7462  			return result, err
  7463  		}
  7464  		tries++
  7465  		if tries >= 3 {
  7466  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7467  			return result, err
  7468  		}
  7469  	}
  7470  
  7471  }
  7472  
  7473  func (s *RetryLayerSchemeStore) GetAllPage(scope string, offset int, limit int) ([]*model.Scheme, error) {
  7474  
  7475  	tries := 0
  7476  	for {
  7477  		result, err := s.SchemeStore.GetAllPage(scope, offset, limit)
  7478  		if err == nil {
  7479  			return result, nil
  7480  		}
  7481  		if !isRepeatableError(err) {
  7482  			return result, err
  7483  		}
  7484  		tries++
  7485  		if tries >= 3 {
  7486  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7487  			return result, err
  7488  		}
  7489  	}
  7490  
  7491  }
  7492  
  7493  func (s *RetryLayerSchemeStore) GetByName(schemeName string) (*model.Scheme, error) {
  7494  
  7495  	tries := 0
  7496  	for {
  7497  		result, err := s.SchemeStore.GetByName(schemeName)
  7498  		if err == nil {
  7499  			return result, nil
  7500  		}
  7501  		if !isRepeatableError(err) {
  7502  			return result, err
  7503  		}
  7504  		tries++
  7505  		if tries >= 3 {
  7506  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7507  			return result, err
  7508  		}
  7509  	}
  7510  
  7511  }
  7512  
  7513  func (s *RetryLayerSchemeStore) PermanentDeleteAll() error {
  7514  
  7515  	tries := 0
  7516  	for {
  7517  		err := s.SchemeStore.PermanentDeleteAll()
  7518  		if err == nil {
  7519  			return nil
  7520  		}
  7521  		if !isRepeatableError(err) {
  7522  			return err
  7523  		}
  7524  		tries++
  7525  		if tries >= 3 {
  7526  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7527  			return err
  7528  		}
  7529  	}
  7530  
  7531  }
  7532  
  7533  func (s *RetryLayerSchemeStore) Save(scheme *model.Scheme) (*model.Scheme, error) {
  7534  
  7535  	tries := 0
  7536  	for {
  7537  		result, err := s.SchemeStore.Save(scheme)
  7538  		if err == nil {
  7539  			return result, nil
  7540  		}
  7541  		if !isRepeatableError(err) {
  7542  			return result, err
  7543  		}
  7544  		tries++
  7545  		if tries >= 3 {
  7546  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7547  			return result, err
  7548  		}
  7549  	}
  7550  
  7551  }
  7552  
  7553  func (s *RetryLayerSessionStore) AnalyticsSessionCount() (int64, error) {
  7554  
  7555  	tries := 0
  7556  	for {
  7557  		result, err := s.SessionStore.AnalyticsSessionCount()
  7558  		if err == nil {
  7559  			return result, nil
  7560  		}
  7561  		if !isRepeatableError(err) {
  7562  			return result, err
  7563  		}
  7564  		tries++
  7565  		if tries >= 3 {
  7566  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7567  			return result, err
  7568  		}
  7569  	}
  7570  
  7571  }
  7572  
  7573  func (s *RetryLayerSessionStore) Cleanup(expiryTime int64, batchSize int64) {
  7574  
  7575  	s.SessionStore.Cleanup(expiryTime, batchSize)
  7576  
  7577  }
  7578  
  7579  func (s *RetryLayerSessionStore) Get(ctx context.Context, sessionIDOrToken string) (*model.Session, error) {
  7580  
  7581  	tries := 0
  7582  	for {
  7583  		result, err := s.SessionStore.Get(ctx, sessionIDOrToken)
  7584  		if err == nil {
  7585  			return result, nil
  7586  		}
  7587  		if !isRepeatableError(err) {
  7588  			return result, err
  7589  		}
  7590  		tries++
  7591  		if tries >= 3 {
  7592  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7593  			return result, err
  7594  		}
  7595  	}
  7596  
  7597  }
  7598  
  7599  func (s *RetryLayerSessionStore) GetSessions(userID string) ([]*model.Session, error) {
  7600  
  7601  	tries := 0
  7602  	for {
  7603  		result, err := s.SessionStore.GetSessions(userID)
  7604  		if err == nil {
  7605  			return result, nil
  7606  		}
  7607  		if !isRepeatableError(err) {
  7608  			return result, err
  7609  		}
  7610  		tries++
  7611  		if tries >= 3 {
  7612  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7613  			return result, err
  7614  		}
  7615  	}
  7616  
  7617  }
  7618  
  7619  func (s *RetryLayerSessionStore) GetSessionsExpired(thresholdMillis int64, mobileOnly bool, unnotifiedOnly bool) ([]*model.Session, error) {
  7620  
  7621  	tries := 0
  7622  	for {
  7623  		result, err := s.SessionStore.GetSessionsExpired(thresholdMillis, mobileOnly, unnotifiedOnly)
  7624  		if err == nil {
  7625  			return result, nil
  7626  		}
  7627  		if !isRepeatableError(err) {
  7628  			return result, err
  7629  		}
  7630  		tries++
  7631  		if tries >= 3 {
  7632  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7633  			return result, err
  7634  		}
  7635  	}
  7636  
  7637  }
  7638  
  7639  func (s *RetryLayerSessionStore) GetSessionsWithActiveDeviceIds(userID string) ([]*model.Session, error) {
  7640  
  7641  	tries := 0
  7642  	for {
  7643  		result, err := s.SessionStore.GetSessionsWithActiveDeviceIds(userID)
  7644  		if err == nil {
  7645  			return result, nil
  7646  		}
  7647  		if !isRepeatableError(err) {
  7648  			return result, err
  7649  		}
  7650  		tries++
  7651  		if tries >= 3 {
  7652  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7653  			return result, err
  7654  		}
  7655  	}
  7656  
  7657  }
  7658  
  7659  func (s *RetryLayerSessionStore) PermanentDeleteSessionsByUser(teamID string) error {
  7660  
  7661  	tries := 0
  7662  	for {
  7663  		err := s.SessionStore.PermanentDeleteSessionsByUser(teamID)
  7664  		if err == nil {
  7665  			return nil
  7666  		}
  7667  		if !isRepeatableError(err) {
  7668  			return err
  7669  		}
  7670  		tries++
  7671  		if tries >= 3 {
  7672  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7673  			return err
  7674  		}
  7675  	}
  7676  
  7677  }
  7678  
  7679  func (s *RetryLayerSessionStore) Remove(sessionIDOrToken string) error {
  7680  
  7681  	tries := 0
  7682  	for {
  7683  		err := s.SessionStore.Remove(sessionIDOrToken)
  7684  		if err == nil {
  7685  			return nil
  7686  		}
  7687  		if !isRepeatableError(err) {
  7688  			return err
  7689  		}
  7690  		tries++
  7691  		if tries >= 3 {
  7692  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7693  			return err
  7694  		}
  7695  	}
  7696  
  7697  }
  7698  
  7699  func (s *RetryLayerSessionStore) RemoveAllSessions() error {
  7700  
  7701  	tries := 0
  7702  	for {
  7703  		err := s.SessionStore.RemoveAllSessions()
  7704  		if err == nil {
  7705  			return nil
  7706  		}
  7707  		if !isRepeatableError(err) {
  7708  			return err
  7709  		}
  7710  		tries++
  7711  		if tries >= 3 {
  7712  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7713  			return err
  7714  		}
  7715  	}
  7716  
  7717  }
  7718  
  7719  func (s *RetryLayerSessionStore) Save(session *model.Session) (*model.Session, error) {
  7720  
  7721  	tries := 0
  7722  	for {
  7723  		result, err := s.SessionStore.Save(session)
  7724  		if err == nil {
  7725  			return result, nil
  7726  		}
  7727  		if !isRepeatableError(err) {
  7728  			return result, err
  7729  		}
  7730  		tries++
  7731  		if tries >= 3 {
  7732  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7733  			return result, err
  7734  		}
  7735  	}
  7736  
  7737  }
  7738  
  7739  func (s *RetryLayerSessionStore) UpdateDeviceId(id string, deviceID string, expiresAt int64) (string, error) {
  7740  
  7741  	tries := 0
  7742  	for {
  7743  		result, err := s.SessionStore.UpdateDeviceId(id, deviceID, expiresAt)
  7744  		if err == nil {
  7745  			return result, nil
  7746  		}
  7747  		if !isRepeatableError(err) {
  7748  			return result, err
  7749  		}
  7750  		tries++
  7751  		if tries >= 3 {
  7752  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7753  			return result, err
  7754  		}
  7755  	}
  7756  
  7757  }
  7758  
  7759  func (s *RetryLayerSessionStore) UpdateExpiredNotify(sessionid string, notified bool) error {
  7760  
  7761  	tries := 0
  7762  	for {
  7763  		err := s.SessionStore.UpdateExpiredNotify(sessionid, notified)
  7764  		if err == nil {
  7765  			return nil
  7766  		}
  7767  		if !isRepeatableError(err) {
  7768  			return err
  7769  		}
  7770  		tries++
  7771  		if tries >= 3 {
  7772  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7773  			return err
  7774  		}
  7775  	}
  7776  
  7777  }
  7778  
  7779  func (s *RetryLayerSessionStore) UpdateExpiresAt(sessionID string, time int64) error {
  7780  
  7781  	tries := 0
  7782  	for {
  7783  		err := s.SessionStore.UpdateExpiresAt(sessionID, time)
  7784  		if err == nil {
  7785  			return nil
  7786  		}
  7787  		if !isRepeatableError(err) {
  7788  			return err
  7789  		}
  7790  		tries++
  7791  		if tries >= 3 {
  7792  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7793  			return err
  7794  		}
  7795  	}
  7796  
  7797  }
  7798  
  7799  func (s *RetryLayerSessionStore) UpdateLastActivityAt(sessionID string, time int64) error {
  7800  
  7801  	tries := 0
  7802  	for {
  7803  		err := s.SessionStore.UpdateLastActivityAt(sessionID, time)
  7804  		if err == nil {
  7805  			return nil
  7806  		}
  7807  		if !isRepeatableError(err) {
  7808  			return err
  7809  		}
  7810  		tries++
  7811  		if tries >= 3 {
  7812  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7813  			return err
  7814  		}
  7815  	}
  7816  
  7817  }
  7818  
  7819  func (s *RetryLayerSessionStore) UpdateProps(session *model.Session) error {
  7820  
  7821  	tries := 0
  7822  	for {
  7823  		err := s.SessionStore.UpdateProps(session)
  7824  		if err == nil {
  7825  			return nil
  7826  		}
  7827  		if !isRepeatableError(err) {
  7828  			return err
  7829  		}
  7830  		tries++
  7831  		if tries >= 3 {
  7832  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7833  			return err
  7834  		}
  7835  	}
  7836  
  7837  }
  7838  
  7839  func (s *RetryLayerSessionStore) UpdateRoles(userID string, roles string) (string, error) {
  7840  
  7841  	tries := 0
  7842  	for {
  7843  		result, err := s.SessionStore.UpdateRoles(userID, roles)
  7844  		if err == nil {
  7845  			return result, nil
  7846  		}
  7847  		if !isRepeatableError(err) {
  7848  			return result, err
  7849  		}
  7850  		tries++
  7851  		if tries >= 3 {
  7852  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7853  			return result, err
  7854  		}
  7855  	}
  7856  
  7857  }
  7858  
  7859  func (s *RetryLayerSharedChannelStore) Delete(channelId string) (bool, error) {
  7860  
  7861  	tries := 0
  7862  	for {
  7863  		result, err := s.SharedChannelStore.Delete(channelId)
  7864  		if err == nil {
  7865  			return result, nil
  7866  		}
  7867  		if !isRepeatableError(err) {
  7868  			return result, err
  7869  		}
  7870  		tries++
  7871  		if tries >= 3 {
  7872  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7873  			return result, err
  7874  		}
  7875  	}
  7876  
  7877  }
  7878  
  7879  func (s *RetryLayerSharedChannelStore) DeleteRemote(remoteId string) (bool, error) {
  7880  
  7881  	tries := 0
  7882  	for {
  7883  		result, err := s.SharedChannelStore.DeleteRemote(remoteId)
  7884  		if err == nil {
  7885  			return result, nil
  7886  		}
  7887  		if !isRepeatableError(err) {
  7888  			return result, err
  7889  		}
  7890  		tries++
  7891  		if tries >= 3 {
  7892  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7893  			return result, err
  7894  		}
  7895  	}
  7896  
  7897  }
  7898  
  7899  func (s *RetryLayerSharedChannelStore) Get(channelId string) (*model.SharedChannel, error) {
  7900  
  7901  	tries := 0
  7902  	for {
  7903  		result, err := s.SharedChannelStore.Get(channelId)
  7904  		if err == nil {
  7905  			return result, nil
  7906  		}
  7907  		if !isRepeatableError(err) {
  7908  			return result, err
  7909  		}
  7910  		tries++
  7911  		if tries >= 3 {
  7912  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7913  			return result, err
  7914  		}
  7915  	}
  7916  
  7917  }
  7918  
  7919  func (s *RetryLayerSharedChannelStore) GetAll(offset int, limit int, opts model.SharedChannelFilterOpts) ([]*model.SharedChannel, error) {
  7920  
  7921  	tries := 0
  7922  	for {
  7923  		result, err := s.SharedChannelStore.GetAll(offset, limit, opts)
  7924  		if err == nil {
  7925  			return result, nil
  7926  		}
  7927  		if !isRepeatableError(err) {
  7928  			return result, err
  7929  		}
  7930  		tries++
  7931  		if tries >= 3 {
  7932  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7933  			return result, err
  7934  		}
  7935  	}
  7936  
  7937  }
  7938  
  7939  func (s *RetryLayerSharedChannelStore) GetAllCount(opts model.SharedChannelFilterOpts) (int64, error) {
  7940  
  7941  	tries := 0
  7942  	for {
  7943  		result, err := s.SharedChannelStore.GetAllCount(opts)
  7944  		if err == nil {
  7945  			return result, nil
  7946  		}
  7947  		if !isRepeatableError(err) {
  7948  			return result, err
  7949  		}
  7950  		tries++
  7951  		if tries >= 3 {
  7952  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7953  			return result, err
  7954  		}
  7955  	}
  7956  
  7957  }
  7958  
  7959  func (s *RetryLayerSharedChannelStore) GetAttachment(fileId string, remoteId string) (*model.SharedChannelAttachment, error) {
  7960  
  7961  	tries := 0
  7962  	for {
  7963  		result, err := s.SharedChannelStore.GetAttachment(fileId, remoteId)
  7964  		if err == nil {
  7965  			return result, nil
  7966  		}
  7967  		if !isRepeatableError(err) {
  7968  			return result, err
  7969  		}
  7970  		tries++
  7971  		if tries >= 3 {
  7972  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7973  			return result, err
  7974  		}
  7975  	}
  7976  
  7977  }
  7978  
  7979  func (s *RetryLayerSharedChannelStore) GetRemote(id string) (*model.SharedChannelRemote, error) {
  7980  
  7981  	tries := 0
  7982  	for {
  7983  		result, err := s.SharedChannelStore.GetRemote(id)
  7984  		if err == nil {
  7985  			return result, nil
  7986  		}
  7987  		if !isRepeatableError(err) {
  7988  			return result, err
  7989  		}
  7990  		tries++
  7991  		if tries >= 3 {
  7992  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  7993  			return result, err
  7994  		}
  7995  	}
  7996  
  7997  }
  7998  
  7999  func (s *RetryLayerSharedChannelStore) GetRemoteByIds(channelId string, remoteId string) (*model.SharedChannelRemote, error) {
  8000  
  8001  	tries := 0
  8002  	for {
  8003  		result, err := s.SharedChannelStore.GetRemoteByIds(channelId, remoteId)
  8004  		if err == nil {
  8005  			return result, nil
  8006  		}
  8007  		if !isRepeatableError(err) {
  8008  			return result, err
  8009  		}
  8010  		tries++
  8011  		if tries >= 3 {
  8012  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8013  			return result, err
  8014  		}
  8015  	}
  8016  
  8017  }
  8018  
  8019  func (s *RetryLayerSharedChannelStore) GetRemoteForUser(remoteId string, userId string) (*model.RemoteCluster, error) {
  8020  
  8021  	tries := 0
  8022  	for {
  8023  		result, err := s.SharedChannelStore.GetRemoteForUser(remoteId, userId)
  8024  		if err == nil {
  8025  			return result, nil
  8026  		}
  8027  		if !isRepeatableError(err) {
  8028  			return result, err
  8029  		}
  8030  		tries++
  8031  		if tries >= 3 {
  8032  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8033  			return result, err
  8034  		}
  8035  	}
  8036  
  8037  }
  8038  
  8039  func (s *RetryLayerSharedChannelStore) GetRemotes(opts model.SharedChannelRemoteFilterOpts) ([]*model.SharedChannelRemote, error) {
  8040  
  8041  	tries := 0
  8042  	for {
  8043  		result, err := s.SharedChannelStore.GetRemotes(opts)
  8044  		if err == nil {
  8045  			return result, nil
  8046  		}
  8047  		if !isRepeatableError(err) {
  8048  			return result, err
  8049  		}
  8050  		tries++
  8051  		if tries >= 3 {
  8052  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8053  			return result, err
  8054  		}
  8055  	}
  8056  
  8057  }
  8058  
  8059  func (s *RetryLayerSharedChannelStore) GetRemotesStatus(channelId string) ([]*model.SharedChannelRemoteStatus, error) {
  8060  
  8061  	tries := 0
  8062  	for {
  8063  		result, err := s.SharedChannelStore.GetRemotesStatus(channelId)
  8064  		if err == nil {
  8065  			return result, nil
  8066  		}
  8067  		if !isRepeatableError(err) {
  8068  			return result, err
  8069  		}
  8070  		tries++
  8071  		if tries >= 3 {
  8072  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8073  			return result, err
  8074  		}
  8075  	}
  8076  
  8077  }
  8078  
  8079  func (s *RetryLayerSharedChannelStore) GetSingleUser(userID string, channelID string, remoteID string) (*model.SharedChannelUser, error) {
  8080  
  8081  	tries := 0
  8082  	for {
  8083  		result, err := s.SharedChannelStore.GetSingleUser(userID, channelID, remoteID)
  8084  		if err == nil {
  8085  			return result, nil
  8086  		}
  8087  		if !isRepeatableError(err) {
  8088  			return result, err
  8089  		}
  8090  		tries++
  8091  		if tries >= 3 {
  8092  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8093  			return result, err
  8094  		}
  8095  	}
  8096  
  8097  }
  8098  
  8099  func (s *RetryLayerSharedChannelStore) GetUsersForSync(filter model.GetUsersForSyncFilter) ([]*model.User, error) {
  8100  
  8101  	tries := 0
  8102  	for {
  8103  		result, err := s.SharedChannelStore.GetUsersForSync(filter)
  8104  		if err == nil {
  8105  			return result, nil
  8106  		}
  8107  		if !isRepeatableError(err) {
  8108  			return result, err
  8109  		}
  8110  		tries++
  8111  		if tries >= 3 {
  8112  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8113  			return result, err
  8114  		}
  8115  	}
  8116  
  8117  }
  8118  
  8119  func (s *RetryLayerSharedChannelStore) GetUsersForUser(userID string) ([]*model.SharedChannelUser, error) {
  8120  
  8121  	tries := 0
  8122  	for {
  8123  		result, err := s.SharedChannelStore.GetUsersForUser(userID)
  8124  		if err == nil {
  8125  			return result, nil
  8126  		}
  8127  		if !isRepeatableError(err) {
  8128  			return result, err
  8129  		}
  8130  		tries++
  8131  		if tries >= 3 {
  8132  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8133  			return result, err
  8134  		}
  8135  	}
  8136  
  8137  }
  8138  
  8139  func (s *RetryLayerSharedChannelStore) HasChannel(channelID string) (bool, error) {
  8140  
  8141  	tries := 0
  8142  	for {
  8143  		result, err := s.SharedChannelStore.HasChannel(channelID)
  8144  		if err == nil {
  8145  			return result, nil
  8146  		}
  8147  		if !isRepeatableError(err) {
  8148  			return result, err
  8149  		}
  8150  		tries++
  8151  		if tries >= 3 {
  8152  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8153  			return result, err
  8154  		}
  8155  	}
  8156  
  8157  }
  8158  
  8159  func (s *RetryLayerSharedChannelStore) HasRemote(channelID string, remoteId string) (bool, error) {
  8160  
  8161  	tries := 0
  8162  	for {
  8163  		result, err := s.SharedChannelStore.HasRemote(channelID, remoteId)
  8164  		if err == nil {
  8165  			return result, nil
  8166  		}
  8167  		if !isRepeatableError(err) {
  8168  			return result, err
  8169  		}
  8170  		tries++
  8171  		if tries >= 3 {
  8172  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8173  			return result, err
  8174  		}
  8175  	}
  8176  
  8177  }
  8178  
  8179  func (s *RetryLayerSharedChannelStore) Save(sc *model.SharedChannel) (*model.SharedChannel, error) {
  8180  
  8181  	tries := 0
  8182  	for {
  8183  		result, err := s.SharedChannelStore.Save(sc)
  8184  		if err == nil {
  8185  			return result, nil
  8186  		}
  8187  		if !isRepeatableError(err) {
  8188  			return result, err
  8189  		}
  8190  		tries++
  8191  		if tries >= 3 {
  8192  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8193  			return result, err
  8194  		}
  8195  	}
  8196  
  8197  }
  8198  
  8199  func (s *RetryLayerSharedChannelStore) SaveAttachment(remote *model.SharedChannelAttachment) (*model.SharedChannelAttachment, error) {
  8200  
  8201  	tries := 0
  8202  	for {
  8203  		result, err := s.SharedChannelStore.SaveAttachment(remote)
  8204  		if err == nil {
  8205  			return result, nil
  8206  		}
  8207  		if !isRepeatableError(err) {
  8208  			return result, err
  8209  		}
  8210  		tries++
  8211  		if tries >= 3 {
  8212  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8213  			return result, err
  8214  		}
  8215  	}
  8216  
  8217  }
  8218  
  8219  func (s *RetryLayerSharedChannelStore) SaveRemote(remote *model.SharedChannelRemote) (*model.SharedChannelRemote, error) {
  8220  
  8221  	tries := 0
  8222  	for {
  8223  		result, err := s.SharedChannelStore.SaveRemote(remote)
  8224  		if err == nil {
  8225  			return result, nil
  8226  		}
  8227  		if !isRepeatableError(err) {
  8228  			return result, err
  8229  		}
  8230  		tries++
  8231  		if tries >= 3 {
  8232  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8233  			return result, err
  8234  		}
  8235  	}
  8236  
  8237  }
  8238  
  8239  func (s *RetryLayerSharedChannelStore) SaveUser(remote *model.SharedChannelUser) (*model.SharedChannelUser, error) {
  8240  
  8241  	tries := 0
  8242  	for {
  8243  		result, err := s.SharedChannelStore.SaveUser(remote)
  8244  		if err == nil {
  8245  			return result, nil
  8246  		}
  8247  		if !isRepeatableError(err) {
  8248  			return result, err
  8249  		}
  8250  		tries++
  8251  		if tries >= 3 {
  8252  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8253  			return result, err
  8254  		}
  8255  	}
  8256  
  8257  }
  8258  
  8259  func (s *RetryLayerSharedChannelStore) Update(sc *model.SharedChannel) (*model.SharedChannel, error) {
  8260  
  8261  	tries := 0
  8262  	for {
  8263  		result, err := s.SharedChannelStore.Update(sc)
  8264  		if err == nil {
  8265  			return result, nil
  8266  		}
  8267  		if !isRepeatableError(err) {
  8268  			return result, err
  8269  		}
  8270  		tries++
  8271  		if tries >= 3 {
  8272  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8273  			return result, err
  8274  		}
  8275  	}
  8276  
  8277  }
  8278  
  8279  func (s *RetryLayerSharedChannelStore) UpdateAttachmentLastSyncAt(id string, syncTime int64) error {
  8280  
  8281  	tries := 0
  8282  	for {
  8283  		err := s.SharedChannelStore.UpdateAttachmentLastSyncAt(id, syncTime)
  8284  		if err == nil {
  8285  			return nil
  8286  		}
  8287  		if !isRepeatableError(err) {
  8288  			return err
  8289  		}
  8290  		tries++
  8291  		if tries >= 3 {
  8292  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8293  			return err
  8294  		}
  8295  	}
  8296  
  8297  }
  8298  
  8299  func (s *RetryLayerSharedChannelStore) UpdateRemote(remote *model.SharedChannelRemote) (*model.SharedChannelRemote, error) {
  8300  
  8301  	tries := 0
  8302  	for {
  8303  		result, err := s.SharedChannelStore.UpdateRemote(remote)
  8304  		if err == nil {
  8305  			return result, nil
  8306  		}
  8307  		if !isRepeatableError(err) {
  8308  			return result, err
  8309  		}
  8310  		tries++
  8311  		if tries >= 3 {
  8312  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8313  			return result, err
  8314  		}
  8315  	}
  8316  
  8317  }
  8318  
  8319  func (s *RetryLayerSharedChannelStore) UpdateRemoteCursor(id string, cursor model.GetPostsSinceForSyncCursor) error {
  8320  
  8321  	tries := 0
  8322  	for {
  8323  		err := s.SharedChannelStore.UpdateRemoteCursor(id, cursor)
  8324  		if err == nil {
  8325  			return nil
  8326  		}
  8327  		if !isRepeatableError(err) {
  8328  			return err
  8329  		}
  8330  		tries++
  8331  		if tries >= 3 {
  8332  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8333  			return err
  8334  		}
  8335  	}
  8336  
  8337  }
  8338  
  8339  func (s *RetryLayerSharedChannelStore) UpdateUserLastSyncAt(userID string, channelID string, remoteID string) error {
  8340  
  8341  	tries := 0
  8342  	for {
  8343  		err := s.SharedChannelStore.UpdateUserLastSyncAt(userID, channelID, remoteID)
  8344  		if err == nil {
  8345  			return nil
  8346  		}
  8347  		if !isRepeatableError(err) {
  8348  			return err
  8349  		}
  8350  		tries++
  8351  		if tries >= 3 {
  8352  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8353  			return err
  8354  		}
  8355  	}
  8356  
  8357  }
  8358  
  8359  func (s *RetryLayerSharedChannelStore) UpsertAttachment(remote *model.SharedChannelAttachment) (string, error) {
  8360  
  8361  	tries := 0
  8362  	for {
  8363  		result, err := s.SharedChannelStore.UpsertAttachment(remote)
  8364  		if err == nil {
  8365  			return result, nil
  8366  		}
  8367  		if !isRepeatableError(err) {
  8368  			return result, err
  8369  		}
  8370  		tries++
  8371  		if tries >= 3 {
  8372  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8373  			return result, err
  8374  		}
  8375  	}
  8376  
  8377  }
  8378  
  8379  func (s *RetryLayerStatusStore) Get(userID string) (*model.Status, error) {
  8380  
  8381  	tries := 0
  8382  	for {
  8383  		result, err := s.StatusStore.Get(userID)
  8384  		if err == nil {
  8385  			return result, nil
  8386  		}
  8387  		if !isRepeatableError(err) {
  8388  			return result, err
  8389  		}
  8390  		tries++
  8391  		if tries >= 3 {
  8392  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8393  			return result, err
  8394  		}
  8395  	}
  8396  
  8397  }
  8398  
  8399  func (s *RetryLayerStatusStore) GetByIds(userIds []string) ([]*model.Status, error) {
  8400  
  8401  	tries := 0
  8402  	for {
  8403  		result, err := s.StatusStore.GetByIds(userIds)
  8404  		if err == nil {
  8405  			return result, nil
  8406  		}
  8407  		if !isRepeatableError(err) {
  8408  			return result, err
  8409  		}
  8410  		tries++
  8411  		if tries >= 3 {
  8412  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8413  			return result, err
  8414  		}
  8415  	}
  8416  
  8417  }
  8418  
  8419  func (s *RetryLayerStatusStore) GetTotalActiveUsersCount() (int64, error) {
  8420  
  8421  	tries := 0
  8422  	for {
  8423  		result, err := s.StatusStore.GetTotalActiveUsersCount()
  8424  		if err == nil {
  8425  			return result, nil
  8426  		}
  8427  		if !isRepeatableError(err) {
  8428  			return result, err
  8429  		}
  8430  		tries++
  8431  		if tries >= 3 {
  8432  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8433  			return result, err
  8434  		}
  8435  	}
  8436  
  8437  }
  8438  
  8439  func (s *RetryLayerStatusStore) ResetAll() error {
  8440  
  8441  	tries := 0
  8442  	for {
  8443  		err := s.StatusStore.ResetAll()
  8444  		if err == nil {
  8445  			return nil
  8446  		}
  8447  		if !isRepeatableError(err) {
  8448  			return err
  8449  		}
  8450  		tries++
  8451  		if tries >= 3 {
  8452  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8453  			return err
  8454  		}
  8455  	}
  8456  
  8457  }
  8458  
  8459  func (s *RetryLayerStatusStore) SaveOrUpdate(status *model.Status) error {
  8460  
  8461  	tries := 0
  8462  	for {
  8463  		err := s.StatusStore.SaveOrUpdate(status)
  8464  		if err == nil {
  8465  			return nil
  8466  		}
  8467  		if !isRepeatableError(err) {
  8468  			return err
  8469  		}
  8470  		tries++
  8471  		if tries >= 3 {
  8472  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8473  			return err
  8474  		}
  8475  	}
  8476  
  8477  }
  8478  
  8479  func (s *RetryLayerStatusStore) UpdateExpiredDNDStatuses() ([]*model.Status, error) {
  8480  
  8481  	tries := 0
  8482  	for {
  8483  		result, err := s.StatusStore.UpdateExpiredDNDStatuses()
  8484  		if err == nil {
  8485  			return result, nil
  8486  		}
  8487  		if !isRepeatableError(err) {
  8488  			return result, err
  8489  		}
  8490  		tries++
  8491  		if tries >= 3 {
  8492  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8493  			return result, err
  8494  		}
  8495  	}
  8496  
  8497  }
  8498  
  8499  func (s *RetryLayerStatusStore) UpdateLastActivityAt(userID string, lastActivityAt int64) error {
  8500  
  8501  	tries := 0
  8502  	for {
  8503  		err := s.StatusStore.UpdateLastActivityAt(userID, lastActivityAt)
  8504  		if err == nil {
  8505  			return nil
  8506  		}
  8507  		if !isRepeatableError(err) {
  8508  			return err
  8509  		}
  8510  		tries++
  8511  		if tries >= 3 {
  8512  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8513  			return err
  8514  		}
  8515  	}
  8516  
  8517  }
  8518  
  8519  func (s *RetryLayerSystemStore) Get() (model.StringMap, error) {
  8520  
  8521  	tries := 0
  8522  	for {
  8523  		result, err := s.SystemStore.Get()
  8524  		if err == nil {
  8525  			return result, nil
  8526  		}
  8527  		if !isRepeatableError(err) {
  8528  			return result, err
  8529  		}
  8530  		tries++
  8531  		if tries >= 3 {
  8532  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8533  			return result, err
  8534  		}
  8535  	}
  8536  
  8537  }
  8538  
  8539  func (s *RetryLayerSystemStore) GetByName(name string) (*model.System, error) {
  8540  
  8541  	tries := 0
  8542  	for {
  8543  		result, err := s.SystemStore.GetByName(name)
  8544  		if err == nil {
  8545  			return result, nil
  8546  		}
  8547  		if !isRepeatableError(err) {
  8548  			return result, err
  8549  		}
  8550  		tries++
  8551  		if tries >= 3 {
  8552  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8553  			return result, err
  8554  		}
  8555  	}
  8556  
  8557  }
  8558  
  8559  func (s *RetryLayerSystemStore) InsertIfExists(system *model.System) (*model.System, error) {
  8560  
  8561  	tries := 0
  8562  	for {
  8563  		result, err := s.SystemStore.InsertIfExists(system)
  8564  		if err == nil {
  8565  			return result, nil
  8566  		}
  8567  		if !isRepeatableError(err) {
  8568  			return result, err
  8569  		}
  8570  		tries++
  8571  		if tries >= 3 {
  8572  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8573  			return result, err
  8574  		}
  8575  	}
  8576  
  8577  }
  8578  
  8579  func (s *RetryLayerSystemStore) PermanentDeleteByName(name string) (*model.System, error) {
  8580  
  8581  	tries := 0
  8582  	for {
  8583  		result, err := s.SystemStore.PermanentDeleteByName(name)
  8584  		if err == nil {
  8585  			return result, nil
  8586  		}
  8587  		if !isRepeatableError(err) {
  8588  			return result, err
  8589  		}
  8590  		tries++
  8591  		if tries >= 3 {
  8592  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8593  			return result, err
  8594  		}
  8595  	}
  8596  
  8597  }
  8598  
  8599  func (s *RetryLayerSystemStore) Save(system *model.System) error {
  8600  
  8601  	tries := 0
  8602  	for {
  8603  		err := s.SystemStore.Save(system)
  8604  		if err == nil {
  8605  			return nil
  8606  		}
  8607  		if !isRepeatableError(err) {
  8608  			return err
  8609  		}
  8610  		tries++
  8611  		if tries >= 3 {
  8612  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8613  			return err
  8614  		}
  8615  	}
  8616  
  8617  }
  8618  
  8619  func (s *RetryLayerSystemStore) SaveOrUpdate(system *model.System) error {
  8620  
  8621  	tries := 0
  8622  	for {
  8623  		err := s.SystemStore.SaveOrUpdate(system)
  8624  		if err == nil {
  8625  			return nil
  8626  		}
  8627  		if !isRepeatableError(err) {
  8628  			return err
  8629  		}
  8630  		tries++
  8631  		if tries >= 3 {
  8632  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8633  			return err
  8634  		}
  8635  	}
  8636  
  8637  }
  8638  
  8639  func (s *RetryLayerSystemStore) SaveOrUpdateWithWarnMetricHandling(system *model.System) error {
  8640  
  8641  	tries := 0
  8642  	for {
  8643  		err := s.SystemStore.SaveOrUpdateWithWarnMetricHandling(system)
  8644  		if err == nil {
  8645  			return nil
  8646  		}
  8647  		if !isRepeatableError(err) {
  8648  			return err
  8649  		}
  8650  		tries++
  8651  		if tries >= 3 {
  8652  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8653  			return err
  8654  		}
  8655  	}
  8656  
  8657  }
  8658  
  8659  func (s *RetryLayerSystemStore) Update(system *model.System) error {
  8660  
  8661  	tries := 0
  8662  	for {
  8663  		err := s.SystemStore.Update(system)
  8664  		if err == nil {
  8665  			return nil
  8666  		}
  8667  		if !isRepeatableError(err) {
  8668  			return err
  8669  		}
  8670  		tries++
  8671  		if tries >= 3 {
  8672  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8673  			return err
  8674  		}
  8675  	}
  8676  
  8677  }
  8678  
  8679  func (s *RetryLayerTeamStore) AnalyticsGetTeamCountForScheme(schemeID string) (int64, error) {
  8680  
  8681  	tries := 0
  8682  	for {
  8683  		result, err := s.TeamStore.AnalyticsGetTeamCountForScheme(schemeID)
  8684  		if err == nil {
  8685  			return result, nil
  8686  		}
  8687  		if !isRepeatableError(err) {
  8688  			return result, err
  8689  		}
  8690  		tries++
  8691  		if tries >= 3 {
  8692  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8693  			return result, err
  8694  		}
  8695  	}
  8696  
  8697  }
  8698  
  8699  func (s *RetryLayerTeamStore) AnalyticsTeamCount(opts *model.TeamSearch) (int64, error) {
  8700  
  8701  	tries := 0
  8702  	for {
  8703  		result, err := s.TeamStore.AnalyticsTeamCount(opts)
  8704  		if err == nil {
  8705  			return result, nil
  8706  		}
  8707  		if !isRepeatableError(err) {
  8708  			return result, err
  8709  		}
  8710  		tries++
  8711  		if tries >= 3 {
  8712  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8713  			return result, err
  8714  		}
  8715  	}
  8716  
  8717  }
  8718  
  8719  func (s *RetryLayerTeamStore) ClearAllCustomRoleAssignments() error {
  8720  
  8721  	tries := 0
  8722  	for {
  8723  		err := s.TeamStore.ClearAllCustomRoleAssignments()
  8724  		if err == nil {
  8725  			return nil
  8726  		}
  8727  		if !isRepeatableError(err) {
  8728  			return err
  8729  		}
  8730  		tries++
  8731  		if tries >= 3 {
  8732  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8733  			return err
  8734  		}
  8735  	}
  8736  
  8737  }
  8738  
  8739  func (s *RetryLayerTeamStore) ClearCaches() {
  8740  
  8741  	s.TeamStore.ClearCaches()
  8742  
  8743  }
  8744  
  8745  func (s *RetryLayerTeamStore) Get(id string) (*model.Team, error) {
  8746  
  8747  	tries := 0
  8748  	for {
  8749  		result, err := s.TeamStore.Get(id)
  8750  		if err == nil {
  8751  			return result, nil
  8752  		}
  8753  		if !isRepeatableError(err) {
  8754  			return result, err
  8755  		}
  8756  		tries++
  8757  		if tries >= 3 {
  8758  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8759  			return result, err
  8760  		}
  8761  	}
  8762  
  8763  }
  8764  
  8765  func (s *RetryLayerTeamStore) GetActiveMemberCount(teamID string, restrictions *model.ViewUsersRestrictions) (int64, error) {
  8766  
  8767  	tries := 0
  8768  	for {
  8769  		result, err := s.TeamStore.GetActiveMemberCount(teamID, restrictions)
  8770  		if err == nil {
  8771  			return result, nil
  8772  		}
  8773  		if !isRepeatableError(err) {
  8774  			return result, err
  8775  		}
  8776  		tries++
  8777  		if tries >= 3 {
  8778  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8779  			return result, err
  8780  		}
  8781  	}
  8782  
  8783  }
  8784  
  8785  func (s *RetryLayerTeamStore) GetAll() ([]*model.Team, error) {
  8786  
  8787  	tries := 0
  8788  	for {
  8789  		result, err := s.TeamStore.GetAll()
  8790  		if err == nil {
  8791  			return result, nil
  8792  		}
  8793  		if !isRepeatableError(err) {
  8794  			return result, err
  8795  		}
  8796  		tries++
  8797  		if tries >= 3 {
  8798  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8799  			return result, err
  8800  		}
  8801  	}
  8802  
  8803  }
  8804  
  8805  func (s *RetryLayerTeamStore) GetAllForExportAfter(limit int, afterID string) ([]*model.TeamForExport, error) {
  8806  
  8807  	tries := 0
  8808  	for {
  8809  		result, err := s.TeamStore.GetAllForExportAfter(limit, afterID)
  8810  		if err == nil {
  8811  			return result, nil
  8812  		}
  8813  		if !isRepeatableError(err) {
  8814  			return result, err
  8815  		}
  8816  		tries++
  8817  		if tries >= 3 {
  8818  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8819  			return result, err
  8820  		}
  8821  	}
  8822  
  8823  }
  8824  
  8825  func (s *RetryLayerTeamStore) GetAllPage(offset int, limit int, opts *model.TeamSearch) ([]*model.Team, error) {
  8826  
  8827  	tries := 0
  8828  	for {
  8829  		result, err := s.TeamStore.GetAllPage(offset, limit, opts)
  8830  		if err == nil {
  8831  			return result, nil
  8832  		}
  8833  		if !isRepeatableError(err) {
  8834  			return result, err
  8835  		}
  8836  		tries++
  8837  		if tries >= 3 {
  8838  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8839  			return result, err
  8840  		}
  8841  	}
  8842  
  8843  }
  8844  
  8845  func (s *RetryLayerTeamStore) GetAllPrivateTeamListing() ([]*model.Team, error) {
  8846  
  8847  	tries := 0
  8848  	for {
  8849  		result, err := s.TeamStore.GetAllPrivateTeamListing()
  8850  		if err == nil {
  8851  			return result, nil
  8852  		}
  8853  		if !isRepeatableError(err) {
  8854  			return result, err
  8855  		}
  8856  		tries++
  8857  		if tries >= 3 {
  8858  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8859  			return result, err
  8860  		}
  8861  	}
  8862  
  8863  }
  8864  
  8865  func (s *RetryLayerTeamStore) GetAllTeamListing() ([]*model.Team, error) {
  8866  
  8867  	tries := 0
  8868  	for {
  8869  		result, err := s.TeamStore.GetAllTeamListing()
  8870  		if err == nil {
  8871  			return result, nil
  8872  		}
  8873  		if !isRepeatableError(err) {
  8874  			return result, err
  8875  		}
  8876  		tries++
  8877  		if tries >= 3 {
  8878  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8879  			return result, err
  8880  		}
  8881  	}
  8882  
  8883  }
  8884  
  8885  func (s *RetryLayerTeamStore) GetByInviteId(inviteID string) (*model.Team, error) {
  8886  
  8887  	tries := 0
  8888  	for {
  8889  		result, err := s.TeamStore.GetByInviteId(inviteID)
  8890  		if err == nil {
  8891  			return result, nil
  8892  		}
  8893  		if !isRepeatableError(err) {
  8894  			return result, err
  8895  		}
  8896  		tries++
  8897  		if tries >= 3 {
  8898  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8899  			return result, err
  8900  		}
  8901  	}
  8902  
  8903  }
  8904  
  8905  func (s *RetryLayerTeamStore) GetByName(name string) (*model.Team, error) {
  8906  
  8907  	tries := 0
  8908  	for {
  8909  		result, err := s.TeamStore.GetByName(name)
  8910  		if err == nil {
  8911  			return result, nil
  8912  		}
  8913  		if !isRepeatableError(err) {
  8914  			return result, err
  8915  		}
  8916  		tries++
  8917  		if tries >= 3 {
  8918  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8919  			return result, err
  8920  		}
  8921  	}
  8922  
  8923  }
  8924  
  8925  func (s *RetryLayerTeamStore) GetByNames(name []string) ([]*model.Team, error) {
  8926  
  8927  	tries := 0
  8928  	for {
  8929  		result, err := s.TeamStore.GetByNames(name)
  8930  		if err == nil {
  8931  			return result, nil
  8932  		}
  8933  		if !isRepeatableError(err) {
  8934  			return result, err
  8935  		}
  8936  		tries++
  8937  		if tries >= 3 {
  8938  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8939  			return result, err
  8940  		}
  8941  	}
  8942  
  8943  }
  8944  
  8945  func (s *RetryLayerTeamStore) GetChannelUnreadsForAllTeams(excludeTeamID string, userID string) ([]*model.ChannelUnread, error) {
  8946  
  8947  	tries := 0
  8948  	for {
  8949  		result, err := s.TeamStore.GetChannelUnreadsForAllTeams(excludeTeamID, userID)
  8950  		if err == nil {
  8951  			return result, nil
  8952  		}
  8953  		if !isRepeatableError(err) {
  8954  			return result, err
  8955  		}
  8956  		tries++
  8957  		if tries >= 3 {
  8958  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8959  			return result, err
  8960  		}
  8961  	}
  8962  
  8963  }
  8964  
  8965  func (s *RetryLayerTeamStore) GetChannelUnreadsForTeam(teamID string, userID string) ([]*model.ChannelUnread, error) {
  8966  
  8967  	tries := 0
  8968  	for {
  8969  		result, err := s.TeamStore.GetChannelUnreadsForTeam(teamID, userID)
  8970  		if err == nil {
  8971  			return result, nil
  8972  		}
  8973  		if !isRepeatableError(err) {
  8974  			return result, err
  8975  		}
  8976  		tries++
  8977  		if tries >= 3 {
  8978  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8979  			return result, err
  8980  		}
  8981  	}
  8982  
  8983  }
  8984  
  8985  func (s *RetryLayerTeamStore) GetCommonTeamIDsForTwoUsers(userID string, otherUserID string) ([]string, error) {
  8986  
  8987  	tries := 0
  8988  	for {
  8989  		result, err := s.TeamStore.GetCommonTeamIDsForTwoUsers(userID, otherUserID)
  8990  		if err == nil {
  8991  			return result, nil
  8992  		}
  8993  		if !isRepeatableError(err) {
  8994  			return result, err
  8995  		}
  8996  		tries++
  8997  		if tries >= 3 {
  8998  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  8999  			return result, err
  9000  		}
  9001  	}
  9002  
  9003  }
  9004  
  9005  func (s *RetryLayerTeamStore) GetMember(ctx context.Context, teamID string, userID string) (*model.TeamMember, error) {
  9006  
  9007  	tries := 0
  9008  	for {
  9009  		result, err := s.TeamStore.GetMember(ctx, teamID, userID)
  9010  		if err == nil {
  9011  			return result, nil
  9012  		}
  9013  		if !isRepeatableError(err) {
  9014  			return result, err
  9015  		}
  9016  		tries++
  9017  		if tries >= 3 {
  9018  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9019  			return result, err
  9020  		}
  9021  	}
  9022  
  9023  }
  9024  
  9025  func (s *RetryLayerTeamStore) GetMembers(teamID string, offset int, limit int, teamMembersGetOptions *model.TeamMembersGetOptions) ([]*model.TeamMember, error) {
  9026  
  9027  	tries := 0
  9028  	for {
  9029  		result, err := s.TeamStore.GetMembers(teamID, offset, limit, teamMembersGetOptions)
  9030  		if err == nil {
  9031  			return result, nil
  9032  		}
  9033  		if !isRepeatableError(err) {
  9034  			return result, err
  9035  		}
  9036  		tries++
  9037  		if tries >= 3 {
  9038  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9039  			return result, err
  9040  		}
  9041  	}
  9042  
  9043  }
  9044  
  9045  func (s *RetryLayerTeamStore) GetMembersByIds(teamID string, userIds []string, restrictions *model.ViewUsersRestrictions) ([]*model.TeamMember, error) {
  9046  
  9047  	tries := 0
  9048  	for {
  9049  		result, err := s.TeamStore.GetMembersByIds(teamID, userIds, restrictions)
  9050  		if err == nil {
  9051  			return result, nil
  9052  		}
  9053  		if !isRepeatableError(err) {
  9054  			return result, err
  9055  		}
  9056  		tries++
  9057  		if tries >= 3 {
  9058  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9059  			return result, err
  9060  		}
  9061  	}
  9062  
  9063  }
  9064  
  9065  func (s *RetryLayerTeamStore) GetTeamMembersForExport(userID string) ([]*model.TeamMemberForExport, error) {
  9066  
  9067  	tries := 0
  9068  	for {
  9069  		result, err := s.TeamStore.GetTeamMembersForExport(userID)
  9070  		if err == nil {
  9071  			return result, nil
  9072  		}
  9073  		if !isRepeatableError(err) {
  9074  			return result, err
  9075  		}
  9076  		tries++
  9077  		if tries >= 3 {
  9078  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9079  			return result, err
  9080  		}
  9081  	}
  9082  
  9083  }
  9084  
  9085  func (s *RetryLayerTeamStore) GetTeamsByScheme(schemeID string, offset int, limit int) ([]*model.Team, error) {
  9086  
  9087  	tries := 0
  9088  	for {
  9089  		result, err := s.TeamStore.GetTeamsByScheme(schemeID, offset, limit)
  9090  		if err == nil {
  9091  			return result, nil
  9092  		}
  9093  		if !isRepeatableError(err) {
  9094  			return result, err
  9095  		}
  9096  		tries++
  9097  		if tries >= 3 {
  9098  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9099  			return result, err
  9100  		}
  9101  	}
  9102  
  9103  }
  9104  
  9105  func (s *RetryLayerTeamStore) GetTeamsByUserId(userID string) ([]*model.Team, error) {
  9106  
  9107  	tries := 0
  9108  	for {
  9109  		result, err := s.TeamStore.GetTeamsByUserId(userID)
  9110  		if err == nil {
  9111  			return result, nil
  9112  		}
  9113  		if !isRepeatableError(err) {
  9114  			return result, err
  9115  		}
  9116  		tries++
  9117  		if tries >= 3 {
  9118  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9119  			return result, err
  9120  		}
  9121  	}
  9122  
  9123  }
  9124  
  9125  func (s *RetryLayerTeamStore) GetTeamsForUser(ctx context.Context, userID string) ([]*model.TeamMember, error) {
  9126  
  9127  	tries := 0
  9128  	for {
  9129  		result, err := s.TeamStore.GetTeamsForUser(ctx, userID)
  9130  		if err == nil {
  9131  			return result, nil
  9132  		}
  9133  		if !isRepeatableError(err) {
  9134  			return result, err
  9135  		}
  9136  		tries++
  9137  		if tries >= 3 {
  9138  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9139  			return result, err
  9140  		}
  9141  	}
  9142  
  9143  }
  9144  
  9145  func (s *RetryLayerTeamStore) GetTeamsForUserWithPagination(userID string, page int, perPage int) ([]*model.TeamMember, error) {
  9146  
  9147  	tries := 0
  9148  	for {
  9149  		result, err := s.TeamStore.GetTeamsForUserWithPagination(userID, page, perPage)
  9150  		if err == nil {
  9151  			return result, nil
  9152  		}
  9153  		if !isRepeatableError(err) {
  9154  			return result, err
  9155  		}
  9156  		tries++
  9157  		if tries >= 3 {
  9158  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9159  			return result, err
  9160  		}
  9161  	}
  9162  
  9163  }
  9164  
  9165  func (s *RetryLayerTeamStore) GetTotalMemberCount(teamID string, restrictions *model.ViewUsersRestrictions) (int64, error) {
  9166  
  9167  	tries := 0
  9168  	for {
  9169  		result, err := s.TeamStore.GetTotalMemberCount(teamID, restrictions)
  9170  		if err == nil {
  9171  			return result, nil
  9172  		}
  9173  		if !isRepeatableError(err) {
  9174  			return result, err
  9175  		}
  9176  		tries++
  9177  		if tries >= 3 {
  9178  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9179  			return result, err
  9180  		}
  9181  	}
  9182  
  9183  }
  9184  
  9185  func (s *RetryLayerTeamStore) GetUserTeamIds(userID string, allowFromCache bool) ([]string, error) {
  9186  
  9187  	tries := 0
  9188  	for {
  9189  		result, err := s.TeamStore.GetUserTeamIds(userID, allowFromCache)
  9190  		if err == nil {
  9191  			return result, nil
  9192  		}
  9193  		if !isRepeatableError(err) {
  9194  			return result, err
  9195  		}
  9196  		tries++
  9197  		if tries >= 3 {
  9198  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9199  			return result, err
  9200  		}
  9201  	}
  9202  
  9203  }
  9204  
  9205  func (s *RetryLayerTeamStore) GroupSyncedTeamCount() (int64, error) {
  9206  
  9207  	tries := 0
  9208  	for {
  9209  		result, err := s.TeamStore.GroupSyncedTeamCount()
  9210  		if err == nil {
  9211  			return result, nil
  9212  		}
  9213  		if !isRepeatableError(err) {
  9214  			return result, err
  9215  		}
  9216  		tries++
  9217  		if tries >= 3 {
  9218  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9219  			return result, err
  9220  		}
  9221  	}
  9222  
  9223  }
  9224  
  9225  func (s *RetryLayerTeamStore) InvalidateAllTeamIdsForUser(userID string) {
  9226  
  9227  	s.TeamStore.InvalidateAllTeamIdsForUser(userID)
  9228  
  9229  }
  9230  
  9231  func (s *RetryLayerTeamStore) MigrateTeamMembers(fromTeamID string, fromUserID string) (map[string]string, error) {
  9232  
  9233  	tries := 0
  9234  	for {
  9235  		result, err := s.TeamStore.MigrateTeamMembers(fromTeamID, fromUserID)
  9236  		if err == nil {
  9237  			return result, nil
  9238  		}
  9239  		if !isRepeatableError(err) {
  9240  			return result, err
  9241  		}
  9242  		tries++
  9243  		if tries >= 3 {
  9244  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9245  			return result, err
  9246  		}
  9247  	}
  9248  
  9249  }
  9250  
  9251  func (s *RetryLayerTeamStore) PermanentDelete(teamID string) error {
  9252  
  9253  	tries := 0
  9254  	for {
  9255  		err := s.TeamStore.PermanentDelete(teamID)
  9256  		if err == nil {
  9257  			return nil
  9258  		}
  9259  		if !isRepeatableError(err) {
  9260  			return err
  9261  		}
  9262  		tries++
  9263  		if tries >= 3 {
  9264  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9265  			return err
  9266  		}
  9267  	}
  9268  
  9269  }
  9270  
  9271  func (s *RetryLayerTeamStore) RemoveAllMembersByTeam(teamID string) error {
  9272  
  9273  	tries := 0
  9274  	for {
  9275  		err := s.TeamStore.RemoveAllMembersByTeam(teamID)
  9276  		if err == nil {
  9277  			return nil
  9278  		}
  9279  		if !isRepeatableError(err) {
  9280  			return err
  9281  		}
  9282  		tries++
  9283  		if tries >= 3 {
  9284  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9285  			return err
  9286  		}
  9287  	}
  9288  
  9289  }
  9290  
  9291  func (s *RetryLayerTeamStore) RemoveAllMembersByUser(userID string) error {
  9292  
  9293  	tries := 0
  9294  	for {
  9295  		err := s.TeamStore.RemoveAllMembersByUser(userID)
  9296  		if err == nil {
  9297  			return nil
  9298  		}
  9299  		if !isRepeatableError(err) {
  9300  			return err
  9301  		}
  9302  		tries++
  9303  		if tries >= 3 {
  9304  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9305  			return err
  9306  		}
  9307  	}
  9308  
  9309  }
  9310  
  9311  func (s *RetryLayerTeamStore) RemoveMember(teamID string, userID string) error {
  9312  
  9313  	tries := 0
  9314  	for {
  9315  		err := s.TeamStore.RemoveMember(teamID, userID)
  9316  		if err == nil {
  9317  			return nil
  9318  		}
  9319  		if !isRepeatableError(err) {
  9320  			return err
  9321  		}
  9322  		tries++
  9323  		if tries >= 3 {
  9324  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9325  			return err
  9326  		}
  9327  	}
  9328  
  9329  }
  9330  
  9331  func (s *RetryLayerTeamStore) RemoveMembers(teamID string, userIds []string) error {
  9332  
  9333  	tries := 0
  9334  	for {
  9335  		err := s.TeamStore.RemoveMembers(teamID, userIds)
  9336  		if err == nil {
  9337  			return nil
  9338  		}
  9339  		if !isRepeatableError(err) {
  9340  			return err
  9341  		}
  9342  		tries++
  9343  		if tries >= 3 {
  9344  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9345  			return err
  9346  		}
  9347  	}
  9348  
  9349  }
  9350  
  9351  func (s *RetryLayerTeamStore) ResetAllTeamSchemes() error {
  9352  
  9353  	tries := 0
  9354  	for {
  9355  		err := s.TeamStore.ResetAllTeamSchemes()
  9356  		if err == nil {
  9357  			return nil
  9358  		}
  9359  		if !isRepeatableError(err) {
  9360  			return err
  9361  		}
  9362  		tries++
  9363  		if tries >= 3 {
  9364  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9365  			return err
  9366  		}
  9367  	}
  9368  
  9369  }
  9370  
  9371  func (s *RetryLayerTeamStore) Save(team *model.Team) (*model.Team, error) {
  9372  
  9373  	tries := 0
  9374  	for {
  9375  		result, err := s.TeamStore.Save(team)
  9376  		if err == nil {
  9377  			return result, nil
  9378  		}
  9379  		if !isRepeatableError(err) {
  9380  			return result, err
  9381  		}
  9382  		tries++
  9383  		if tries >= 3 {
  9384  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9385  			return result, err
  9386  		}
  9387  	}
  9388  
  9389  }
  9390  
  9391  func (s *RetryLayerTeamStore) SaveMember(member *model.TeamMember, maxUsersPerTeam int) (*model.TeamMember, error) {
  9392  
  9393  	tries := 0
  9394  	for {
  9395  		result, err := s.TeamStore.SaveMember(member, maxUsersPerTeam)
  9396  		if err == nil {
  9397  			return result, nil
  9398  		}
  9399  		if !isRepeatableError(err) {
  9400  			return result, err
  9401  		}
  9402  		tries++
  9403  		if tries >= 3 {
  9404  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9405  			return result, err
  9406  		}
  9407  	}
  9408  
  9409  }
  9410  
  9411  func (s *RetryLayerTeamStore) SaveMultipleMembers(members []*model.TeamMember, maxUsersPerTeam int) ([]*model.TeamMember, error) {
  9412  
  9413  	tries := 0
  9414  	for {
  9415  		result, err := s.TeamStore.SaveMultipleMembers(members, maxUsersPerTeam)
  9416  		if err == nil {
  9417  			return result, nil
  9418  		}
  9419  		if !isRepeatableError(err) {
  9420  			return result, err
  9421  		}
  9422  		tries++
  9423  		if tries >= 3 {
  9424  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9425  			return result, err
  9426  		}
  9427  	}
  9428  
  9429  }
  9430  
  9431  func (s *RetryLayerTeamStore) SearchAll(opts *model.TeamSearch) ([]*model.Team, error) {
  9432  
  9433  	tries := 0
  9434  	for {
  9435  		result, err := s.TeamStore.SearchAll(opts)
  9436  		if err == nil {
  9437  			return result, nil
  9438  		}
  9439  		if !isRepeatableError(err) {
  9440  			return result, err
  9441  		}
  9442  		tries++
  9443  		if tries >= 3 {
  9444  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9445  			return result, err
  9446  		}
  9447  	}
  9448  
  9449  }
  9450  
  9451  func (s *RetryLayerTeamStore) SearchAllPaged(opts *model.TeamSearch) ([]*model.Team, int64, error) {
  9452  
  9453  	tries := 0
  9454  	for {
  9455  		result, resultVar1, err := s.TeamStore.SearchAllPaged(opts)
  9456  		if err == nil {
  9457  			return result, resultVar1, nil
  9458  		}
  9459  		if !isRepeatableError(err) {
  9460  			return result, resultVar1, err
  9461  		}
  9462  		tries++
  9463  		if tries >= 3 {
  9464  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9465  			return result, resultVar1, err
  9466  		}
  9467  	}
  9468  
  9469  }
  9470  
  9471  func (s *RetryLayerTeamStore) SearchOpen(opts *model.TeamSearch) ([]*model.Team, error) {
  9472  
  9473  	tries := 0
  9474  	for {
  9475  		result, err := s.TeamStore.SearchOpen(opts)
  9476  		if err == nil {
  9477  			return result, nil
  9478  		}
  9479  		if !isRepeatableError(err) {
  9480  			return result, err
  9481  		}
  9482  		tries++
  9483  		if tries >= 3 {
  9484  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9485  			return result, err
  9486  		}
  9487  	}
  9488  
  9489  }
  9490  
  9491  func (s *RetryLayerTeamStore) SearchPrivate(opts *model.TeamSearch) ([]*model.Team, error) {
  9492  
  9493  	tries := 0
  9494  	for {
  9495  		result, err := s.TeamStore.SearchPrivate(opts)
  9496  		if err == nil {
  9497  			return result, nil
  9498  		}
  9499  		if !isRepeatableError(err) {
  9500  			return result, err
  9501  		}
  9502  		tries++
  9503  		if tries >= 3 {
  9504  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9505  			return result, err
  9506  		}
  9507  	}
  9508  
  9509  }
  9510  
  9511  func (s *RetryLayerTeamStore) Update(team *model.Team) (*model.Team, error) {
  9512  
  9513  	tries := 0
  9514  	for {
  9515  		result, err := s.TeamStore.Update(team)
  9516  		if err == nil {
  9517  			return result, nil
  9518  		}
  9519  		if !isRepeatableError(err) {
  9520  			return result, err
  9521  		}
  9522  		tries++
  9523  		if tries >= 3 {
  9524  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9525  			return result, err
  9526  		}
  9527  	}
  9528  
  9529  }
  9530  
  9531  func (s *RetryLayerTeamStore) UpdateLastTeamIconUpdate(teamID string, curTime int64) error {
  9532  
  9533  	tries := 0
  9534  	for {
  9535  		err := s.TeamStore.UpdateLastTeamIconUpdate(teamID, curTime)
  9536  		if err == nil {
  9537  			return nil
  9538  		}
  9539  		if !isRepeatableError(err) {
  9540  			return err
  9541  		}
  9542  		tries++
  9543  		if tries >= 3 {
  9544  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9545  			return err
  9546  		}
  9547  	}
  9548  
  9549  }
  9550  
  9551  func (s *RetryLayerTeamStore) UpdateMember(member *model.TeamMember) (*model.TeamMember, error) {
  9552  
  9553  	tries := 0
  9554  	for {
  9555  		result, err := s.TeamStore.UpdateMember(member)
  9556  		if err == nil {
  9557  			return result, nil
  9558  		}
  9559  		if !isRepeatableError(err) {
  9560  			return result, err
  9561  		}
  9562  		tries++
  9563  		if tries >= 3 {
  9564  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9565  			return result, err
  9566  		}
  9567  	}
  9568  
  9569  }
  9570  
  9571  func (s *RetryLayerTeamStore) UpdateMembersRole(teamID string, userIDs []string) error {
  9572  
  9573  	tries := 0
  9574  	for {
  9575  		err := s.TeamStore.UpdateMembersRole(teamID, userIDs)
  9576  		if err == nil {
  9577  			return nil
  9578  		}
  9579  		if !isRepeatableError(err) {
  9580  			return err
  9581  		}
  9582  		tries++
  9583  		if tries >= 3 {
  9584  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9585  			return err
  9586  		}
  9587  	}
  9588  
  9589  }
  9590  
  9591  func (s *RetryLayerTeamStore) UpdateMultipleMembers(members []*model.TeamMember) ([]*model.TeamMember, error) {
  9592  
  9593  	tries := 0
  9594  	for {
  9595  		result, err := s.TeamStore.UpdateMultipleMembers(members)
  9596  		if err == nil {
  9597  			return result, nil
  9598  		}
  9599  		if !isRepeatableError(err) {
  9600  			return result, err
  9601  		}
  9602  		tries++
  9603  		if tries >= 3 {
  9604  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9605  			return result, err
  9606  		}
  9607  	}
  9608  
  9609  }
  9610  
  9611  func (s *RetryLayerTeamStore) UserBelongsToTeams(userID string, teamIds []string) (bool, error) {
  9612  
  9613  	tries := 0
  9614  	for {
  9615  		result, err := s.TeamStore.UserBelongsToTeams(userID, teamIds)
  9616  		if err == nil {
  9617  			return result, nil
  9618  		}
  9619  		if !isRepeatableError(err) {
  9620  			return result, err
  9621  		}
  9622  		tries++
  9623  		if tries >= 3 {
  9624  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9625  			return result, err
  9626  		}
  9627  	}
  9628  
  9629  }
  9630  
  9631  func (s *RetryLayerTermsOfServiceStore) Get(id string, allowFromCache bool) (*model.TermsOfService, error) {
  9632  
  9633  	tries := 0
  9634  	for {
  9635  		result, err := s.TermsOfServiceStore.Get(id, allowFromCache)
  9636  		if err == nil {
  9637  			return result, nil
  9638  		}
  9639  		if !isRepeatableError(err) {
  9640  			return result, err
  9641  		}
  9642  		tries++
  9643  		if tries >= 3 {
  9644  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9645  			return result, err
  9646  		}
  9647  	}
  9648  
  9649  }
  9650  
  9651  func (s *RetryLayerTermsOfServiceStore) GetLatest(allowFromCache bool) (*model.TermsOfService, error) {
  9652  
  9653  	tries := 0
  9654  	for {
  9655  		result, err := s.TermsOfServiceStore.GetLatest(allowFromCache)
  9656  		if err == nil {
  9657  			return result, nil
  9658  		}
  9659  		if !isRepeatableError(err) {
  9660  			return result, err
  9661  		}
  9662  		tries++
  9663  		if tries >= 3 {
  9664  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9665  			return result, err
  9666  		}
  9667  	}
  9668  
  9669  }
  9670  
  9671  func (s *RetryLayerTermsOfServiceStore) Save(termsOfService *model.TermsOfService) (*model.TermsOfService, error) {
  9672  
  9673  	tries := 0
  9674  	for {
  9675  		result, err := s.TermsOfServiceStore.Save(termsOfService)
  9676  		if err == nil {
  9677  			return result, nil
  9678  		}
  9679  		if !isRepeatableError(err) {
  9680  			return result, err
  9681  		}
  9682  		tries++
  9683  		if tries >= 3 {
  9684  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9685  			return result, err
  9686  		}
  9687  	}
  9688  
  9689  }
  9690  
  9691  func (s *RetryLayerThreadStore) CollectThreadsWithNewerReplies(userId string, channelIds []string, timestamp int64) ([]string, error) {
  9692  
  9693  	tries := 0
  9694  	for {
  9695  		result, err := s.ThreadStore.CollectThreadsWithNewerReplies(userId, channelIds, timestamp)
  9696  		if err == nil {
  9697  			return result, nil
  9698  		}
  9699  		if !isRepeatableError(err) {
  9700  			return result, err
  9701  		}
  9702  		tries++
  9703  		if tries >= 3 {
  9704  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9705  			return result, err
  9706  		}
  9707  	}
  9708  
  9709  }
  9710  
  9711  func (s *RetryLayerThreadStore) Delete(postID string) error {
  9712  
  9713  	tries := 0
  9714  	for {
  9715  		err := s.ThreadStore.Delete(postID)
  9716  		if err == nil {
  9717  			return nil
  9718  		}
  9719  		if !isRepeatableError(err) {
  9720  			return err
  9721  		}
  9722  		tries++
  9723  		if tries >= 3 {
  9724  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9725  			return err
  9726  		}
  9727  	}
  9728  
  9729  }
  9730  
  9731  func (s *RetryLayerThreadStore) DeleteMembershipForUser(userId string, postID string) error {
  9732  
  9733  	tries := 0
  9734  	for {
  9735  		err := s.ThreadStore.DeleteMembershipForUser(userId, postID)
  9736  		if err == nil {
  9737  			return nil
  9738  		}
  9739  		if !isRepeatableError(err) {
  9740  			return err
  9741  		}
  9742  		tries++
  9743  		if tries >= 3 {
  9744  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9745  			return err
  9746  		}
  9747  	}
  9748  
  9749  }
  9750  
  9751  func (s *RetryLayerThreadStore) DeleteOrphanedRows(limit int) (int64, error) {
  9752  
  9753  	tries := 0
  9754  	for {
  9755  		result, err := s.ThreadStore.DeleteOrphanedRows(limit)
  9756  		if err == nil {
  9757  			return result, nil
  9758  		}
  9759  		if !isRepeatableError(err) {
  9760  			return result, err
  9761  		}
  9762  		tries++
  9763  		if tries >= 3 {
  9764  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9765  			return result, err
  9766  		}
  9767  	}
  9768  
  9769  }
  9770  
  9771  func (s *RetryLayerThreadStore) Get(id string) (*model.Thread, error) {
  9772  
  9773  	tries := 0
  9774  	for {
  9775  		result, err := s.ThreadStore.Get(id)
  9776  		if err == nil {
  9777  			return result, nil
  9778  		}
  9779  		if !isRepeatableError(err) {
  9780  			return result, err
  9781  		}
  9782  		tries++
  9783  		if tries >= 3 {
  9784  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9785  			return result, err
  9786  		}
  9787  	}
  9788  
  9789  }
  9790  
  9791  func (s *RetryLayerThreadStore) GetMembershipForUser(userId string, postID string) (*model.ThreadMembership, error) {
  9792  
  9793  	tries := 0
  9794  	for {
  9795  		result, err := s.ThreadStore.GetMembershipForUser(userId, postID)
  9796  		if err == nil {
  9797  			return result, nil
  9798  		}
  9799  		if !isRepeatableError(err) {
  9800  			return result, err
  9801  		}
  9802  		tries++
  9803  		if tries >= 3 {
  9804  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9805  			return result, err
  9806  		}
  9807  	}
  9808  
  9809  }
  9810  
  9811  func (s *RetryLayerThreadStore) GetMembershipsForUser(userId string, teamID string) ([]*model.ThreadMembership, error) {
  9812  
  9813  	tries := 0
  9814  	for {
  9815  		result, err := s.ThreadStore.GetMembershipsForUser(userId, teamID)
  9816  		if err == nil {
  9817  			return result, nil
  9818  		}
  9819  		if !isRepeatableError(err) {
  9820  			return result, err
  9821  		}
  9822  		tries++
  9823  		if tries >= 3 {
  9824  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9825  			return result, err
  9826  		}
  9827  	}
  9828  
  9829  }
  9830  
  9831  func (s *RetryLayerThreadStore) GetPosts(threadID string, since int64) ([]*model.Post, error) {
  9832  
  9833  	tries := 0
  9834  	for {
  9835  		result, err := s.ThreadStore.GetPosts(threadID, since)
  9836  		if err == nil {
  9837  			return result, nil
  9838  		}
  9839  		if !isRepeatableError(err) {
  9840  			return result, err
  9841  		}
  9842  		tries++
  9843  		if tries >= 3 {
  9844  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9845  			return result, err
  9846  		}
  9847  	}
  9848  
  9849  }
  9850  
  9851  func (s *RetryLayerThreadStore) GetThreadFollowers(threadID string) ([]string, error) {
  9852  
  9853  	tries := 0
  9854  	for {
  9855  		result, err := s.ThreadStore.GetThreadFollowers(threadID)
  9856  		if err == nil {
  9857  			return result, nil
  9858  		}
  9859  		if !isRepeatableError(err) {
  9860  			return result, err
  9861  		}
  9862  		tries++
  9863  		if tries >= 3 {
  9864  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9865  			return result, err
  9866  		}
  9867  	}
  9868  
  9869  }
  9870  
  9871  func (s *RetryLayerThreadStore) GetThreadForUser(teamID string, threadMembership *model.ThreadMembership, extended bool) (*model.ThreadResponse, error) {
  9872  
  9873  	tries := 0
  9874  	for {
  9875  		result, err := s.ThreadStore.GetThreadForUser(teamID, threadMembership, extended)
  9876  		if err == nil {
  9877  			return result, nil
  9878  		}
  9879  		if !isRepeatableError(err) {
  9880  			return result, err
  9881  		}
  9882  		tries++
  9883  		if tries >= 3 {
  9884  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9885  			return result, err
  9886  		}
  9887  	}
  9888  
  9889  }
  9890  
  9891  func (s *RetryLayerThreadStore) GetThreadsForUser(userId string, teamID string, opts model.GetUserThreadsOpts) (*model.Threads, error) {
  9892  
  9893  	tries := 0
  9894  	for {
  9895  		result, err := s.ThreadStore.GetThreadsForUser(userId, teamID, opts)
  9896  		if err == nil {
  9897  			return result, nil
  9898  		}
  9899  		if !isRepeatableError(err) {
  9900  			return result, err
  9901  		}
  9902  		tries++
  9903  		if tries >= 3 {
  9904  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9905  			return result, err
  9906  		}
  9907  	}
  9908  
  9909  }
  9910  
  9911  func (s *RetryLayerThreadStore) MaintainMembership(userID string, postID string, opts store.ThreadMembershipOpts) (*model.ThreadMembership, error) {
  9912  
  9913  	tries := 0
  9914  	for {
  9915  		result, err := s.ThreadStore.MaintainMembership(userID, postID, opts)
  9916  		if err == nil {
  9917  			return result, nil
  9918  		}
  9919  		if !isRepeatableError(err) {
  9920  			return result, err
  9921  		}
  9922  		tries++
  9923  		if tries >= 3 {
  9924  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9925  			return result, err
  9926  		}
  9927  	}
  9928  
  9929  }
  9930  
  9931  func (s *RetryLayerThreadStore) MarkAllAsRead(userID string, teamID string) error {
  9932  
  9933  	tries := 0
  9934  	for {
  9935  		err := s.ThreadStore.MarkAllAsRead(userID, teamID)
  9936  		if err == nil {
  9937  			return nil
  9938  		}
  9939  		if !isRepeatableError(err) {
  9940  			return err
  9941  		}
  9942  		tries++
  9943  		if tries >= 3 {
  9944  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9945  			return err
  9946  		}
  9947  	}
  9948  
  9949  }
  9950  
  9951  func (s *RetryLayerThreadStore) MarkAllAsReadInChannels(userID string, channelIDs []string) error {
  9952  
  9953  	tries := 0
  9954  	for {
  9955  		err := s.ThreadStore.MarkAllAsReadInChannels(userID, channelIDs)
  9956  		if err == nil {
  9957  			return nil
  9958  		}
  9959  		if !isRepeatableError(err) {
  9960  			return err
  9961  		}
  9962  		tries++
  9963  		if tries >= 3 {
  9964  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9965  			return err
  9966  		}
  9967  	}
  9968  
  9969  }
  9970  
  9971  func (s *RetryLayerThreadStore) MarkAsRead(userID string, threadID string, timestamp int64) error {
  9972  
  9973  	tries := 0
  9974  	for {
  9975  		err := s.ThreadStore.MarkAsRead(userID, threadID, timestamp)
  9976  		if err == nil {
  9977  			return nil
  9978  		}
  9979  		if !isRepeatableError(err) {
  9980  			return err
  9981  		}
  9982  		tries++
  9983  		if tries >= 3 {
  9984  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
  9985  			return err
  9986  		}
  9987  	}
  9988  
  9989  }
  9990  
  9991  func (s *RetryLayerThreadStore) PermanentDeleteBatchForRetentionPolicies(now int64, globalPolicyEndTime int64, limit int64, cursor model.RetentionPolicyCursor) (int64, model.RetentionPolicyCursor, error) {
  9992  
  9993  	tries := 0
  9994  	for {
  9995  		result, resultVar1, err := s.ThreadStore.PermanentDeleteBatchForRetentionPolicies(now, globalPolicyEndTime, limit, cursor)
  9996  		if err == nil {
  9997  			return result, resultVar1, nil
  9998  		}
  9999  		if !isRepeatableError(err) {
 10000  			return result, resultVar1, err
 10001  		}
 10002  		tries++
 10003  		if tries >= 3 {
 10004  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10005  			return result, resultVar1, err
 10006  		}
 10007  	}
 10008  
 10009  }
 10010  
 10011  func (s *RetryLayerThreadStore) PermanentDeleteBatchThreadMembershipsForRetentionPolicies(now int64, globalPolicyEndTime int64, limit int64, cursor model.RetentionPolicyCursor) (int64, model.RetentionPolicyCursor, error) {
 10012  
 10013  	tries := 0
 10014  	for {
 10015  		result, resultVar1, err := s.ThreadStore.PermanentDeleteBatchThreadMembershipsForRetentionPolicies(now, globalPolicyEndTime, limit, cursor)
 10016  		if err == nil {
 10017  			return result, resultVar1, nil
 10018  		}
 10019  		if !isRepeatableError(err) {
 10020  			return result, resultVar1, err
 10021  		}
 10022  		tries++
 10023  		if tries >= 3 {
 10024  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10025  			return result, resultVar1, err
 10026  		}
 10027  	}
 10028  
 10029  }
 10030  
 10031  func (s *RetryLayerThreadStore) Save(thread *model.Thread) (*model.Thread, error) {
 10032  
 10033  	tries := 0
 10034  	for {
 10035  		result, err := s.ThreadStore.Save(thread)
 10036  		if err == nil {
 10037  			return result, nil
 10038  		}
 10039  		if !isRepeatableError(err) {
 10040  			return result, err
 10041  		}
 10042  		tries++
 10043  		if tries >= 3 {
 10044  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10045  			return result, err
 10046  		}
 10047  	}
 10048  
 10049  }
 10050  
 10051  func (s *RetryLayerThreadStore) SaveMembership(membership *model.ThreadMembership) (*model.ThreadMembership, error) {
 10052  
 10053  	tries := 0
 10054  	for {
 10055  		result, err := s.ThreadStore.SaveMembership(membership)
 10056  		if err == nil {
 10057  			return result, nil
 10058  		}
 10059  		if !isRepeatableError(err) {
 10060  			return result, err
 10061  		}
 10062  		tries++
 10063  		if tries >= 3 {
 10064  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10065  			return result, err
 10066  		}
 10067  	}
 10068  
 10069  }
 10070  
 10071  func (s *RetryLayerThreadStore) SaveMultiple(thread []*model.Thread) ([]*model.Thread, int, error) {
 10072  
 10073  	tries := 0
 10074  	for {
 10075  		result, resultVar1, err := s.ThreadStore.SaveMultiple(thread)
 10076  		if err == nil {
 10077  			return result, resultVar1, nil
 10078  		}
 10079  		if !isRepeatableError(err) {
 10080  			return result, resultVar1, err
 10081  		}
 10082  		tries++
 10083  		if tries >= 3 {
 10084  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10085  			return result, resultVar1, err
 10086  		}
 10087  	}
 10088  
 10089  }
 10090  
 10091  func (s *RetryLayerThreadStore) Update(thread *model.Thread) (*model.Thread, error) {
 10092  
 10093  	tries := 0
 10094  	for {
 10095  		result, err := s.ThreadStore.Update(thread)
 10096  		if err == nil {
 10097  			return result, nil
 10098  		}
 10099  		if !isRepeatableError(err) {
 10100  			return result, err
 10101  		}
 10102  		tries++
 10103  		if tries >= 3 {
 10104  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10105  			return result, err
 10106  		}
 10107  	}
 10108  
 10109  }
 10110  
 10111  func (s *RetryLayerThreadStore) UpdateMembership(membership *model.ThreadMembership) (*model.ThreadMembership, error) {
 10112  
 10113  	tries := 0
 10114  	for {
 10115  		result, err := s.ThreadStore.UpdateMembership(membership)
 10116  		if err == nil {
 10117  			return result, nil
 10118  		}
 10119  		if !isRepeatableError(err) {
 10120  			return result, err
 10121  		}
 10122  		tries++
 10123  		if tries >= 3 {
 10124  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10125  			return result, err
 10126  		}
 10127  	}
 10128  
 10129  }
 10130  
 10131  func (s *RetryLayerThreadStore) UpdateUnreadsByChannel(userId string, changedThreads []string, timestamp int64, updateViewedTimestamp bool) error {
 10132  
 10133  	tries := 0
 10134  	for {
 10135  		err := s.ThreadStore.UpdateUnreadsByChannel(userId, changedThreads, timestamp, updateViewedTimestamp)
 10136  		if err == nil {
 10137  			return nil
 10138  		}
 10139  		if !isRepeatableError(err) {
 10140  			return err
 10141  		}
 10142  		tries++
 10143  		if tries >= 3 {
 10144  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10145  			return err
 10146  		}
 10147  	}
 10148  
 10149  }
 10150  
 10151  func (s *RetryLayerTokenStore) Cleanup() {
 10152  
 10153  	s.TokenStore.Cleanup()
 10154  
 10155  }
 10156  
 10157  func (s *RetryLayerTokenStore) Delete(token string) error {
 10158  
 10159  	tries := 0
 10160  	for {
 10161  		err := s.TokenStore.Delete(token)
 10162  		if err == nil {
 10163  			return nil
 10164  		}
 10165  		if !isRepeatableError(err) {
 10166  			return err
 10167  		}
 10168  		tries++
 10169  		if tries >= 3 {
 10170  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10171  			return err
 10172  		}
 10173  	}
 10174  
 10175  }
 10176  
 10177  func (s *RetryLayerTokenStore) GetAllTokensByType(tokenType string) ([]*model.Token, error) {
 10178  
 10179  	tries := 0
 10180  	for {
 10181  		result, err := s.TokenStore.GetAllTokensByType(tokenType)
 10182  		if err == nil {
 10183  			return result, nil
 10184  		}
 10185  		if !isRepeatableError(err) {
 10186  			return result, err
 10187  		}
 10188  		tries++
 10189  		if tries >= 3 {
 10190  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10191  			return result, err
 10192  		}
 10193  	}
 10194  
 10195  }
 10196  
 10197  func (s *RetryLayerTokenStore) GetByToken(token string) (*model.Token, error) {
 10198  
 10199  	tries := 0
 10200  	for {
 10201  		result, err := s.TokenStore.GetByToken(token)
 10202  		if err == nil {
 10203  			return result, nil
 10204  		}
 10205  		if !isRepeatableError(err) {
 10206  			return result, err
 10207  		}
 10208  		tries++
 10209  		if tries >= 3 {
 10210  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10211  			return result, err
 10212  		}
 10213  	}
 10214  
 10215  }
 10216  
 10217  func (s *RetryLayerTokenStore) RemoveAllTokensByType(tokenType string) error {
 10218  
 10219  	tries := 0
 10220  	for {
 10221  		err := s.TokenStore.RemoveAllTokensByType(tokenType)
 10222  		if err == nil {
 10223  			return nil
 10224  		}
 10225  		if !isRepeatableError(err) {
 10226  			return err
 10227  		}
 10228  		tries++
 10229  		if tries >= 3 {
 10230  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10231  			return err
 10232  		}
 10233  	}
 10234  
 10235  }
 10236  
 10237  func (s *RetryLayerTokenStore) Save(recovery *model.Token) error {
 10238  
 10239  	tries := 0
 10240  	for {
 10241  		err := s.TokenStore.Save(recovery)
 10242  		if err == nil {
 10243  			return nil
 10244  		}
 10245  		if !isRepeatableError(err) {
 10246  			return err
 10247  		}
 10248  		tries++
 10249  		if tries >= 3 {
 10250  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10251  			return err
 10252  		}
 10253  	}
 10254  
 10255  }
 10256  
 10257  func (s *RetryLayerTrackPointStore) Get(trackPointId string) (*model.TrackPoint, error) {
 10258  
 10259  	tries := 0
 10260  	for {
 10261  		result, err := s.TrackPointStore.Get(trackPointId)
 10262  		if err == nil {
 10263  			return result, nil
 10264  		}
 10265  		if !isRepeatableError(err) {
 10266  			return result, err
 10267  		}
 10268  		tries++
 10269  		if tries >= 3 {
 10270  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10271  			return result, err
 10272  		}
 10273  	}
 10274  
 10275  }
 10276  
 10277  func (s *RetryLayerTrackPointStore) GetByTargetId(targetId string) ([]*model.TrackPoint, error) {
 10278  
 10279  	tries := 0
 10280  	for {
 10281  		result, err := s.TrackPointStore.GetByTargetId(targetId)
 10282  		if err == nil {
 10283  			return result, nil
 10284  		}
 10285  		if !isRepeatableError(err) {
 10286  			return result, err
 10287  		}
 10288  		tries++
 10289  		if tries >= 3 {
 10290  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10291  			return result, err
 10292  		}
 10293  	}
 10294  
 10295  }
 10296  
 10297  func (s *RetryLayerTrackPointStore) Save(trackPoint *model.TrackPoint) (*model.TrackPoint, error) {
 10298  
 10299  	tries := 0
 10300  	for {
 10301  		result, err := s.TrackPointStore.Save(trackPoint)
 10302  		if err == nil {
 10303  			return result, nil
 10304  		}
 10305  		if !isRepeatableError(err) {
 10306  			return result, err
 10307  		}
 10308  		tries++
 10309  		if tries >= 3 {
 10310  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10311  			return result, err
 10312  		}
 10313  	}
 10314  
 10315  }
 10316  
 10317  func (s *RetryLayerTrackRecordStore) End(trackRecordId string) (*model.TrackRecord, error) {
 10318  
 10319  	tries := 0
 10320  	for {
 10321  		result, err := s.TrackRecordStore.End(trackRecordId)
 10322  		if err == nil {
 10323  			return result, nil
 10324  		}
 10325  		if !isRepeatableError(err) {
 10326  			return result, err
 10327  		}
 10328  		tries++
 10329  		if tries >= 3 {
 10330  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10331  			return result, err
 10332  		}
 10333  	}
 10334  
 10335  }
 10336  
 10337  func (s *RetryLayerTrackRecordStore) Get(trackRecordId string) (*model.TrackRecord, error) {
 10338  
 10339  	tries := 0
 10340  	for {
 10341  		result, err := s.TrackRecordStore.Get(trackRecordId)
 10342  		if err == nil {
 10343  			return result, nil
 10344  		}
 10345  		if !isRepeatableError(err) {
 10346  			return result, err
 10347  		}
 10348  		tries++
 10349  		if tries >= 3 {
 10350  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10351  			return result, err
 10352  		}
 10353  	}
 10354  
 10355  }
 10356  
 10357  func (s *RetryLayerTrackRecordStore) Save(trackRecord *model.TrackRecord) (*model.TrackRecord, error) {
 10358  
 10359  	tries := 0
 10360  	for {
 10361  		result, err := s.TrackRecordStore.Save(trackRecord)
 10362  		if err == nil {
 10363  			return result, nil
 10364  		}
 10365  		if !isRepeatableError(err) {
 10366  			return result, err
 10367  		}
 10368  		tries++
 10369  		if tries >= 3 {
 10370  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10371  			return result, err
 10372  		}
 10373  	}
 10374  
 10375  }
 10376  
 10377  func (s *RetryLayerTrackRecordStore) Start(trackRecordId string) (*model.TrackRecord, error) {
 10378  
 10379  	tries := 0
 10380  	for {
 10381  		result, err := s.TrackRecordStore.Start(trackRecordId)
 10382  		if err == nil {
 10383  			return result, nil
 10384  		}
 10385  		if !isRepeatableError(err) {
 10386  			return result, err
 10387  		}
 10388  		tries++
 10389  		if tries >= 3 {
 10390  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10391  			return result, err
 10392  		}
 10393  	}
 10394  
 10395  }
 10396  
 10397  func (s *RetryLayerTrackRecordStore) Update(trackRecord *model.TrackRecord) (*model.TrackRecord, error) {
 10398  
 10399  	tries := 0
 10400  	for {
 10401  		result, err := s.TrackRecordStore.Update(trackRecord)
 10402  		if err == nil {
 10403  			return result, nil
 10404  		}
 10405  		if !isRepeatableError(err) {
 10406  			return result, err
 10407  		}
 10408  		tries++
 10409  		if tries >= 3 {
 10410  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10411  			return result, err
 10412  		}
 10413  	}
 10414  
 10415  }
 10416  
 10417  func (s *RetryLayerUploadSessionStore) Delete(id string) error {
 10418  
 10419  	tries := 0
 10420  	for {
 10421  		err := s.UploadSessionStore.Delete(id)
 10422  		if err == nil {
 10423  			return nil
 10424  		}
 10425  		if !isRepeatableError(err) {
 10426  			return err
 10427  		}
 10428  		tries++
 10429  		if tries >= 3 {
 10430  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10431  			return err
 10432  		}
 10433  	}
 10434  
 10435  }
 10436  
 10437  func (s *RetryLayerUploadSessionStore) Get(id string) (*model.UploadSession, error) {
 10438  
 10439  	tries := 0
 10440  	for {
 10441  		result, err := s.UploadSessionStore.Get(id)
 10442  		if err == nil {
 10443  			return result, nil
 10444  		}
 10445  		if !isRepeatableError(err) {
 10446  			return result, err
 10447  		}
 10448  		tries++
 10449  		if tries >= 3 {
 10450  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10451  			return result, err
 10452  		}
 10453  	}
 10454  
 10455  }
 10456  
 10457  func (s *RetryLayerUploadSessionStore) GetForUser(userID string) ([]*model.UploadSession, error) {
 10458  
 10459  	tries := 0
 10460  	for {
 10461  		result, err := s.UploadSessionStore.GetForUser(userID)
 10462  		if err == nil {
 10463  			return result, nil
 10464  		}
 10465  		if !isRepeatableError(err) {
 10466  			return result, err
 10467  		}
 10468  		tries++
 10469  		if tries >= 3 {
 10470  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10471  			return result, err
 10472  		}
 10473  	}
 10474  
 10475  }
 10476  
 10477  func (s *RetryLayerUploadSessionStore) Save(session *model.UploadSession) (*model.UploadSession, error) {
 10478  
 10479  	tries := 0
 10480  	for {
 10481  		result, err := s.UploadSessionStore.Save(session)
 10482  		if err == nil {
 10483  			return result, nil
 10484  		}
 10485  		if !isRepeatableError(err) {
 10486  			return result, err
 10487  		}
 10488  		tries++
 10489  		if tries >= 3 {
 10490  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10491  			return result, err
 10492  		}
 10493  	}
 10494  
 10495  }
 10496  
 10497  func (s *RetryLayerUploadSessionStore) Update(session *model.UploadSession) error {
 10498  
 10499  	tries := 0
 10500  	for {
 10501  		err := s.UploadSessionStore.Update(session)
 10502  		if err == nil {
 10503  			return nil
 10504  		}
 10505  		if !isRepeatableError(err) {
 10506  			return err
 10507  		}
 10508  		tries++
 10509  		if tries >= 3 {
 10510  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10511  			return err
 10512  		}
 10513  	}
 10514  
 10515  }
 10516  
 10517  func (s *RetryLayerUserStore) AnalyticsActiveCount(time int64, options model.UserCountOptions) (int64, error) {
 10518  
 10519  	tries := 0
 10520  	for {
 10521  		result, err := s.UserStore.AnalyticsActiveCount(time, options)
 10522  		if err == nil {
 10523  			return result, nil
 10524  		}
 10525  		if !isRepeatableError(err) {
 10526  			return result, err
 10527  		}
 10528  		tries++
 10529  		if tries >= 3 {
 10530  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10531  			return result, err
 10532  		}
 10533  	}
 10534  
 10535  }
 10536  
 10537  func (s *RetryLayerUserStore) AnalyticsActiveCountForPeriod(startTime int64, endTime int64, options model.UserCountOptions) (int64, error) {
 10538  
 10539  	tries := 0
 10540  	for {
 10541  		result, err := s.UserStore.AnalyticsActiveCountForPeriod(startTime, endTime, options)
 10542  		if err == nil {
 10543  			return result, nil
 10544  		}
 10545  		if !isRepeatableError(err) {
 10546  			return result, err
 10547  		}
 10548  		tries++
 10549  		if tries >= 3 {
 10550  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10551  			return result, err
 10552  		}
 10553  	}
 10554  
 10555  }
 10556  
 10557  func (s *RetryLayerUserStore) AnalyticsGetExternalUsers(hostDomain string) (bool, error) {
 10558  
 10559  	tries := 0
 10560  	for {
 10561  		result, err := s.UserStore.AnalyticsGetExternalUsers(hostDomain)
 10562  		if err == nil {
 10563  			return result, nil
 10564  		}
 10565  		if !isRepeatableError(err) {
 10566  			return result, err
 10567  		}
 10568  		tries++
 10569  		if tries >= 3 {
 10570  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10571  			return result, err
 10572  		}
 10573  	}
 10574  
 10575  }
 10576  
 10577  func (s *RetryLayerUserStore) AnalyticsGetGuestCount() (int64, error) {
 10578  
 10579  	tries := 0
 10580  	for {
 10581  		result, err := s.UserStore.AnalyticsGetGuestCount()
 10582  		if err == nil {
 10583  			return result, nil
 10584  		}
 10585  		if !isRepeatableError(err) {
 10586  			return result, err
 10587  		}
 10588  		tries++
 10589  		if tries >= 3 {
 10590  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10591  			return result, err
 10592  		}
 10593  	}
 10594  
 10595  }
 10596  
 10597  func (s *RetryLayerUserStore) AnalyticsGetInactiveUsersCount() (int64, error) {
 10598  
 10599  	tries := 0
 10600  	for {
 10601  		result, err := s.UserStore.AnalyticsGetInactiveUsersCount()
 10602  		if err == nil {
 10603  			return result, nil
 10604  		}
 10605  		if !isRepeatableError(err) {
 10606  			return result, err
 10607  		}
 10608  		tries++
 10609  		if tries >= 3 {
 10610  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10611  			return result, err
 10612  		}
 10613  	}
 10614  
 10615  }
 10616  
 10617  func (s *RetryLayerUserStore) AnalyticsGetSystemAdminCount() (int64, error) {
 10618  
 10619  	tries := 0
 10620  	for {
 10621  		result, err := s.UserStore.AnalyticsGetSystemAdminCount()
 10622  		if err == nil {
 10623  			return result, nil
 10624  		}
 10625  		if !isRepeatableError(err) {
 10626  			return result, err
 10627  		}
 10628  		tries++
 10629  		if tries >= 3 {
 10630  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10631  			return result, err
 10632  		}
 10633  	}
 10634  
 10635  }
 10636  
 10637  func (s *RetryLayerUserStore) AutocompleteUsersInChannel(teamID string, channelID string, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, error) {
 10638  
 10639  	tries := 0
 10640  	for {
 10641  		result, err := s.UserStore.AutocompleteUsersInChannel(teamID, channelID, term, options)
 10642  		if err == nil {
 10643  			return result, nil
 10644  		}
 10645  		if !isRepeatableError(err) {
 10646  			return result, err
 10647  		}
 10648  		tries++
 10649  		if tries >= 3 {
 10650  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10651  			return result, err
 10652  		}
 10653  	}
 10654  
 10655  }
 10656  
 10657  func (s *RetryLayerUserStore) ClearAllCustomRoleAssignments() error {
 10658  
 10659  	tries := 0
 10660  	for {
 10661  		err := s.UserStore.ClearAllCustomRoleAssignments()
 10662  		if err == nil {
 10663  			return nil
 10664  		}
 10665  		if !isRepeatableError(err) {
 10666  			return err
 10667  		}
 10668  		tries++
 10669  		if tries >= 3 {
 10670  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10671  			return err
 10672  		}
 10673  	}
 10674  
 10675  }
 10676  
 10677  func (s *RetryLayerUserStore) ClearCaches() {
 10678  
 10679  	s.UserStore.ClearCaches()
 10680  
 10681  }
 10682  
 10683  func (s *RetryLayerUserStore) Count(options model.UserCountOptions) (int64, error) {
 10684  
 10685  	tries := 0
 10686  	for {
 10687  		result, err := s.UserStore.Count(options)
 10688  		if err == nil {
 10689  			return result, nil
 10690  		}
 10691  		if !isRepeatableError(err) {
 10692  			return result, err
 10693  		}
 10694  		tries++
 10695  		if tries >= 3 {
 10696  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10697  			return result, err
 10698  		}
 10699  	}
 10700  
 10701  }
 10702  
 10703  func (s *RetryLayerUserStore) DeactivateGuests() ([]string, error) {
 10704  
 10705  	tries := 0
 10706  	for {
 10707  		result, err := s.UserStore.DeactivateGuests()
 10708  		if err == nil {
 10709  			return result, nil
 10710  		}
 10711  		if !isRepeatableError(err) {
 10712  			return result, err
 10713  		}
 10714  		tries++
 10715  		if tries >= 3 {
 10716  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10717  			return result, err
 10718  		}
 10719  	}
 10720  
 10721  }
 10722  
 10723  func (s *RetryLayerUserStore) DemoteUserToGuest(userID string) (*model.User, error) {
 10724  
 10725  	tries := 0
 10726  	for {
 10727  		result, err := s.UserStore.DemoteUserToGuest(userID)
 10728  		if err == nil {
 10729  			return result, nil
 10730  		}
 10731  		if !isRepeatableError(err) {
 10732  			return result, err
 10733  		}
 10734  		tries++
 10735  		if tries >= 3 {
 10736  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10737  			return result, err
 10738  		}
 10739  	}
 10740  
 10741  }
 10742  
 10743  func (s *RetryLayerUserStore) Get(ctx context.Context, id string) (*model.User, error) {
 10744  
 10745  	tries := 0
 10746  	for {
 10747  		result, err := s.UserStore.Get(ctx, id)
 10748  		if err == nil {
 10749  			return result, nil
 10750  		}
 10751  		if !isRepeatableError(err) {
 10752  			return result, err
 10753  		}
 10754  		tries++
 10755  		if tries >= 3 {
 10756  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10757  			return result, err
 10758  		}
 10759  	}
 10760  
 10761  }
 10762  
 10763  func (s *RetryLayerUserStore) GetAll() ([]*model.User, error) {
 10764  
 10765  	tries := 0
 10766  	for {
 10767  		result, err := s.UserStore.GetAll()
 10768  		if err == nil {
 10769  			return result, nil
 10770  		}
 10771  		if !isRepeatableError(err) {
 10772  			return result, err
 10773  		}
 10774  		tries++
 10775  		if tries >= 3 {
 10776  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10777  			return result, err
 10778  		}
 10779  	}
 10780  
 10781  }
 10782  
 10783  func (s *RetryLayerUserStore) GetAllAfter(limit int, afterID string) ([]*model.User, error) {
 10784  
 10785  	tries := 0
 10786  	for {
 10787  		result, err := s.UserStore.GetAllAfter(limit, afterID)
 10788  		if err == nil {
 10789  			return result, nil
 10790  		}
 10791  		if !isRepeatableError(err) {
 10792  			return result, err
 10793  		}
 10794  		tries++
 10795  		if tries >= 3 {
 10796  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10797  			return result, err
 10798  		}
 10799  	}
 10800  
 10801  }
 10802  
 10803  func (s *RetryLayerUserStore) GetAllNotInAuthService(authServices []string) ([]*model.User, error) {
 10804  
 10805  	tries := 0
 10806  	for {
 10807  		result, err := s.UserStore.GetAllNotInAuthService(authServices)
 10808  		if err == nil {
 10809  			return result, nil
 10810  		}
 10811  		if !isRepeatableError(err) {
 10812  			return result, err
 10813  		}
 10814  		tries++
 10815  		if tries >= 3 {
 10816  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10817  			return result, err
 10818  		}
 10819  	}
 10820  
 10821  }
 10822  
 10823  func (s *RetryLayerUserStore) GetAllProfiles(options *model.UserGetOptions) ([]*model.User, error) {
 10824  
 10825  	tries := 0
 10826  	for {
 10827  		result, err := s.UserStore.GetAllProfiles(options)
 10828  		if err == nil {
 10829  			return result, nil
 10830  		}
 10831  		if !isRepeatableError(err) {
 10832  			return result, err
 10833  		}
 10834  		tries++
 10835  		if tries >= 3 {
 10836  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10837  			return result, err
 10838  		}
 10839  	}
 10840  
 10841  }
 10842  
 10843  func (s *RetryLayerUserStore) GetAllProfilesInChannel(ctx context.Context, channelID string, allowFromCache bool) (map[string]*model.User, error) {
 10844  
 10845  	tries := 0
 10846  	for {
 10847  		result, err := s.UserStore.GetAllProfilesInChannel(ctx, channelID, allowFromCache)
 10848  		if err == nil {
 10849  			return result, nil
 10850  		}
 10851  		if !isRepeatableError(err) {
 10852  			return result, err
 10853  		}
 10854  		tries++
 10855  		if tries >= 3 {
 10856  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10857  			return result, err
 10858  		}
 10859  	}
 10860  
 10861  }
 10862  
 10863  func (s *RetryLayerUserStore) GetAllUsingAuthService(authService string) ([]*model.User, error) {
 10864  
 10865  	tries := 0
 10866  	for {
 10867  		result, err := s.UserStore.GetAllUsingAuthService(authService)
 10868  		if err == nil {
 10869  			return result, nil
 10870  		}
 10871  		if !isRepeatableError(err) {
 10872  			return result, err
 10873  		}
 10874  		tries++
 10875  		if tries >= 3 {
 10876  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10877  			return result, err
 10878  		}
 10879  	}
 10880  
 10881  }
 10882  
 10883  func (s *RetryLayerUserStore) GetAnyUnreadPostCountForChannel(userID string, channelID string) (int64, error) {
 10884  
 10885  	tries := 0
 10886  	for {
 10887  		result, err := s.UserStore.GetAnyUnreadPostCountForChannel(userID, channelID)
 10888  		if err == nil {
 10889  			return result, nil
 10890  		}
 10891  		if !isRepeatableError(err) {
 10892  			return result, err
 10893  		}
 10894  		tries++
 10895  		if tries >= 3 {
 10896  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10897  			return result, err
 10898  		}
 10899  	}
 10900  
 10901  }
 10902  
 10903  func (s *RetryLayerUserStore) GetByAuth(authData *string, authService string) (*model.User, error) {
 10904  
 10905  	tries := 0
 10906  	for {
 10907  		result, err := s.UserStore.GetByAuth(authData, authService)
 10908  		if err == nil {
 10909  			return result, nil
 10910  		}
 10911  		if !isRepeatableError(err) {
 10912  			return result, err
 10913  		}
 10914  		tries++
 10915  		if tries >= 3 {
 10916  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10917  			return result, err
 10918  		}
 10919  	}
 10920  
 10921  }
 10922  
 10923  func (s *RetryLayerUserStore) GetByEmail(email string) (*model.User, error) {
 10924  
 10925  	tries := 0
 10926  	for {
 10927  		result, err := s.UserStore.GetByEmail(email)
 10928  		if err == nil {
 10929  			return result, nil
 10930  		}
 10931  		if !isRepeatableError(err) {
 10932  			return result, err
 10933  		}
 10934  		tries++
 10935  		if tries >= 3 {
 10936  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10937  			return result, err
 10938  		}
 10939  	}
 10940  
 10941  }
 10942  
 10943  func (s *RetryLayerUserStore) GetByUsername(username string) (*model.User, error) {
 10944  
 10945  	tries := 0
 10946  	for {
 10947  		result, err := s.UserStore.GetByUsername(username)
 10948  		if err == nil {
 10949  			return result, nil
 10950  		}
 10951  		if !isRepeatableError(err) {
 10952  			return result, err
 10953  		}
 10954  		tries++
 10955  		if tries >= 3 {
 10956  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10957  			return result, err
 10958  		}
 10959  	}
 10960  
 10961  }
 10962  
 10963  func (s *RetryLayerUserStore) GetChannelGroupUsers(channelID string) ([]*model.User, error) {
 10964  
 10965  	tries := 0
 10966  	for {
 10967  		result, err := s.UserStore.GetChannelGroupUsers(channelID)
 10968  		if err == nil {
 10969  			return result, nil
 10970  		}
 10971  		if !isRepeatableError(err) {
 10972  			return result, err
 10973  		}
 10974  		tries++
 10975  		if tries >= 3 {
 10976  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 10977  			return result, err
 10978  		}
 10979  	}
 10980  
 10981  }
 10982  
 10983  func (s *RetryLayerUserStore) GetEtagForAllProfiles() string {
 10984  
 10985  	return s.UserStore.GetEtagForAllProfiles()
 10986  
 10987  }
 10988  
 10989  func (s *RetryLayerUserStore) GetEtagForProfiles(teamID string) string {
 10990  
 10991  	return s.UserStore.GetEtagForProfiles(teamID)
 10992  
 10993  }
 10994  
 10995  func (s *RetryLayerUserStore) GetEtagForProfilesNotInTeam(teamID string) string {
 10996  
 10997  	return s.UserStore.GetEtagForProfilesNotInTeam(teamID)
 10998  
 10999  }
 11000  
 11001  func (s *RetryLayerUserStore) GetForLogin(loginID string, allowSignInWithUsername bool, allowSignInWithEmail bool) (*model.User, error) {
 11002  
 11003  	tries := 0
 11004  	for {
 11005  		result, err := s.UserStore.GetForLogin(loginID, allowSignInWithUsername, allowSignInWithEmail)
 11006  		if err == nil {
 11007  			return result, nil
 11008  		}
 11009  		if !isRepeatableError(err) {
 11010  			return result, err
 11011  		}
 11012  		tries++
 11013  		if tries >= 3 {
 11014  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11015  			return result, err
 11016  		}
 11017  	}
 11018  
 11019  }
 11020  
 11021  func (s *RetryLayerUserStore) GetKnownUsers(userID string) ([]string, error) {
 11022  
 11023  	tries := 0
 11024  	for {
 11025  		result, err := s.UserStore.GetKnownUsers(userID)
 11026  		if err == nil {
 11027  			return result, nil
 11028  		}
 11029  		if !isRepeatableError(err) {
 11030  			return result, err
 11031  		}
 11032  		tries++
 11033  		if tries >= 3 {
 11034  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11035  			return result, err
 11036  		}
 11037  	}
 11038  
 11039  }
 11040  
 11041  func (s *RetryLayerUserStore) GetMany(ctx context.Context, ids []string) ([]*model.User, error) {
 11042  
 11043  	tries := 0
 11044  	for {
 11045  		result, err := s.UserStore.GetMany(ctx, ids)
 11046  		if err == nil {
 11047  			return result, nil
 11048  		}
 11049  		if !isRepeatableError(err) {
 11050  			return result, err
 11051  		}
 11052  		tries++
 11053  		if tries >= 3 {
 11054  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11055  			return result, err
 11056  		}
 11057  	}
 11058  
 11059  }
 11060  
 11061  func (s *RetryLayerUserStore) GetNewUsersForTeam(teamID string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) {
 11062  
 11063  	tries := 0
 11064  	for {
 11065  		result, err := s.UserStore.GetNewUsersForTeam(teamID, offset, limit, viewRestrictions)
 11066  		if err == nil {
 11067  			return result, nil
 11068  		}
 11069  		if !isRepeatableError(err) {
 11070  			return result, err
 11071  		}
 11072  		tries++
 11073  		if tries >= 3 {
 11074  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11075  			return result, err
 11076  		}
 11077  	}
 11078  
 11079  }
 11080  
 11081  func (s *RetryLayerUserStore) GetProfileByGroupChannelIdsForUser(userID string, channelIds []string) (map[string][]*model.User, error) {
 11082  
 11083  	tries := 0
 11084  	for {
 11085  		result, err := s.UserStore.GetProfileByGroupChannelIdsForUser(userID, channelIds)
 11086  		if err == nil {
 11087  			return result, nil
 11088  		}
 11089  		if !isRepeatableError(err) {
 11090  			return result, err
 11091  		}
 11092  		tries++
 11093  		if tries >= 3 {
 11094  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11095  			return result, err
 11096  		}
 11097  	}
 11098  
 11099  }
 11100  
 11101  func (s *RetryLayerUserStore) GetProfileByIds(ctx context.Context, userIds []string, options *store.UserGetByIdsOpts, allowFromCache bool) ([]*model.User, error) {
 11102  
 11103  	tries := 0
 11104  	for {
 11105  		result, err := s.UserStore.GetProfileByIds(ctx, userIds, options, allowFromCache)
 11106  		if err == nil {
 11107  			return result, nil
 11108  		}
 11109  		if !isRepeatableError(err) {
 11110  			return result, err
 11111  		}
 11112  		tries++
 11113  		if tries >= 3 {
 11114  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11115  			return result, err
 11116  		}
 11117  	}
 11118  
 11119  }
 11120  
 11121  func (s *RetryLayerUserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User, error) {
 11122  
 11123  	tries := 0
 11124  	for {
 11125  		result, err := s.UserStore.GetProfiles(options)
 11126  		if err == nil {
 11127  			return result, nil
 11128  		}
 11129  		if !isRepeatableError(err) {
 11130  			return result, err
 11131  		}
 11132  		tries++
 11133  		if tries >= 3 {
 11134  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11135  			return result, err
 11136  		}
 11137  	}
 11138  
 11139  }
 11140  
 11141  func (s *RetryLayerUserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) {
 11142  
 11143  	tries := 0
 11144  	for {
 11145  		result, err := s.UserStore.GetProfilesByUsernames(usernames, viewRestrictions)
 11146  		if err == nil {
 11147  			return result, nil
 11148  		}
 11149  		if !isRepeatableError(err) {
 11150  			return result, err
 11151  		}
 11152  		tries++
 11153  		if tries >= 3 {
 11154  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11155  			return result, err
 11156  		}
 11157  	}
 11158  
 11159  }
 11160  
 11161  func (s *RetryLayerUserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*model.User, error) {
 11162  
 11163  	tries := 0
 11164  	for {
 11165  		result, err := s.UserStore.GetProfilesInChannel(options)
 11166  		if err == nil {
 11167  			return result, nil
 11168  		}
 11169  		if !isRepeatableError(err) {
 11170  			return result, err
 11171  		}
 11172  		tries++
 11173  		if tries >= 3 {
 11174  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11175  			return result, err
 11176  		}
 11177  	}
 11178  
 11179  }
 11180  
 11181  func (s *RetryLayerUserStore) GetProfilesInChannelByStatus(options *model.UserGetOptions) ([]*model.User, error) {
 11182  
 11183  	tries := 0
 11184  	for {
 11185  		result, err := s.UserStore.GetProfilesInChannelByStatus(options)
 11186  		if err == nil {
 11187  			return result, nil
 11188  		}
 11189  		if !isRepeatableError(err) {
 11190  			return result, err
 11191  		}
 11192  		tries++
 11193  		if tries >= 3 {
 11194  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11195  			return result, err
 11196  		}
 11197  	}
 11198  
 11199  }
 11200  
 11201  func (s *RetryLayerUserStore) GetProfilesNotInChannel(teamID string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) {
 11202  
 11203  	tries := 0
 11204  	for {
 11205  		result, err := s.UserStore.GetProfilesNotInChannel(teamID, channelId, groupConstrained, offset, limit, viewRestrictions)
 11206  		if err == nil {
 11207  			return result, nil
 11208  		}
 11209  		if !isRepeatableError(err) {
 11210  			return result, err
 11211  		}
 11212  		tries++
 11213  		if tries >= 3 {
 11214  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11215  			return result, err
 11216  		}
 11217  	}
 11218  
 11219  }
 11220  
 11221  func (s *RetryLayerUserStore) GetProfilesNotInTeam(teamID string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) {
 11222  
 11223  	tries := 0
 11224  	for {
 11225  		result, err := s.UserStore.GetProfilesNotInTeam(teamID, groupConstrained, offset, limit, viewRestrictions)
 11226  		if err == nil {
 11227  			return result, nil
 11228  		}
 11229  		if !isRepeatableError(err) {
 11230  			return result, err
 11231  		}
 11232  		tries++
 11233  		if tries >= 3 {
 11234  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11235  			return result, err
 11236  		}
 11237  	}
 11238  
 11239  }
 11240  
 11241  func (s *RetryLayerUserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*model.User, error) {
 11242  
 11243  	tries := 0
 11244  	for {
 11245  		result, err := s.UserStore.GetProfilesWithoutTeam(options)
 11246  		if err == nil {
 11247  			return result, nil
 11248  		}
 11249  		if !isRepeatableError(err) {
 11250  			return result, err
 11251  		}
 11252  		tries++
 11253  		if tries >= 3 {
 11254  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11255  			return result, err
 11256  		}
 11257  	}
 11258  
 11259  }
 11260  
 11261  func (s *RetryLayerUserStore) GetRecentlyActiveUsersForTeam(teamID string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) {
 11262  
 11263  	tries := 0
 11264  	for {
 11265  		result, err := s.UserStore.GetRecentlyActiveUsersForTeam(teamID, offset, limit, viewRestrictions)
 11266  		if err == nil {
 11267  			return result, nil
 11268  		}
 11269  		if !isRepeatableError(err) {
 11270  			return result, err
 11271  		}
 11272  		tries++
 11273  		if tries >= 3 {
 11274  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11275  			return result, err
 11276  		}
 11277  	}
 11278  
 11279  }
 11280  
 11281  func (s *RetryLayerUserStore) GetSystemAdminProfiles() (map[string]*model.User, error) {
 11282  
 11283  	tries := 0
 11284  	for {
 11285  		result, err := s.UserStore.GetSystemAdminProfiles()
 11286  		if err == nil {
 11287  			return result, nil
 11288  		}
 11289  		if !isRepeatableError(err) {
 11290  			return result, err
 11291  		}
 11292  		tries++
 11293  		if tries >= 3 {
 11294  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11295  			return result, err
 11296  		}
 11297  	}
 11298  
 11299  }
 11300  
 11301  func (s *RetryLayerUserStore) GetTeamGroupUsers(teamID string) ([]*model.User, error) {
 11302  
 11303  	tries := 0
 11304  	for {
 11305  		result, err := s.UserStore.GetTeamGroupUsers(teamID)
 11306  		if err == nil {
 11307  			return result, nil
 11308  		}
 11309  		if !isRepeatableError(err) {
 11310  			return result, err
 11311  		}
 11312  		tries++
 11313  		if tries >= 3 {
 11314  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11315  			return result, err
 11316  		}
 11317  	}
 11318  
 11319  }
 11320  
 11321  func (s *RetryLayerUserStore) GetUnreadCount(userID string) (int64, error) {
 11322  
 11323  	tries := 0
 11324  	for {
 11325  		result, err := s.UserStore.GetUnreadCount(userID)
 11326  		if err == nil {
 11327  			return result, nil
 11328  		}
 11329  		if !isRepeatableError(err) {
 11330  			return result, err
 11331  		}
 11332  		tries++
 11333  		if tries >= 3 {
 11334  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11335  			return result, err
 11336  		}
 11337  	}
 11338  
 11339  }
 11340  
 11341  func (s *RetryLayerUserStore) GetUnreadCountForChannel(userID string, channelID string) (int64, error) {
 11342  
 11343  	tries := 0
 11344  	for {
 11345  		result, err := s.UserStore.GetUnreadCountForChannel(userID, channelID)
 11346  		if err == nil {
 11347  			return result, nil
 11348  		}
 11349  		if !isRepeatableError(err) {
 11350  			return result, err
 11351  		}
 11352  		tries++
 11353  		if tries >= 3 {
 11354  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11355  			return result, err
 11356  		}
 11357  	}
 11358  
 11359  }
 11360  
 11361  func (s *RetryLayerUserStore) GetUsersBatchForIndexing(startTime int64, endTime int64, limit int) ([]*model.UserForIndexing, error) {
 11362  
 11363  	tries := 0
 11364  	for {
 11365  		result, err := s.UserStore.GetUsersBatchForIndexing(startTime, endTime, limit)
 11366  		if err == nil {
 11367  			return result, nil
 11368  		}
 11369  		if !isRepeatableError(err) {
 11370  			return result, err
 11371  		}
 11372  		tries++
 11373  		if tries >= 3 {
 11374  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11375  			return result, err
 11376  		}
 11377  	}
 11378  
 11379  }
 11380  
 11381  func (s *RetryLayerUserStore) InferSystemInstallDate() (int64, error) {
 11382  
 11383  	tries := 0
 11384  	for {
 11385  		result, err := s.UserStore.InferSystemInstallDate()
 11386  		if err == nil {
 11387  			return result, nil
 11388  		}
 11389  		if !isRepeatableError(err) {
 11390  			return result, err
 11391  		}
 11392  		tries++
 11393  		if tries >= 3 {
 11394  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11395  			return result, err
 11396  		}
 11397  	}
 11398  
 11399  }
 11400  
 11401  func (s *RetryLayerUserStore) InvalidateProfileCacheForUser(userID string) {
 11402  
 11403  	s.UserStore.InvalidateProfileCacheForUser(userID)
 11404  
 11405  }
 11406  
 11407  func (s *RetryLayerUserStore) InvalidateProfilesInChannelCache(channelID string) {
 11408  
 11409  	s.UserStore.InvalidateProfilesInChannelCache(channelID)
 11410  
 11411  }
 11412  
 11413  func (s *RetryLayerUserStore) InvalidateProfilesInChannelCacheByUser(userID string) {
 11414  
 11415  	s.UserStore.InvalidateProfilesInChannelCacheByUser(userID)
 11416  
 11417  }
 11418  
 11419  func (s *RetryLayerUserStore) PermanentDelete(userID string) error {
 11420  
 11421  	tries := 0
 11422  	for {
 11423  		err := s.UserStore.PermanentDelete(userID)
 11424  		if err == nil {
 11425  			return nil
 11426  		}
 11427  		if !isRepeatableError(err) {
 11428  			return err
 11429  		}
 11430  		tries++
 11431  		if tries >= 3 {
 11432  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11433  			return err
 11434  		}
 11435  	}
 11436  
 11437  }
 11438  
 11439  func (s *RetryLayerUserStore) PromoteGuestToUser(userID string) error {
 11440  
 11441  	tries := 0
 11442  	for {
 11443  		err := s.UserStore.PromoteGuestToUser(userID)
 11444  		if err == nil {
 11445  			return nil
 11446  		}
 11447  		if !isRepeatableError(err) {
 11448  			return err
 11449  		}
 11450  		tries++
 11451  		if tries >= 3 {
 11452  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11453  			return err
 11454  		}
 11455  	}
 11456  
 11457  }
 11458  
 11459  func (s *RetryLayerUserStore) ResetAuthDataToEmailForUsers(service string, userIDs []string, includeDeleted bool, dryRun bool) (int, error) {
 11460  
 11461  	tries := 0
 11462  	for {
 11463  		result, err := s.UserStore.ResetAuthDataToEmailForUsers(service, userIDs, includeDeleted, dryRun)
 11464  		if err == nil {
 11465  			return result, nil
 11466  		}
 11467  		if !isRepeatableError(err) {
 11468  			return result, err
 11469  		}
 11470  		tries++
 11471  		if tries >= 3 {
 11472  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11473  			return result, err
 11474  		}
 11475  	}
 11476  
 11477  }
 11478  
 11479  func (s *RetryLayerUserStore) ResetLastPictureUpdate(userID string) error {
 11480  
 11481  	tries := 0
 11482  	for {
 11483  		err := s.UserStore.ResetLastPictureUpdate(userID)
 11484  		if err == nil {
 11485  			return nil
 11486  		}
 11487  		if !isRepeatableError(err) {
 11488  			return err
 11489  		}
 11490  		tries++
 11491  		if tries >= 3 {
 11492  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11493  			return err
 11494  		}
 11495  	}
 11496  
 11497  }
 11498  
 11499  func (s *RetryLayerUserStore) Save(user *model.User) (*model.User, error) {
 11500  
 11501  	tries := 0
 11502  	for {
 11503  		result, err := s.UserStore.Save(user)
 11504  		if err == nil {
 11505  			return result, nil
 11506  		}
 11507  		if !isRepeatableError(err) {
 11508  			return result, err
 11509  		}
 11510  		tries++
 11511  		if tries >= 3 {
 11512  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11513  			return result, err
 11514  		}
 11515  	}
 11516  
 11517  }
 11518  
 11519  func (s *RetryLayerUserStore) Search(teamID string, term string, options *model.UserSearchOptions) ([]*model.User, error) {
 11520  
 11521  	tries := 0
 11522  	for {
 11523  		result, err := s.UserStore.Search(teamID, term, options)
 11524  		if err == nil {
 11525  			return result, nil
 11526  		}
 11527  		if !isRepeatableError(err) {
 11528  			return result, err
 11529  		}
 11530  		tries++
 11531  		if tries >= 3 {
 11532  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11533  			return result, err
 11534  		}
 11535  	}
 11536  
 11537  }
 11538  
 11539  func (s *RetryLayerUserStore) SearchInChannel(channelID string, term string, options *model.UserSearchOptions) ([]*model.User, error) {
 11540  
 11541  	tries := 0
 11542  	for {
 11543  		result, err := s.UserStore.SearchInChannel(channelID, term, options)
 11544  		if err == nil {
 11545  			return result, nil
 11546  		}
 11547  		if !isRepeatableError(err) {
 11548  			return result, err
 11549  		}
 11550  		tries++
 11551  		if tries >= 3 {
 11552  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11553  			return result, err
 11554  		}
 11555  	}
 11556  
 11557  }
 11558  
 11559  func (s *RetryLayerUserStore) SearchInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, error) {
 11560  
 11561  	tries := 0
 11562  	for {
 11563  		result, err := s.UserStore.SearchInGroup(groupID, term, options)
 11564  		if err == nil {
 11565  			return result, nil
 11566  		}
 11567  		if !isRepeatableError(err) {
 11568  			return result, err
 11569  		}
 11570  		tries++
 11571  		if tries >= 3 {
 11572  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11573  			return result, err
 11574  		}
 11575  	}
 11576  
 11577  }
 11578  
 11579  func (s *RetryLayerUserStore) SearchNotInChannel(teamID string, channelID string, term string, options *model.UserSearchOptions) ([]*model.User, error) {
 11580  
 11581  	tries := 0
 11582  	for {
 11583  		result, err := s.UserStore.SearchNotInChannel(teamID, channelID, term, options)
 11584  		if err == nil {
 11585  			return result, nil
 11586  		}
 11587  		if !isRepeatableError(err) {
 11588  			return result, err
 11589  		}
 11590  		tries++
 11591  		if tries >= 3 {
 11592  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11593  			return result, err
 11594  		}
 11595  	}
 11596  
 11597  }
 11598  
 11599  func (s *RetryLayerUserStore) SearchNotInTeam(notInTeamID string, term string, options *model.UserSearchOptions) ([]*model.User, error) {
 11600  
 11601  	tries := 0
 11602  	for {
 11603  		result, err := s.UserStore.SearchNotInTeam(notInTeamID, term, options)
 11604  		if err == nil {
 11605  			return result, nil
 11606  		}
 11607  		if !isRepeatableError(err) {
 11608  			return result, err
 11609  		}
 11610  		tries++
 11611  		if tries >= 3 {
 11612  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11613  			return result, err
 11614  		}
 11615  	}
 11616  
 11617  }
 11618  
 11619  func (s *RetryLayerUserStore) SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, error) {
 11620  
 11621  	tries := 0
 11622  	for {
 11623  		result, err := s.UserStore.SearchWithoutTeam(term, options)
 11624  		if err == nil {
 11625  			return result, nil
 11626  		}
 11627  		if !isRepeatableError(err) {
 11628  			return result, err
 11629  		}
 11630  		tries++
 11631  		if tries >= 3 {
 11632  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11633  			return result, err
 11634  		}
 11635  	}
 11636  
 11637  }
 11638  
 11639  func (s *RetryLayerUserStore) Update(user *model.User, allowRoleUpdate bool) (*model.UserUpdate, error) {
 11640  
 11641  	tries := 0
 11642  	for {
 11643  		result, err := s.UserStore.Update(user, allowRoleUpdate)
 11644  		if err == nil {
 11645  			return result, nil
 11646  		}
 11647  		if !isRepeatableError(err) {
 11648  			return result, err
 11649  		}
 11650  		tries++
 11651  		if tries >= 3 {
 11652  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11653  			return result, err
 11654  		}
 11655  	}
 11656  
 11657  }
 11658  
 11659  func (s *RetryLayerUserStore) UpdateAuthData(userID string, service string, authData *string, email string, resetMfa bool) (string, error) {
 11660  
 11661  	tries := 0
 11662  	for {
 11663  		result, err := s.UserStore.UpdateAuthData(userID, service, authData, email, resetMfa)
 11664  		if err == nil {
 11665  			return result, nil
 11666  		}
 11667  		if !isRepeatableError(err) {
 11668  			return result, err
 11669  		}
 11670  		tries++
 11671  		if tries >= 3 {
 11672  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11673  			return result, err
 11674  		}
 11675  	}
 11676  
 11677  }
 11678  
 11679  func (s *RetryLayerUserStore) UpdateFailedPasswordAttempts(userID string, attempts int) error {
 11680  
 11681  	tries := 0
 11682  	for {
 11683  		err := s.UserStore.UpdateFailedPasswordAttempts(userID, attempts)
 11684  		if err == nil {
 11685  			return nil
 11686  		}
 11687  		if !isRepeatableError(err) {
 11688  			return err
 11689  		}
 11690  		tries++
 11691  		if tries >= 3 {
 11692  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11693  			return err
 11694  		}
 11695  	}
 11696  
 11697  }
 11698  
 11699  func (s *RetryLayerUserStore) UpdateLastPictureUpdate(userID string) error {
 11700  
 11701  	tries := 0
 11702  	for {
 11703  		err := s.UserStore.UpdateLastPictureUpdate(userID)
 11704  		if err == nil {
 11705  			return nil
 11706  		}
 11707  		if !isRepeatableError(err) {
 11708  			return err
 11709  		}
 11710  		tries++
 11711  		if tries >= 3 {
 11712  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11713  			return err
 11714  		}
 11715  	}
 11716  
 11717  }
 11718  
 11719  func (s *RetryLayerUserStore) UpdateMfaActive(userID string, active bool) error {
 11720  
 11721  	tries := 0
 11722  	for {
 11723  		err := s.UserStore.UpdateMfaActive(userID, active)
 11724  		if err == nil {
 11725  			return nil
 11726  		}
 11727  		if !isRepeatableError(err) {
 11728  			return err
 11729  		}
 11730  		tries++
 11731  		if tries >= 3 {
 11732  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11733  			return err
 11734  		}
 11735  	}
 11736  
 11737  }
 11738  
 11739  func (s *RetryLayerUserStore) UpdateMfaSecret(userID string, secret string) error {
 11740  
 11741  	tries := 0
 11742  	for {
 11743  		err := s.UserStore.UpdateMfaSecret(userID, secret)
 11744  		if err == nil {
 11745  			return nil
 11746  		}
 11747  		if !isRepeatableError(err) {
 11748  			return err
 11749  		}
 11750  		tries++
 11751  		if tries >= 3 {
 11752  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11753  			return err
 11754  		}
 11755  	}
 11756  
 11757  }
 11758  
 11759  func (s *RetryLayerUserStore) UpdatePassword(userID string, newPassword string) error {
 11760  
 11761  	tries := 0
 11762  	for {
 11763  		err := s.UserStore.UpdatePassword(userID, newPassword)
 11764  		if err == nil {
 11765  			return nil
 11766  		}
 11767  		if !isRepeatableError(err) {
 11768  			return err
 11769  		}
 11770  		tries++
 11771  		if tries >= 3 {
 11772  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11773  			return err
 11774  		}
 11775  	}
 11776  
 11777  }
 11778  
 11779  func (s *RetryLayerUserStore) UpdateUpdateAt(userID string) (int64, error) {
 11780  
 11781  	tries := 0
 11782  	for {
 11783  		result, err := s.UserStore.UpdateUpdateAt(userID)
 11784  		if err == nil {
 11785  			return result, nil
 11786  		}
 11787  		if !isRepeatableError(err) {
 11788  			return result, err
 11789  		}
 11790  		tries++
 11791  		if tries >= 3 {
 11792  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11793  			return result, err
 11794  		}
 11795  	}
 11796  
 11797  }
 11798  
 11799  func (s *RetryLayerUserStore) VerifyEmail(userID string, email string) (string, error) {
 11800  
 11801  	tries := 0
 11802  	for {
 11803  		result, err := s.UserStore.VerifyEmail(userID, email)
 11804  		if err == nil {
 11805  			return result, nil
 11806  		}
 11807  		if !isRepeatableError(err) {
 11808  			return result, err
 11809  		}
 11810  		tries++
 11811  		if tries >= 3 {
 11812  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11813  			return result, err
 11814  		}
 11815  	}
 11816  
 11817  }
 11818  
 11819  func (s *RetryLayerUserAccessTokenStore) Delete(tokenID string) error {
 11820  
 11821  	tries := 0
 11822  	for {
 11823  		err := s.UserAccessTokenStore.Delete(tokenID)
 11824  		if err == nil {
 11825  			return nil
 11826  		}
 11827  		if !isRepeatableError(err) {
 11828  			return err
 11829  		}
 11830  		tries++
 11831  		if tries >= 3 {
 11832  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11833  			return err
 11834  		}
 11835  	}
 11836  
 11837  }
 11838  
 11839  func (s *RetryLayerUserAccessTokenStore) DeleteAllForUser(userID string) error {
 11840  
 11841  	tries := 0
 11842  	for {
 11843  		err := s.UserAccessTokenStore.DeleteAllForUser(userID)
 11844  		if err == nil {
 11845  			return nil
 11846  		}
 11847  		if !isRepeatableError(err) {
 11848  			return err
 11849  		}
 11850  		tries++
 11851  		if tries >= 3 {
 11852  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11853  			return err
 11854  		}
 11855  	}
 11856  
 11857  }
 11858  
 11859  func (s *RetryLayerUserAccessTokenStore) Get(tokenID string) (*model.UserAccessToken, error) {
 11860  
 11861  	tries := 0
 11862  	for {
 11863  		result, err := s.UserAccessTokenStore.Get(tokenID)
 11864  		if err == nil {
 11865  			return result, nil
 11866  		}
 11867  		if !isRepeatableError(err) {
 11868  			return result, err
 11869  		}
 11870  		tries++
 11871  		if tries >= 3 {
 11872  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11873  			return result, err
 11874  		}
 11875  	}
 11876  
 11877  }
 11878  
 11879  func (s *RetryLayerUserAccessTokenStore) GetAll(offset int, limit int) ([]*model.UserAccessToken, error) {
 11880  
 11881  	tries := 0
 11882  	for {
 11883  		result, err := s.UserAccessTokenStore.GetAll(offset, limit)
 11884  		if err == nil {
 11885  			return result, nil
 11886  		}
 11887  		if !isRepeatableError(err) {
 11888  			return result, err
 11889  		}
 11890  		tries++
 11891  		if tries >= 3 {
 11892  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11893  			return result, err
 11894  		}
 11895  	}
 11896  
 11897  }
 11898  
 11899  func (s *RetryLayerUserAccessTokenStore) GetByToken(tokenString string) (*model.UserAccessToken, error) {
 11900  
 11901  	tries := 0
 11902  	for {
 11903  		result, err := s.UserAccessTokenStore.GetByToken(tokenString)
 11904  		if err == nil {
 11905  			return result, nil
 11906  		}
 11907  		if !isRepeatableError(err) {
 11908  			return result, err
 11909  		}
 11910  		tries++
 11911  		if tries >= 3 {
 11912  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11913  			return result, err
 11914  		}
 11915  	}
 11916  
 11917  }
 11918  
 11919  func (s *RetryLayerUserAccessTokenStore) GetByUser(userID string, page int, perPage int) ([]*model.UserAccessToken, error) {
 11920  
 11921  	tries := 0
 11922  	for {
 11923  		result, err := s.UserAccessTokenStore.GetByUser(userID, page, perPage)
 11924  		if err == nil {
 11925  			return result, nil
 11926  		}
 11927  		if !isRepeatableError(err) {
 11928  			return result, err
 11929  		}
 11930  		tries++
 11931  		if tries >= 3 {
 11932  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11933  			return result, err
 11934  		}
 11935  	}
 11936  
 11937  }
 11938  
 11939  func (s *RetryLayerUserAccessTokenStore) Save(token *model.UserAccessToken) (*model.UserAccessToken, error) {
 11940  
 11941  	tries := 0
 11942  	for {
 11943  		result, err := s.UserAccessTokenStore.Save(token)
 11944  		if err == nil {
 11945  			return result, nil
 11946  		}
 11947  		if !isRepeatableError(err) {
 11948  			return result, err
 11949  		}
 11950  		tries++
 11951  		if tries >= 3 {
 11952  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11953  			return result, err
 11954  		}
 11955  	}
 11956  
 11957  }
 11958  
 11959  func (s *RetryLayerUserAccessTokenStore) Search(term string) ([]*model.UserAccessToken, error) {
 11960  
 11961  	tries := 0
 11962  	for {
 11963  		result, err := s.UserAccessTokenStore.Search(term)
 11964  		if err == nil {
 11965  			return result, nil
 11966  		}
 11967  		if !isRepeatableError(err) {
 11968  			return result, err
 11969  		}
 11970  		tries++
 11971  		if tries >= 3 {
 11972  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11973  			return result, err
 11974  		}
 11975  	}
 11976  
 11977  }
 11978  
 11979  func (s *RetryLayerUserAccessTokenStore) UpdateTokenDisable(tokenID string) error {
 11980  
 11981  	tries := 0
 11982  	for {
 11983  		err := s.UserAccessTokenStore.UpdateTokenDisable(tokenID)
 11984  		if err == nil {
 11985  			return nil
 11986  		}
 11987  		if !isRepeatableError(err) {
 11988  			return err
 11989  		}
 11990  		tries++
 11991  		if tries >= 3 {
 11992  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 11993  			return err
 11994  		}
 11995  	}
 11996  
 11997  }
 11998  
 11999  func (s *RetryLayerUserAccessTokenStore) UpdateTokenEnable(tokenID string) error {
 12000  
 12001  	tries := 0
 12002  	for {
 12003  		err := s.UserAccessTokenStore.UpdateTokenEnable(tokenID)
 12004  		if err == nil {
 12005  			return nil
 12006  		}
 12007  		if !isRepeatableError(err) {
 12008  			return err
 12009  		}
 12010  		tries++
 12011  		if tries >= 3 {
 12012  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12013  			return err
 12014  		}
 12015  	}
 12016  
 12017  }
 12018  
 12019  func (s *RetryLayerUserTermsOfServiceStore) Delete(userID string, termsOfServiceId string) error {
 12020  
 12021  	tries := 0
 12022  	for {
 12023  		err := s.UserTermsOfServiceStore.Delete(userID, termsOfServiceId)
 12024  		if err == nil {
 12025  			return nil
 12026  		}
 12027  		if !isRepeatableError(err) {
 12028  			return err
 12029  		}
 12030  		tries++
 12031  		if tries >= 3 {
 12032  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12033  			return err
 12034  		}
 12035  	}
 12036  
 12037  }
 12038  
 12039  func (s *RetryLayerUserTermsOfServiceStore) GetByUser(userID string) (*model.UserTermsOfService, error) {
 12040  
 12041  	tries := 0
 12042  	for {
 12043  		result, err := s.UserTermsOfServiceStore.GetByUser(userID)
 12044  		if err == nil {
 12045  			return result, nil
 12046  		}
 12047  		if !isRepeatableError(err) {
 12048  			return result, err
 12049  		}
 12050  		tries++
 12051  		if tries >= 3 {
 12052  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12053  			return result, err
 12054  		}
 12055  	}
 12056  
 12057  }
 12058  
 12059  func (s *RetryLayerUserTermsOfServiceStore) Save(userTermsOfService *model.UserTermsOfService) (*model.UserTermsOfService, error) {
 12060  
 12061  	tries := 0
 12062  	for {
 12063  		result, err := s.UserTermsOfServiceStore.Save(userTermsOfService)
 12064  		if err == nil {
 12065  			return result, nil
 12066  		}
 12067  		if !isRepeatableError(err) {
 12068  			return result, err
 12069  		}
 12070  		tries++
 12071  		if tries >= 3 {
 12072  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12073  			return result, err
 12074  		}
 12075  	}
 12076  
 12077  }
 12078  
 12079  func (s *RetryLayerWebhookStore) AnalyticsIncomingCount(teamID string) (int64, error) {
 12080  
 12081  	tries := 0
 12082  	for {
 12083  		result, err := s.WebhookStore.AnalyticsIncomingCount(teamID)
 12084  		if err == nil {
 12085  			return result, nil
 12086  		}
 12087  		if !isRepeatableError(err) {
 12088  			return result, err
 12089  		}
 12090  		tries++
 12091  		if tries >= 3 {
 12092  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12093  			return result, err
 12094  		}
 12095  	}
 12096  
 12097  }
 12098  
 12099  func (s *RetryLayerWebhookStore) AnalyticsOutgoingCount(teamID string) (int64, error) {
 12100  
 12101  	tries := 0
 12102  	for {
 12103  		result, err := s.WebhookStore.AnalyticsOutgoingCount(teamID)
 12104  		if err == nil {
 12105  			return result, nil
 12106  		}
 12107  		if !isRepeatableError(err) {
 12108  			return result, err
 12109  		}
 12110  		tries++
 12111  		if tries >= 3 {
 12112  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12113  			return result, err
 12114  		}
 12115  	}
 12116  
 12117  }
 12118  
 12119  func (s *RetryLayerWebhookStore) ClearCaches() {
 12120  
 12121  	s.WebhookStore.ClearCaches()
 12122  
 12123  }
 12124  
 12125  func (s *RetryLayerWebhookStore) DeleteIncoming(webhookID string, time int64) error {
 12126  
 12127  	tries := 0
 12128  	for {
 12129  		err := s.WebhookStore.DeleteIncoming(webhookID, time)
 12130  		if err == nil {
 12131  			return nil
 12132  		}
 12133  		if !isRepeatableError(err) {
 12134  			return err
 12135  		}
 12136  		tries++
 12137  		if tries >= 3 {
 12138  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12139  			return err
 12140  		}
 12141  	}
 12142  
 12143  }
 12144  
 12145  func (s *RetryLayerWebhookStore) DeleteOutgoing(webhookID string, time int64) error {
 12146  
 12147  	tries := 0
 12148  	for {
 12149  		err := s.WebhookStore.DeleteOutgoing(webhookID, time)
 12150  		if err == nil {
 12151  			return nil
 12152  		}
 12153  		if !isRepeatableError(err) {
 12154  			return err
 12155  		}
 12156  		tries++
 12157  		if tries >= 3 {
 12158  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12159  			return err
 12160  		}
 12161  	}
 12162  
 12163  }
 12164  
 12165  func (s *RetryLayerWebhookStore) GetIncoming(id string, allowFromCache bool) (*model.IncomingWebhook, error) {
 12166  
 12167  	tries := 0
 12168  	for {
 12169  		result, err := s.WebhookStore.GetIncoming(id, allowFromCache)
 12170  		if err == nil {
 12171  			return result, nil
 12172  		}
 12173  		if !isRepeatableError(err) {
 12174  			return result, err
 12175  		}
 12176  		tries++
 12177  		if tries >= 3 {
 12178  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12179  			return result, err
 12180  		}
 12181  	}
 12182  
 12183  }
 12184  
 12185  func (s *RetryLayerWebhookStore) GetIncomingByChannel(channelID string) ([]*model.IncomingWebhook, error) {
 12186  
 12187  	tries := 0
 12188  	for {
 12189  		result, err := s.WebhookStore.GetIncomingByChannel(channelID)
 12190  		if err == nil {
 12191  			return result, nil
 12192  		}
 12193  		if !isRepeatableError(err) {
 12194  			return result, err
 12195  		}
 12196  		tries++
 12197  		if tries >= 3 {
 12198  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12199  			return result, err
 12200  		}
 12201  	}
 12202  
 12203  }
 12204  
 12205  func (s *RetryLayerWebhookStore) GetIncomingByTeam(teamID string, offset int, limit int) ([]*model.IncomingWebhook, error) {
 12206  
 12207  	tries := 0
 12208  	for {
 12209  		result, err := s.WebhookStore.GetIncomingByTeam(teamID, offset, limit)
 12210  		if err == nil {
 12211  			return result, nil
 12212  		}
 12213  		if !isRepeatableError(err) {
 12214  			return result, err
 12215  		}
 12216  		tries++
 12217  		if tries >= 3 {
 12218  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12219  			return result, err
 12220  		}
 12221  	}
 12222  
 12223  }
 12224  
 12225  func (s *RetryLayerWebhookStore) GetIncomingByTeamByUser(teamID string, userID string, offset int, limit int) ([]*model.IncomingWebhook, error) {
 12226  
 12227  	tries := 0
 12228  	for {
 12229  		result, err := s.WebhookStore.GetIncomingByTeamByUser(teamID, userID, offset, limit)
 12230  		if err == nil {
 12231  			return result, nil
 12232  		}
 12233  		if !isRepeatableError(err) {
 12234  			return result, err
 12235  		}
 12236  		tries++
 12237  		if tries >= 3 {
 12238  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12239  			return result, err
 12240  		}
 12241  	}
 12242  
 12243  }
 12244  
 12245  func (s *RetryLayerWebhookStore) GetIncomingList(offset int, limit int) ([]*model.IncomingWebhook, error) {
 12246  
 12247  	tries := 0
 12248  	for {
 12249  		result, err := s.WebhookStore.GetIncomingList(offset, limit)
 12250  		if err == nil {
 12251  			return result, nil
 12252  		}
 12253  		if !isRepeatableError(err) {
 12254  			return result, err
 12255  		}
 12256  		tries++
 12257  		if tries >= 3 {
 12258  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12259  			return result, err
 12260  		}
 12261  	}
 12262  
 12263  }
 12264  
 12265  func (s *RetryLayerWebhookStore) GetIncomingListByUser(userID string, offset int, limit int) ([]*model.IncomingWebhook, error) {
 12266  
 12267  	tries := 0
 12268  	for {
 12269  		result, err := s.WebhookStore.GetIncomingListByUser(userID, offset, limit)
 12270  		if err == nil {
 12271  			return result, nil
 12272  		}
 12273  		if !isRepeatableError(err) {
 12274  			return result, err
 12275  		}
 12276  		tries++
 12277  		if tries >= 3 {
 12278  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12279  			return result, err
 12280  		}
 12281  	}
 12282  
 12283  }
 12284  
 12285  func (s *RetryLayerWebhookStore) GetOutgoing(id string) (*model.OutgoingWebhook, error) {
 12286  
 12287  	tries := 0
 12288  	for {
 12289  		result, err := s.WebhookStore.GetOutgoing(id)
 12290  		if err == nil {
 12291  			return result, nil
 12292  		}
 12293  		if !isRepeatableError(err) {
 12294  			return result, err
 12295  		}
 12296  		tries++
 12297  		if tries >= 3 {
 12298  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12299  			return result, err
 12300  		}
 12301  	}
 12302  
 12303  }
 12304  
 12305  func (s *RetryLayerWebhookStore) GetOutgoingByChannel(channelID string, offset int, limit int) ([]*model.OutgoingWebhook, error) {
 12306  
 12307  	tries := 0
 12308  	for {
 12309  		result, err := s.WebhookStore.GetOutgoingByChannel(channelID, offset, limit)
 12310  		if err == nil {
 12311  			return result, nil
 12312  		}
 12313  		if !isRepeatableError(err) {
 12314  			return result, err
 12315  		}
 12316  		tries++
 12317  		if tries >= 3 {
 12318  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12319  			return result, err
 12320  		}
 12321  	}
 12322  
 12323  }
 12324  
 12325  func (s *RetryLayerWebhookStore) GetOutgoingByChannelByUser(channelID string, userID string, offset int, limit int) ([]*model.OutgoingWebhook, error) {
 12326  
 12327  	tries := 0
 12328  	for {
 12329  		result, err := s.WebhookStore.GetOutgoingByChannelByUser(channelID, userID, offset, limit)
 12330  		if err == nil {
 12331  			return result, nil
 12332  		}
 12333  		if !isRepeatableError(err) {
 12334  			return result, err
 12335  		}
 12336  		tries++
 12337  		if tries >= 3 {
 12338  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12339  			return result, err
 12340  		}
 12341  	}
 12342  
 12343  }
 12344  
 12345  func (s *RetryLayerWebhookStore) GetOutgoingByTeam(teamID string, offset int, limit int) ([]*model.OutgoingWebhook, error) {
 12346  
 12347  	tries := 0
 12348  	for {
 12349  		result, err := s.WebhookStore.GetOutgoingByTeam(teamID, offset, limit)
 12350  		if err == nil {
 12351  			return result, nil
 12352  		}
 12353  		if !isRepeatableError(err) {
 12354  			return result, err
 12355  		}
 12356  		tries++
 12357  		if tries >= 3 {
 12358  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12359  			return result, err
 12360  		}
 12361  	}
 12362  
 12363  }
 12364  
 12365  func (s *RetryLayerWebhookStore) GetOutgoingByTeamByUser(teamID string, userID string, offset int, limit int) ([]*model.OutgoingWebhook, error) {
 12366  
 12367  	tries := 0
 12368  	for {
 12369  		result, err := s.WebhookStore.GetOutgoingByTeamByUser(teamID, userID, offset, limit)
 12370  		if err == nil {
 12371  			return result, nil
 12372  		}
 12373  		if !isRepeatableError(err) {
 12374  			return result, err
 12375  		}
 12376  		tries++
 12377  		if tries >= 3 {
 12378  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12379  			return result, err
 12380  		}
 12381  	}
 12382  
 12383  }
 12384  
 12385  func (s *RetryLayerWebhookStore) GetOutgoingList(offset int, limit int) ([]*model.OutgoingWebhook, error) {
 12386  
 12387  	tries := 0
 12388  	for {
 12389  		result, err := s.WebhookStore.GetOutgoingList(offset, limit)
 12390  		if err == nil {
 12391  			return result, nil
 12392  		}
 12393  		if !isRepeatableError(err) {
 12394  			return result, err
 12395  		}
 12396  		tries++
 12397  		if tries >= 3 {
 12398  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12399  			return result, err
 12400  		}
 12401  	}
 12402  
 12403  }
 12404  
 12405  func (s *RetryLayerWebhookStore) GetOutgoingListByUser(userID string, offset int, limit int) ([]*model.OutgoingWebhook, error) {
 12406  
 12407  	tries := 0
 12408  	for {
 12409  		result, err := s.WebhookStore.GetOutgoingListByUser(userID, offset, limit)
 12410  		if err == nil {
 12411  			return result, nil
 12412  		}
 12413  		if !isRepeatableError(err) {
 12414  			return result, err
 12415  		}
 12416  		tries++
 12417  		if tries >= 3 {
 12418  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12419  			return result, err
 12420  		}
 12421  	}
 12422  
 12423  }
 12424  
 12425  func (s *RetryLayerWebhookStore) InvalidateWebhookCache(webhook string) {
 12426  
 12427  	s.WebhookStore.InvalidateWebhookCache(webhook)
 12428  
 12429  }
 12430  
 12431  func (s *RetryLayerWebhookStore) PermanentDeleteIncomingByChannel(channelID string) error {
 12432  
 12433  	tries := 0
 12434  	for {
 12435  		err := s.WebhookStore.PermanentDeleteIncomingByChannel(channelID)
 12436  		if err == nil {
 12437  			return nil
 12438  		}
 12439  		if !isRepeatableError(err) {
 12440  			return err
 12441  		}
 12442  		tries++
 12443  		if tries >= 3 {
 12444  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12445  			return err
 12446  		}
 12447  	}
 12448  
 12449  }
 12450  
 12451  func (s *RetryLayerWebhookStore) PermanentDeleteIncomingByUser(userID string) error {
 12452  
 12453  	tries := 0
 12454  	for {
 12455  		err := s.WebhookStore.PermanentDeleteIncomingByUser(userID)
 12456  		if err == nil {
 12457  			return nil
 12458  		}
 12459  		if !isRepeatableError(err) {
 12460  			return err
 12461  		}
 12462  		tries++
 12463  		if tries >= 3 {
 12464  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12465  			return err
 12466  		}
 12467  	}
 12468  
 12469  }
 12470  
 12471  func (s *RetryLayerWebhookStore) PermanentDeleteOutgoingByChannel(channelID string) error {
 12472  
 12473  	tries := 0
 12474  	for {
 12475  		err := s.WebhookStore.PermanentDeleteOutgoingByChannel(channelID)
 12476  		if err == nil {
 12477  			return nil
 12478  		}
 12479  		if !isRepeatableError(err) {
 12480  			return err
 12481  		}
 12482  		tries++
 12483  		if tries >= 3 {
 12484  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12485  			return err
 12486  		}
 12487  	}
 12488  
 12489  }
 12490  
 12491  func (s *RetryLayerWebhookStore) PermanentDeleteOutgoingByUser(userID string) error {
 12492  
 12493  	tries := 0
 12494  	for {
 12495  		err := s.WebhookStore.PermanentDeleteOutgoingByUser(userID)
 12496  		if err == nil {
 12497  			return nil
 12498  		}
 12499  		if !isRepeatableError(err) {
 12500  			return err
 12501  		}
 12502  		tries++
 12503  		if tries >= 3 {
 12504  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12505  			return err
 12506  		}
 12507  	}
 12508  
 12509  }
 12510  
 12511  func (s *RetryLayerWebhookStore) SaveIncoming(webhook *model.IncomingWebhook) (*model.IncomingWebhook, error) {
 12512  
 12513  	tries := 0
 12514  	for {
 12515  		result, err := s.WebhookStore.SaveIncoming(webhook)
 12516  		if err == nil {
 12517  			return result, nil
 12518  		}
 12519  		if !isRepeatableError(err) {
 12520  			return result, err
 12521  		}
 12522  		tries++
 12523  		if tries >= 3 {
 12524  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12525  			return result, err
 12526  		}
 12527  	}
 12528  
 12529  }
 12530  
 12531  func (s *RetryLayerWebhookStore) SaveOutgoing(webhook *model.OutgoingWebhook) (*model.OutgoingWebhook, error) {
 12532  
 12533  	tries := 0
 12534  	for {
 12535  		result, err := s.WebhookStore.SaveOutgoing(webhook)
 12536  		if err == nil {
 12537  			return result, nil
 12538  		}
 12539  		if !isRepeatableError(err) {
 12540  			return result, err
 12541  		}
 12542  		tries++
 12543  		if tries >= 3 {
 12544  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12545  			return result, err
 12546  		}
 12547  	}
 12548  
 12549  }
 12550  
 12551  func (s *RetryLayerWebhookStore) UpdateIncoming(webhook *model.IncomingWebhook) (*model.IncomingWebhook, error) {
 12552  
 12553  	tries := 0
 12554  	for {
 12555  		result, err := s.WebhookStore.UpdateIncoming(webhook)
 12556  		if err == nil {
 12557  			return result, nil
 12558  		}
 12559  		if !isRepeatableError(err) {
 12560  			return result, err
 12561  		}
 12562  		tries++
 12563  		if tries >= 3 {
 12564  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12565  			return result, err
 12566  		}
 12567  	}
 12568  
 12569  }
 12570  
 12571  func (s *RetryLayerWebhookStore) UpdateOutgoing(hook *model.OutgoingWebhook) (*model.OutgoingWebhook, error) {
 12572  
 12573  	tries := 0
 12574  	for {
 12575  		result, err := s.WebhookStore.UpdateOutgoing(hook)
 12576  		if err == nil {
 12577  			return result, nil
 12578  		}
 12579  		if !isRepeatableError(err) {
 12580  			return result, err
 12581  		}
 12582  		tries++
 12583  		if tries >= 3 {
 12584  			err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
 12585  			return result, err
 12586  		}
 12587  	}
 12588  
 12589  }
 12590  
 12591  func (s *RetryLayer) Close() {
 12592  	s.Store.Close()
 12593  }
 12594  
 12595  func (s *RetryLayer) DropAllTables() {
 12596  	s.Store.DropAllTables()
 12597  }
 12598  
 12599  func (s *RetryLayer) GetCurrentSchemaVersion() string {
 12600  	return s.Store.GetCurrentSchemaVersion()
 12601  }
 12602  
 12603  func (s *RetryLayer) LockToMaster() {
 12604  	s.Store.LockToMaster()
 12605  }
 12606  
 12607  func (s *RetryLayer) MarkSystemRanUnitTests() {
 12608  	s.Store.MarkSystemRanUnitTests()
 12609  }
 12610  
 12611  func (s *RetryLayer) SetContext(context context.Context) {
 12612  	s.Store.SetContext(context)
 12613  }
 12614  
 12615  func (s *RetryLayer) TotalMasterDbConnections() int {
 12616  	return s.Store.TotalMasterDbConnections()
 12617  }
 12618  
 12619  func (s *RetryLayer) TotalReadDbConnections() int {
 12620  	return s.Store.TotalReadDbConnections()
 12621  }
 12622  
 12623  func (s *RetryLayer) TotalSearchDbConnections() int {
 12624  	return s.Store.TotalSearchDbConnections()
 12625  }
 12626  
 12627  func (s *RetryLayer) UnlockFromMaster() {
 12628  	s.Store.UnlockFromMaster()
 12629  }
 12630  
 12631  func New(childStore store.Store) *RetryLayer {
 12632  	newStore := RetryLayer{
 12633  		Store: childStore,
 12634  	}
 12635  
 12636  	newStore.AuditStore = &RetryLayerAuditStore{AuditStore: childStore.Audit(), Root: &newStore}
 12637  	newStore.BotStore = &RetryLayerBotStore{BotStore: childStore.Bot(), Root: &newStore}
 12638  	newStore.ChannelStore = &RetryLayerChannelStore{ChannelStore: childStore.Channel(), Root: &newStore}
 12639  	newStore.ChannelMemberHistoryStore = &RetryLayerChannelMemberHistoryStore{ChannelMemberHistoryStore: childStore.ChannelMemberHistory(), Root: &newStore}
 12640  	newStore.ClusterDiscoveryStore = &RetryLayerClusterDiscoveryStore{ClusterDiscoveryStore: childStore.ClusterDiscovery(), Root: &newStore}
 12641  	newStore.CommandStore = &RetryLayerCommandStore{CommandStore: childStore.Command(), Root: &newStore}
 12642  	newStore.CommandWebhookStore = &RetryLayerCommandWebhookStore{CommandWebhookStore: childStore.CommandWebhook(), Root: &newStore}
 12643  	newStore.ComplianceStore = &RetryLayerComplianceStore{ComplianceStore: childStore.Compliance(), Root: &newStore}
 12644  	newStore.EmojiStore = &RetryLayerEmojiStore{EmojiStore: childStore.Emoji(), Root: &newStore}
 12645  	newStore.FileInfoStore = &RetryLayerFileInfoStore{FileInfoStore: childStore.FileInfo(), Root: &newStore}
 12646  	newStore.GroupStore = &RetryLayerGroupStore{GroupStore: childStore.Group(), Root: &newStore}
 12647  	newStore.JobStore = &RetryLayerJobStore{JobStore: childStore.Job(), Root: &newStore}
 12648  	newStore.LicenseStore = &RetryLayerLicenseStore{LicenseStore: childStore.License(), Root: &newStore}
 12649  	newStore.LinkMetadataStore = &RetryLayerLinkMetadataStore{LinkMetadataStore: childStore.LinkMetadata(), Root: &newStore}
 12650  	newStore.OAuthStore = &RetryLayerOAuthStore{OAuthStore: childStore.OAuth(), Root: &newStore}
 12651  	newStore.PluginStore = &RetryLayerPluginStore{PluginStore: childStore.Plugin(), Root: &newStore}
 12652  	newStore.PostStore = &RetryLayerPostStore{PostStore: childStore.Post(), Root: &newStore}
 12653  	newStore.PreferenceStore = &RetryLayerPreferenceStore{PreferenceStore: childStore.Preference(), Root: &newStore}
 12654  	newStore.ProductNoticesStore = &RetryLayerProductNoticesStore{ProductNoticesStore: childStore.ProductNotices(), Root: &newStore}
 12655  	newStore.ReactionStore = &RetryLayerReactionStore{ReactionStore: childStore.Reaction(), Root: &newStore}
 12656  	newStore.RemoteClusterStore = &RetryLayerRemoteClusterStore{RemoteClusterStore: childStore.RemoteCluster(), Root: &newStore}
 12657  	newStore.RetentionPolicyStore = &RetryLayerRetentionPolicyStore{RetentionPolicyStore: childStore.RetentionPolicy(), Root: &newStore}
 12658  	newStore.RoleStore = &RetryLayerRoleStore{RoleStore: childStore.Role(), Root: &newStore}
 12659  	newStore.SchemeStore = &RetryLayerSchemeStore{SchemeStore: childStore.Scheme(), Root: &newStore}
 12660  	newStore.SessionStore = &RetryLayerSessionStore{SessionStore: childStore.Session(), Root: &newStore}
 12661  	newStore.SharedChannelStore = &RetryLayerSharedChannelStore{SharedChannelStore: childStore.SharedChannel(), Root: &newStore}
 12662  	newStore.StatusStore = &RetryLayerStatusStore{StatusStore: childStore.Status(), Root: &newStore}
 12663  	newStore.SystemStore = &RetryLayerSystemStore{SystemStore: childStore.System(), Root: &newStore}
 12664  	newStore.TeamStore = &RetryLayerTeamStore{TeamStore: childStore.Team(), Root: &newStore}
 12665  	newStore.TermsOfServiceStore = &RetryLayerTermsOfServiceStore{TermsOfServiceStore: childStore.TermsOfService(), Root: &newStore}
 12666  	newStore.ThreadStore = &RetryLayerThreadStore{ThreadStore: childStore.Thread(), Root: &newStore}
 12667  	newStore.TokenStore = &RetryLayerTokenStore{TokenStore: childStore.Token(), Root: &newStore}
 12668  	newStore.TrackPointStore = &RetryLayerTrackPointStore{TrackPointStore: childStore.TrackPoint(), Root: &newStore}
 12669  	newStore.TrackRecordStore = &RetryLayerTrackRecordStore{TrackRecordStore: childStore.TrackRecord(), Root: &newStore}
 12670  	newStore.UploadSessionStore = &RetryLayerUploadSessionStore{UploadSessionStore: childStore.UploadSession(), Root: &newStore}
 12671  	newStore.UserStore = &RetryLayerUserStore{UserStore: childStore.User(), Root: &newStore}
 12672  	newStore.UserAccessTokenStore = &RetryLayerUserAccessTokenStore{UserAccessTokenStore: childStore.UserAccessToken(), Root: &newStore}
 12673  	newStore.UserTermsOfServiceStore = &RetryLayerUserTermsOfServiceStore{UserTermsOfServiceStore: childStore.UserTermsOfService(), Root: &newStore}
 12674  	newStore.WebhookStore = &RetryLayerWebhookStore{WebhookStore: childStore.Webhook(), Root: &newStore}
 12675  	return &newStore
 12676  }