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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy