Skip to content

Commit fbfa08b

Browse files
committed
chore: implement first part of file streaming
1 parent e8d8b98 commit fbfa08b

File tree

5 files changed

+75
-7
lines changed

5 files changed

+75
-7
lines changed

provisioner/terraform/executor.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,11 @@ import (
1919
tfjson "github.com/hashicorp/terraform-json"
2020
"go.opentelemetry.io/otel/attribute"
2121
"golang.org/x/xerrors"
22-
protobuf "google.golang.org/protobuf/proto"
2322

2423
"cdr.dev/slog"
2524

2625
"github.com/coder/coder/v2/coderd/database"
2726
"github.com/coder/coder/v2/coderd/tracing"
28-
"github.com/coder/coder/v2/codersdk/drpcsdk"
2927
"github.com/coder/coder/v2/provisionersdk/proto"
3028
)
3129

@@ -357,10 +355,10 @@ func (e *executor) plan(ctx, killCtx context.Context, env, vars []string, logr l
357355
ModuleFiles: moduleFiles,
358356
}
359357

360-
if protobuf.Size(msg) > drpcsdk.MaxMessageSize {
361-
e.logger.Warn(ctx, "cannot persist terraform modules, message payload too big", slog.F("archive_size", len(msg.ModuleFiles)))
362-
msg.ModuleFiles = nil
363-
}
358+
//if protobuf.Size(msg) > drpcsdk.MaxMessageSize {
359+
// e.logger.Warn(ctx, "cannot persist terraform modules, message payload too big", slog.F("archive_size", len(msg.ModuleFiles)))
360+
// msg.ModuleFiles = nil
361+
//}
364362

365363
return msg, nil
366364
}

provisioner/terraform/modules.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"golang.org/x/xerrors"
1515

16+
"github.com/coder/coder/v2/coderd/util/xio"
1617
"github.com/coder/coder/v2/provisionersdk/proto"
1718
)
1819

@@ -85,7 +86,11 @@ func GetModulesArchive(root fs.FS) ([]byte, error) {
8586

8687
empty := true
8788
var b bytes.Buffer
88-
w := tar.NewWriter(&b)
89+
90+
// Limit to 20MB for now.
91+
// TODO: Determine what a reasonable limit is for modules
92+
lw := xio.NewLimitWriter(&b, 20<<20)
93+
w := tar.NewWriter(lw)
8994

9095
for _, it := range m.Modules {
9196
// Check to make sure that the module is a remote module fetched by
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package provisionerd

provisionersdk/proto/dataupload.go

Lines changed: 38 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

provisionersdk/session.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import (
1717
"golang.org/x/xerrors"
1818

1919
"cdr.dev/slog"
20+
"github.com/coder/coder/v2/codersdk/drpcsdk"
21+
22+
protobuf "google.golang.org/protobuf/proto"
2023

2124
"github.com/coder/coder/v2/provisionersdk/proto"
2225
)
@@ -161,6 +164,29 @@ func (s *Session) handleRequests() error {
161164
return err
162165
}
163166
resp.Type = &proto.Response_Plan{Plan: complete}
167+
168+
if protobuf.Size(resp) > drpcsdk.MaxMessageSize {
169+
// Send the modules over as a stream
170+
s.Logger.Info(s.Context(), "plan response too large, sending modules as stream")
171+
dataUp, chunks := proto.BytesToDataUpload(complete.ModuleFiles)
172+
173+
complete.ModuleFiles = nil // sent over the stream
174+
resp.Type = &proto.Response_Plan{Plan: complete}
175+
176+
err := s.stream.Send(&proto.Response{Type: &proto.Response_DataUpload{DataUpload: dataUp}})
177+
if err != nil {
178+
complete.Error = fmt.Sprintf("send data upload: %s", err.Error())
179+
} else {
180+
for i, chunk := range chunks {
181+
err := s.stream.Send(&proto.Response{Type: &proto.Response_ChunkPiece{ChunkPiece: chunk}})
182+
if err != nil {
183+
complete.Error = fmt.Sprintf("send data piece upload %d/%d: %s", i, dataUp.Chunks, err.Error())
184+
break
185+
}
186+
}
187+
}
188+
}
189+
164190
if complete.Error == "" {
165191
planned = true
166192
}

0 commit comments

Comments
 (0)