github.com/cozy/cozy-stack@v0.0.0-20240327093429-939e4a21320e/model/instance/lifecycle/get.go (about) 1 package lifecycle 2 3 import ( 4 "github.com/cozy/cozy-stack/model/instance" 5 "github.com/cozy/cozy-stack/pkg/couchdb" 6 ) 7 8 // GetInstance retrieves the instance for a request by its host. 9 func GetInstance(domain string) (*instance.Instance, error) { 10 var err error 11 domain, err = validateDomain(domain) 12 if err != nil { 13 return nil, err 14 } 15 i, err := instance.Get(domain) 16 if err != nil { 17 return nil, err 18 } 19 20 // This retry-loop handles the probability to hit an Update conflict from 21 // this version update, since the instance document may be updated different 22 // processes at the same time. 23 for { 24 if i.IndexViewsVersion == couchdb.IndexViewsVersion { 25 break 26 } 27 28 i.Logger().Debugf("Indexes outdated: wanted %d; got %d", couchdb.IndexViewsVersion, i.IndexViewsVersion) 29 if err = UpdateViewsAndIndex(i); err != nil { 30 i.Logger().Errorf("Could not re-define indexes and views: %s", err.Error()) 31 return nil, err 32 } 33 34 if err = update(i); err == nil { 35 break 36 } 37 38 if !couchdb.IsConflictError(err) { 39 return nil, err 40 } 41 42 i, err = instance.GetFromCouch(domain) 43 if err != nil { 44 return nil, err 45 } 46 } 47 48 if err = i.MakeVFS(); err != nil { 49 return nil, err 50 } 51 return i, nil 52 }