diff --git a/internal/app/machined/pkg/system/service_runner.go b/internal/app/machined/pkg/system/service_runner.go index 9c06d1bb9..3aeaa3fb3 100644 --- a/internal/app/machined/pkg/system/service_runner.go +++ b/internal/app/machined/pkg/system/service_runner.go @@ -11,6 +11,7 @@ import ( "log" "slices" "sync" + "sync/atomic" "time" "github.com/siderolabs/gen/xslices" @@ -33,10 +34,11 @@ var WaitConditionCheckInterval = time.Second type ServiceRunner struct { mu sync.Mutex - runtime runtime.Runtime - service Service - id string - instance *singleton + runtime runtime.Runtime + service Service + id string + instance *singleton + generation atomic.Int64 state events.ServiceState events events.ServiceEvents @@ -200,6 +202,8 @@ func (svcrunner *ServiceRunner) Run(notifyChannels ...chan<- struct{}) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() + generation := svcrunner.generation.Add(1) + go func() { select { case <-ctx.Done(): @@ -229,7 +233,7 @@ func (svcrunner *ServiceRunner) Run(notifyChannels ...chan<- struct{}) error { volumeRequests := make([]volumeRequest, 0, len(volumeIDs)) for _, volumeID := range volumeIDs { - requestID, err := svcrunner.createVolumeMountRequest(ctx, volumeID) + requestID, err := svcrunner.createVolumeMountRequest(ctx, volumeID, generation) if err != nil { return err } diff --git a/internal/app/machined/pkg/system/volumes.go b/internal/app/machined/pkg/system/volumes.go index 35e1bec6e..71fd6b148 100644 --- a/internal/app/machined/pkg/system/volumes.go +++ b/internal/app/machined/pkg/system/volumes.go @@ -7,6 +7,7 @@ package system import ( "context" "fmt" + "strconv" "github.com/cosi-project/runtime/pkg/resource" "github.com/cosi-project/runtime/pkg/state" @@ -15,10 +16,10 @@ import ( "github.com/siderolabs/talos/pkg/machinery/resources/block" ) -func (svcrunner *ServiceRunner) createVolumeMountRequest(ctx context.Context, volumeID string) (string, error) { +func (svcrunner *ServiceRunner) createVolumeMountRequest(ctx context.Context, volumeID string, generation int64) (string, error) { st := svcrunner.runtime.State().V1Alpha2().Resources() requester := "service/" + svcrunner.id - requestID := requester + "-" + volumeID + requestID := requester + "-" + volumeID + "-" + strconv.FormatInt(generation, 10) mountRequest := block.NewVolumeMountRequest(block.NamespaceName, requestID) mountRequest.TypedSpec().Requester = requester