Skip to content

Commit 2aca067

Browse files
Split DoCreate/DoUpdate from waiting into WaitAfterCreate/Update
Previously DoCreate and DoUpdate blocked on waiter.Wait, preventing the direct engine from parallelizing operations across resources. Move the wait into dedicated WaitAfterCreate/WaitAfterUpdate methods that poll GetSpace until the space reaches SPACE_ACTIVE state. Addresses review feedback from @andrewnester. Co-authored-by: Isaac
1 parent 3891554 commit 2aca067

1 file changed

Lines changed: 38 additions & 11 deletions

File tree

bundle/direct/dresources/app_space.go

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ package dresources
22

33
import (
44
"context"
5+
"fmt"
6+
"time"
57

68
"github.com/databricks/cli/bundle/config/resources"
79
"github.com/databricks/databricks-sdk-go"
810
"github.com/databricks/databricks-sdk-go/common/types/fieldmask"
11+
"github.com/databricks/databricks-sdk-go/retries"
912
"github.com/databricks/databricks-sdk-go/service/apps"
1013
)
1114

@@ -26,29 +29,53 @@ func (r *ResourceAppSpace) DoRead(ctx context.Context, id string) (*apps.Space,
2629
}
2730

2831
func (r *ResourceAppSpace) DoCreate(ctx context.Context, config *apps.Space) (string, *apps.Space, error) {
29-
waiter, err := r.client.Apps.CreateSpace(ctx, apps.CreateSpaceRequest{
32+
// Kick off the create request. Wait for the space to become active in
33+
// WaitAfterCreate so that parallel creates are not blocked here.
34+
_, err := r.client.Apps.CreateSpace(ctx, apps.CreateSpaceRequest{
3035
Space: *config,
3136
})
3237
if err != nil {
3338
return "", nil, err
3439
}
35-
space, err := waiter.Wait(ctx)
36-
if err != nil {
37-
return "", nil, err
38-
}
39-
return space.Name, space, nil
40+
return config.Name, nil, nil
4041
}
4142

4243
func (r *ResourceAppSpace) DoUpdate(ctx context.Context, id string, config *apps.Space, _ *PlanEntry) (*apps.Space, error) {
43-
waiter, err := r.client.Apps.UpdateSpace(ctx, apps.UpdateSpaceRequest{
44+
_, err := r.client.Apps.UpdateSpace(ctx, apps.UpdateSpaceRequest{
4445
Name: id,
4546
Space: *config,
4647
UpdateMask: fieldmask.FieldMask{Paths: []string{"description", "resources", "user_api_scopes", "usage_policy_id"}},
4748
})
48-
if err != nil {
49-
return nil, err
50-
}
51-
return waiter.Wait(ctx)
49+
return nil, err
50+
}
51+
52+
func (r *ResourceAppSpace) WaitAfterCreate(ctx context.Context, config *apps.Space) (*apps.Space, error) {
53+
return r.waitForSpaceActive(ctx, config.Name)
54+
}
55+
56+
func (r *ResourceAppSpace) WaitAfterUpdate(ctx context.Context, config *apps.Space) (*apps.Space, error) {
57+
return r.waitForSpaceActive(ctx, config.Name)
58+
}
59+
60+
func (r *ResourceAppSpace) waitForSpaceActive(ctx context.Context, name string) (*apps.Space, error) {
61+
retrier := retries.New[apps.Space](retries.WithTimeout(20 * time.Minute))
62+
return retrier.Run(ctx, func(ctx context.Context) (*apps.Space, error) {
63+
space, err := r.client.Apps.GetSpace(ctx, apps.GetSpaceRequest{Name: name})
64+
if err != nil {
65+
return nil, retries.Halt(err)
66+
}
67+
if space.Status == nil {
68+
return nil, retries.Continues("waiting for status")
69+
}
70+
switch space.Status.State {
71+
case apps.SpaceStatusSpaceStateSpaceActive:
72+
return space, nil
73+
case apps.SpaceStatusSpaceStateSpaceError:
74+
return nil, retries.Halt(fmt.Errorf("space %s is in ERROR state: %s", name, space.Status.Message))
75+
default:
76+
return nil, retries.Continues(fmt.Sprintf("space state: %s", space.Status.State))
77+
}
78+
})
5279
}
5380

5481
func (r *ResourceAppSpace) DoDelete(ctx context.Context, id string) error {

0 commit comments

Comments
 (0)