github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/store/layer_generators/retry_layer.go.tmpl (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/lib/pq" 13 "github.com/mattermost/mattermost-server/v5/model" 14 "github.com/mattermost/mattermost-server/v5/store" 15 "github.com/pkg/errors" 16 "github.com/go-sql-driver/mysql" 17 ) 18 19 const mySQLDeadlockCode = uint16(1213) 20 21 type {{.Name}} struct { 22 store.Store 23 {{range $index, $element := .SubStores}} {{$index}}Store store.{{$index}}Store 24 {{end}} 25 } 26 27 {{range $index, $element := .SubStores}}func (s *{{$.Name}}) {{$index}}() store.{{$index}}Store { 28 return s.{{$index}}Store 29 } 30 31 {{end}} 32 33 {{range $index, $element := .SubStores}}type {{$.Name}}{{$index}}Store struct { 34 store.{{$index}}Store 35 Root *{{$.Name}} 36 } 37 38 {{end}} 39 40 func isRepeatableError(err error) bool { 41 var pqErr *pq.Error 42 var mysqlErr *mysql.MySQLError 43 switch { 44 case errors.As(errors.Cause(err), &pqErr): 45 if pqErr.Code == "40001" || pqErr.Code == "40P01" { 46 return true 47 } 48 case errors.As(errors.Cause(err), &mysqlErr): 49 if mysqlErr.Number == mySQLDeadlockCode { 50 return true 51 } 52 } 53 return false 54 } 55 56 {{range $substoreName, $substore := .SubStores}} 57 {{range $index, $element := $substore.Methods}} 58 func (s *{{$.Name}}{{$substoreName}}Store) {{$index}}({{$element.Params | joinParamsWithTypeOutsideStore}}) {{$element.Results | joinResultsForSignature}} { 59 {{if $element.Results | len | eq 0}} 60 s.{{$substoreName}}Store.{{$index}}({{$element.Params | joinParams}}) 61 {{else}} 62 {{if $element.Results | errorPresent}} 63 tries := 0 64 for { 65 {{genResultsVars $element.Results false }} := s.{{$substoreName}}Store.{{$index}}({{$element.Params | joinParams}}) 66 if {{$element.Results | errorVar}} == nil { 67 return {{genResultsVars $element.Results true }} 68 } 69 if !isRepeatableError({{$element.Results | errorVar}}) { 70 return {{genResultsVars $element.Results false }} 71 } 72 tries++ 73 if tries >= 3 { 74 {{$element.Results | errorVar}} = errors.Wrap({{$element.Results | errorVar}}, "giving up after 3 consecutive repeatable transaction failures") 75 return {{genResultsVars $element.Results false }} 76 } 77 } 78 {{else}} 79 return s.{{$substoreName}}Store.{{$index}}({{$element.Params | joinParams}}) 80 {{end}} 81 {{end}} 82 } 83 {{end}} 84 {{end}} 85 86 {{range $index, $element := .Methods}} 87 func (s *{{$.Name}}) {{$index}}({{$element.Params | joinParamsWithTypeOutsideStore}}) {{$element.Results | joinResultsForSignature}} { 88 {{if $element.Results | len | eq 0}}s.Store.{{$index}}({{$element.Params | joinParams}}) 89 {{else}}return s.Store.{{$index}}({{$element.Params | joinParams}}) 90 {{end}}} 91 {{end}} 92 93 func New(childStore store.Store) *{{.Name}} { 94 newStore := {{.Name}}{ 95 Store: childStore, 96 } 97 {{range $substoreName, $substore := .SubStores}} 98 newStore.{{$substoreName}}Store = &{{$.Name}}{{$substoreName}}Store{{"{"}}{{$substoreName}}Store: childStore.{{$substoreName}}(), Root: &newStore}{{end}} 99 return &newStore 100 }