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  }