mirror of https://github.com/portainer/portainer
fix(endpointrelation): change a callback so it is transactional EE-5312 (#8729)
parent
fc1aec3bb8
commit
17839aa473
|
@ -159,6 +159,11 @@ func (service *Service) UpdateEdgeStackFunc(ID portainer.EdgeStackID, updateFunc
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UpdateEdgeStackFuncTx is a helper function used to call UpdateEdgeStackFunc inside a transaction.
|
||||||
|
func (service *Service) UpdateEdgeStackFuncTx(tx portainer.Transaction, ID portainer.EdgeStackID, updateFunc func(edgeStack *portainer.EdgeStack)) error {
|
||||||
|
return service.Tx(tx).UpdateEdgeStackFunc(ID, updateFunc)
|
||||||
|
}
|
||||||
|
|
||||||
// DeleteEdgeStack deletes an Edge stack.
|
// DeleteEdgeStack deletes an Edge stack.
|
||||||
func (service *Service) DeleteEdgeStack(ID portainer.EdgeStackID) error {
|
func (service *Service) DeleteEdgeStack(ID portainer.EdgeStackID) error {
|
||||||
service.mu.Lock()
|
service.mu.Lock()
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package edgestack
|
package edgestack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
|
@ -103,7 +102,25 @@ func (service ServiceTx) UpdateEdgeStack(ID portainer.EdgeStackID, edgeStack *po
|
||||||
|
|
||||||
// UpdateEdgeStackFunc is a no-op inside a transaction.
|
// UpdateEdgeStackFunc is a no-op inside a transaction.
|
||||||
func (service ServiceTx) UpdateEdgeStackFunc(ID portainer.EdgeStackID, updateFunc func(edgeStack *portainer.EdgeStack)) error {
|
func (service ServiceTx) UpdateEdgeStackFunc(ID portainer.EdgeStackID, updateFunc func(edgeStack *portainer.EdgeStack)) error {
|
||||||
return errors.New("cannot be called inside a transaction")
|
service.service.mu.Lock()
|
||||||
|
defer service.service.mu.Unlock()
|
||||||
|
|
||||||
|
edgeStack, err := service.EdgeStack(ID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
updateFunc(edgeStack)
|
||||||
|
|
||||||
|
err = service.UpdateEdgeStack(ID, edgeStack)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
service.service.idxVersion[ID] = edgeStack.Version
|
||||||
|
service.service.cacheInvalidationFn(ID)
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteEdgeStack deletes an Edge stack.
|
// DeleteEdgeStack deletes an Edge stack.
|
||||||
|
|
|
@ -14,16 +14,21 @@ const BucketName = "endpoint_relations"
|
||||||
|
|
||||||
// Service represents a service for managing environment(endpoint) relation data.
|
// Service represents a service for managing environment(endpoint) relation data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection portainer.Connection
|
connection portainer.Connection
|
||||||
updateStackFn func(ID portainer.EdgeStackID, updateFunc func(edgeStack *portainer.EdgeStack)) error
|
updateStackFn func(ID portainer.EdgeStackID, updateFunc func(edgeStack *portainer.EdgeStack)) error
|
||||||
|
updateStackFnTx func(tx portainer.Transaction, ID portainer.EdgeStackID, updateFunc func(edgeStack *portainer.EdgeStack)) error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (service *Service) BucketName() string {
|
func (service *Service) BucketName() string {
|
||||||
return BucketName
|
return BucketName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (service *Service) RegisterUpdateStackFunction(updateFunc func(ID portainer.EdgeStackID, updateFunc func(edgeStack *portainer.EdgeStack)) error) {
|
func (service *Service) RegisterUpdateStackFunction(
|
||||||
|
updateFunc func(portainer.EdgeStackID, func(*portainer.EdgeStack)) error,
|
||||||
|
updateFuncTx func(portainer.Transaction, portainer.EdgeStackID, func(*portainer.EdgeStack)) error,
|
||||||
|
) {
|
||||||
service.updateStackFn = updateFunc
|
service.updateStackFn = updateFunc
|
||||||
|
service.updateStackFnTx = updateFuncTx
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewService creates a new instance of a service.
|
// NewService creates a new instance of a service.
|
||||||
|
|
|
@ -151,7 +151,7 @@ func (service ServiceTx) updateEdgeStacksAfterRelationChange(previousRelationSta
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
service.service.updateStackFn(refStackId, func(edgeStack *portainer.EdgeStack) {
|
service.service.updateStackFnTx(service.tx, refStackId, func(edgeStack *portainer.EdgeStack) {
|
||||||
edgeStack.NumDeployments = numDeployments
|
edgeStack.NumDeployments = numDeployments
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,7 +104,7 @@ func (store *Store) initServices() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
store.EdgeStackService = edgeStackService
|
store.EdgeStackService = edgeStackService
|
||||||
endpointRelationService.RegisterUpdateStackFunction(edgeStackService.UpdateEdgeStackFunc)
|
endpointRelationService.RegisterUpdateStackFunction(edgeStackService.UpdateEdgeStackFunc, edgeStackService.UpdateEdgeStackFuncTx)
|
||||||
|
|
||||||
edgeGroupService, err := edgegroup.NewService(store.connection)
|
edgeGroupService, err := edgegroup.NewService(store.connection)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in New Issue