Skip to content

Commit c2e9d22

Browse files
fix: provisioenr hangs if it has nothing to provision
fixes: #4750
1 parent 0316215 commit c2e9d22

File tree

1 file changed

+18
-11
lines changed

1 file changed

+18
-11
lines changed

backend/provisioner/inmem_provisioner.go

+18-11
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/block/ftl/common/slices"
1616
"github.com/block/ftl/internal/channels"
1717
"github.com/block/ftl/internal/key"
18+
"github.com/block/ftl/internal/log"
1819
)
1920

2021
type inMemProvisioningTask struct {
@@ -69,6 +70,7 @@ type stepCompletedEvent struct {
6970
}
7071

7172
func (d *InMemProvisioner) Provision(ctx context.Context, req *provisioner.ProvisionRequest) ([]*schemapb.RuntimeElement, error) {
73+
logger := log.FromContext(ctx)
7274
parsed, err := key.ParseChangesetKey(req.Changeset)
7375
if err != nil {
7476
err = fmt.Errorf("invalid changeset: %w", err)
@@ -97,8 +99,10 @@ func (d *InMemProvisioner) Provision(ctx context.Context, req *provisioner.Provi
9799
// use chans to safely collect all events before completing each task
98100
completions := make(chan stepCompletedEvent, 16)
99101

102+
noop := true
100103
for id, desired := range desiredNodes {
101104
previous, prevOk := previousNodes[id]
105+
logger.Tracef("Provisioning resource %s", id)
102106

103107
for _, resource := range desired.GetProvisioned() {
104108
if !prevOk || resource.DeploymentSpecific || !resource.IsEqual(previous.GetProvisioned().Get(resource.Kind)) {
@@ -120,6 +124,7 @@ func (d *InMemProvisioner) Provision(ctx context.Context, req *provisioner.Provi
120124
}
121125
step := &inMemProvisioningStep{Done: atomic.New(false)}
122126
task.steps = append(task.steps, step)
127+
noop = false
123128
go func() {
124129
event, err := handler(ctx, parsed, desiredModule.Runtime.Deployment.DeploymentKey, desired)
125130
if err != nil {
@@ -137,17 +142,19 @@ func (d *InMemProvisioner) Provision(ctx context.Context, req *provisioner.Provi
137142
}
138143
}
139144

140-
for c := range channels.IterContext(ctx, completions) {
141-
if e, ok := c.event.Get(); ok {
142-
task.events = append(task.events, &e)
143-
}
144-
c.step.Done.Store(true)
145-
done, err := task.Done()
146-
if err != nil {
147-
return nil, fmt.Errorf("provisioning failed: %w", err)
148-
}
149-
if done {
150-
break
145+
if !noop {
146+
for c := range channels.IterContext(ctx, completions) {
147+
if e, ok := c.event.Get(); ok {
148+
task.events = append(task.events, &e)
149+
}
150+
c.step.Done.Store(true)
151+
done, err := task.Done()
152+
if err != nil {
153+
return nil, fmt.Errorf("provisioning failed: %w", err)
154+
}
155+
if done {
156+
break
157+
}
151158
}
152159
}
153160
return slices.Map(task.events, func(e *schema.RuntimeElement) *schemapb.RuntimeElement {

0 commit comments

Comments
 (0)