service.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package orchestrator
  2. import (
  3. "github.com/docker/swarmkit/api"
  4. "github.com/docker/swarmkit/log"
  5. "github.com/docker/swarmkit/manager/state/store"
  6. "golang.org/x/net/context"
  7. )
  8. // IsReplicatedService checks if a service is a replicated service.
  9. func IsReplicatedService(service *api.Service) bool {
  10. // service nil validation is required as there are scenarios
  11. // where service is removed from store
  12. if service == nil {
  13. return false
  14. }
  15. _, ok := service.Spec.GetMode().(*api.ServiceSpec_Replicated)
  16. return ok
  17. }
  18. // IsGlobalService checks if the service is a global service.
  19. func IsGlobalService(service *api.Service) bool {
  20. if service == nil {
  21. return false
  22. }
  23. _, ok := service.Spec.GetMode().(*api.ServiceSpec_Global)
  24. return ok
  25. }
  26. // SetServiceTasksRemove sets the desired state of tasks associated with a service
  27. // to REMOVE, so that they can be properly shut down by the agent and later removed
  28. // by the task reaper.
  29. func SetServiceTasksRemove(ctx context.Context, s *store.MemoryStore, service *api.Service) {
  30. var (
  31. tasks []*api.Task
  32. err error
  33. )
  34. s.View(func(tx store.ReadTx) {
  35. tasks, err = store.FindTasks(tx, store.ByServiceID(service.ID))
  36. })
  37. if err != nil {
  38. log.G(ctx).WithError(err).Errorf("failed to list tasks")
  39. return
  40. }
  41. err = s.Batch(func(batch *store.Batch) error {
  42. for _, t := range tasks {
  43. err := batch.Update(func(tx store.Tx) error {
  44. // time travel is not allowed. if the current desired state is
  45. // above the one we're trying to go to we can't go backwards.
  46. // we have nothing to do and we should skip to the next task
  47. if t.DesiredState > api.TaskStateRemove {
  48. // log a warning, though. we shouln't be trying to rewrite
  49. // a state to an earlier state
  50. log.G(ctx).Warnf(
  51. "cannot update task %v in desired state %v to an earlier desired state %v",
  52. t.ID, t.DesiredState, api.TaskStateRemove,
  53. )
  54. return nil
  55. }
  56. // update desired state to REMOVE
  57. t.DesiredState = api.TaskStateRemove
  58. if err := store.UpdateTask(tx, t); err != nil {
  59. log.G(ctx).WithError(err).Errorf("failed transaction: update task desired state to REMOVE")
  60. }
  61. return nil
  62. })
  63. if err != nil {
  64. return err
  65. }
  66. }
  67. return nil
  68. })
  69. if err != nil {
  70. log.G(ctx).WithError(err).Errorf("task search transaction failed")
  71. }
  72. }