Repository navigation
feat(api,orch): add reboot escape hatch for sandbox resume - #2877
ValentaTomas wants to merge 4 commits into
Conversation
PR SummaryMedium Risk Overview Reviewed by Cursor Bugbot for commit 343e394. Bugbot is set up for automated code reviews on this repo. Configure here. |
❌ 3 Tests Failed:
View the full list of 3 ❄️ flaky test(s)
To view more test analytics, go to the Test Analytics Dashboard |
There was a problem hiding this comment.
Code Review
Using uuid.MustParse on template.Files().BuildID can cause a runtime panic if the build ID is not a valid UUID or if template.Files() is nil. It is safer to parse the UUID using uuid.Parse and handle the error gracefully to prevent potential service panics.
0aabc3f to
1730f78
Compare
1730f78 to
8f3c887
Compare
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
Autofix Details
Bugbot Autofix prepared a fix for the issue found in the latest run.
- ✅ Fixed: Reboot resume skips envd wait
- Added WaitForEnvd call after createSandboxFromRootfs to ensure envd is ready before the orchestrator Create RPC completes, matching the behavior of normal snapshot resumes.
Or push these changes by commenting:
@cursor push 9b20165933
Preview (9b20165933)
diff --git a/packages/api/internal/api/api.gen.go b/packages/api/internal/api/api.gen.go
--- a/packages/api/internal/api/api.gen.go
+++ b/packages/api/internal/api/api.gen.go
@@ -714,6 +714,9 @@
// Deprecated: this property has been marked as deprecated upstream, but no `x-deprecated-reason` was set
AutoPause *bool `json:"autoPause,omitempty"`
+ // Reboot Boot from the snapshot filesystem with fresh memory instead of restoring the memory snapshot.
+ Reboot *bool `json:"reboot,omitempty"`
+
// Timeout Time to live for the sandbox in seconds.
Timeout *int32 `json:"timeout,omitempty"`
}
@@ -13409,175 +13412,176 @@
// const string: with thousands of chunks the chained `+` fold is several
// times slower for the Go compiler than parsing a slice literal.
var swaggerSpec = []string{
- "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",
+ "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",
}
// decodeSpec returns the embedded OpenAPI spec as raw JSON bytes,
diff --git a/packages/api/internal/handlers/proxy_grpc.go b/packages/api/internal/handlers/proxy_grpc.go
--- a/packages/api/internal/handlers/proxy_grpc.go
+++ b/packages/api/internal/handlers/proxy_grpc.go
@@ -257,6 +257,7 @@
s.api.buildResumeSandboxData(sandboxID, nil),
&headers,
true,
+ false,
nil, // mcp
)
if apiErr != nil {
diff --git a/packages/api/internal/handlers/sandbox.go b/packages/api/internal/handlers/sandbox.go
--- a/packages/api/internal/handlers/sandbox.go
+++ b/packages/api/internal/handlers/sandbox.go
@@ -28,6 +28,7 @@
getSandboxData orchestrator.SandboxDataFetcher,
requestHeader *http.Header,
isResume bool,
+ reboot bool,
mcp api.Mcp,
) (*api.Sandbox, *api.APIError) {
sbx, apiErr := a.startSandboxInternal(
@@ -38,6 +39,7 @@
getSandboxData,
requestHeader,
isResume,
+ reboot,
mcp,
)
if apiErr != nil {
@@ -56,6 +58,7 @@
getSandboxData orchestrator.SandboxDataFetcher,
requestHeader *http.Header,
isResume bool,
+ reboot bool,
mcp api.Mcp,
) (sandbox.Sandbox, *api.APIError) {
startTime := time.Now()
@@ -77,6 +80,7 @@
timeout,
isResume,
creationMeta,
+ reboot,
)
if instanceErr != nil {
telemetry.ReportError(ctx, "error when creating instance", instanceErr.Err)
diff --git a/packages/api/internal/handlers/sandbox_connect.go b/packages/api/internal/handlers/sandbox_connect.go
--- a/packages/api/internal/handlers/sandbox_connect.go
+++ b/packages/api/internal/handlers/sandbox_connect.go
@@ -152,6 +152,7 @@
a.buildResumeSandboxData(sandboxID, nil),
&c.Request.Header,
true,
+ false,
nil, // mcp
)
if createErr != nil {
diff --git a/packages/api/internal/handlers/sandbox_create.go b/packages/api/internal/handlers/sandbox_create.go
--- a/packages/api/internal/handlers/sandbox_create.go
+++ b/packages/api/internal/handlers/sandbox_create.go
@@ -265,6 +265,7 @@
getSandboxData,
&c.Request.Header,
false,
+ false,
mcp,
)
if createErr != nil {
diff --git a/packages/api/internal/handlers/sandbox_resume.go b/packages/api/internal/handlers/sandbox_resume.go
--- a/packages/api/internal/handlers/sandbox_resume.go
+++ b/packages/api/internal/handlers/sandbox_resume.go
@@ -54,6 +54,7 @@
}
telemetry.ReportEvent(ctx, "Parsed body")
+ reboot := body.Reboot != nil && *body.Reboot
timeout := sandbox.SandboxTimeoutDefault
if body.Timeout != nil {
@@ -160,6 +161,7 @@
a.buildResumeSandboxData(sandboxID, body.AutoPause),
&c.Request.Header,
true,
+ reboot,
nil, // mcp
)
if createErr != nil {
diff --git a/packages/api/internal/orchestrator/create_instance.go b/packages/api/internal/orchestrator/create_instance.go
--- a/packages/api/internal/orchestrator/create_instance.go
+++ b/packages/api/internal/orchestrator/create_instance.go
@@ -10,6 +10,7 @@
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/metric"
"go.uber.org/zap"
+ "google.golang.org/grpc/metadata"
"google.golang.org/protobuf/types/known/timestamppb"
"github.com/e2b-dev/infra/packages/api/internal/api"
@@ -127,6 +128,7 @@
timeout time.Duration,
isResume bool,
creationMeta sandbox.CreationMetadata,
+ rebootOpt ...bool,
) (sbx sandbox.Sandbox, apiErr *api.APIError) {
ctx, childSpan := tracer.Start(ctx, "create-sandbox")
defer childSpan.End()
@@ -296,6 +298,10 @@
}
}
+ if len(rebootOpt) > 0 && rebootOpt[0] {
+ ctx = metadata.AppendToOutgoingContext(ctx, orchestrator.SandboxRebootFromRootfsGRPCMetadataKey, "true")
+ }
+
nodeClusterID := clusters.WithClusterFallback(team.ClusterID)
clusterNodes := o.GetClusterNodes(nodeClusterID)
diff --git a/packages/orchestrator/pkg/server/sandboxes.go b/packages/orchestrator/pkg/server/sandboxes.go
--- a/packages/orchestrator/pkg/server/sandboxes.go
+++ b/packages/orchestrator/pkg/server/sandboxes.go
@@ -24,10 +24,16 @@
"google.golang.org/protobuf/types/known/emptypb"
"google.golang.org/protobuf/types/known/timestamppb"
+ grpcmetadata "google.golang.org/grpc/metadata"
+
"github.com/e2b-dev/infra/packages/orchestrator/pkg/sandbox"
+ "github.com/e2b-dev/infra/packages/orchestrator/pkg/sandbox/block"
"github.com/e2b-dev/infra/packages/orchestrator/pkg/sandbox/fc"
sbxtemplate "github.com/e2b-dev/infra/packages/orchestrator/pkg/sandbox/template"
+ configpkg "github.com/e2b-dev/infra/packages/orchestrator/pkg/template/build/config"
+ "github.com/e2b-dev/infra/packages/orchestrator/pkg/template/constants"
"github.com/e2b-dev/infra/packages/orchestrator/pkg/template/metadata"
+ "github.com/e2b-dev/infra/packages/orchestrator/pkg/units"
"github.com/e2b-dev/infra/packages/shared/pkg/events"
"github.com/e2b-dev/infra/packages/shared/pkg/featureflags"
"github.com/e2b-dev/infra/packages/shared/pkg/grpc/orchestrator"
@@ -58,6 +64,61 @@
killReasonUnknown = "unknown"
)
+func rebootFromRootfsEnabled(ctx context.Context) bool {
+ values := grpcmetadata.ValueFromIncomingContext(ctx, orchestrator.SandboxRebootFromRootfsGRPCMetadataKey)
+ return len(values) > 0 && values[0] == "true"
+}
+
+func (s *Server) createSandboxFromRootfs(
+ ctx context.Context,
+ template sbxtemplate.Template,
+ config *sandbox.Config,
+ runtime sandbox.RuntimeMetadata,
+ req *orchestrator.SandboxCreateRequest,
+) (*sandbox.Sandbox, error) {
+ buildID, err := uuid.Parse(template.Files().BuildID)
+ if err != nil {
+ return nil, fmt.Errorf("parse build ID: %w", err)
+ }
+
+ memfile, err := block.NewEmpty(
+ units.MBToBytes(config.RamMB),
+ configpkg.MemfilePageSize(config.HugePages),
+ buildID,
+ )
+ if err != nil {
+ return nil, fmt.Errorf("create empty memfile: %w", err)
+ }
+ defer memfile.Close()
+
+ maskedTemplate := sbxtemplate.NewMaskTemplate(template, sbxtemplate.WithMemfile(memfile))
+
+ kvmClock, err := utils.IsGTEVersion(config.Envd.Version, "0.2.11")
+ if err != nil {
+ return nil, fmt.Errorf("compare envd version: %w", err)
+ }
+
+ timeout := req.GetEndTime().AsTime().Sub(req.GetStartTime().AsTime())
+ if timeout <= 0 {
+ timeout = s.config.EnvdTimeout
+ }
+
+ return s.sandboxFactory.CreateSandbox(
+ ctx,
+ config,
+ runtime,
+ maskedTemplate,
+ timeout,
+ "",
+ fc.ProcessOptions{
+ InitScriptPath: constants.SystemdInitPath,
+ KvmClock: kvmClock,
+ },
+ req.GetSandbox(),
+ nil,
+ )
+}
+
func (s *Server) Create(ctx context.Context, req *orchestrator.SandboxCreateRequest) (_ *orchestrator.SandboxCreateResponse, createErr error) {
// set max request timeout for this request
ctx, cancel := context.WithTimeoutCause(ctx, requestTimeout, errors.New("request timed out"))
@@ -187,18 +248,25 @@
SandboxType: sandbox.SandboxTypeSandbox,
}
- sbx, err := s.sandboxFactory.ResumeSandbox(
- ctx,
- template,
- config,
- runtime,
- req.GetStartTime().AsTime(),
- req.GetEndTime().AsTime(),
- req.GetSandbox(),
- )
+ var sbx *sandbox.Sandbox
+ if rebootFromRootfsEnabled(ctx) {
+ sbx, err = s.createSandboxFromRootfs(ctx, template, config, runtime, req)
+ if err == nil {
+ err = sbx.WaitForEnvd(ctx, s.config.EnvdTimeout)
+ }
+ } else {
+ sbx, err = s.sandboxFactory.ResumeSandbox(
+ ctx,
+ template,
+ config,
+ runtime,
+ req.GetStartTime().AsTime(),
+ req.GetEndTime().AsTime(),
+ req.GetSandbox(),
+ )
+ }
if err != nil {
if errors.Is(err, storage.ErrObjectNotExist) {
- // Snapshot data not found, let the API know the data aren't probably upload yet
telemetry.ReportError(ctx, "sandbox files not found", err, telemetry.WithSandboxID(req.GetSandbox().GetSandboxId()))
return nil, status.Errorf(codes.FailedPrecondition, "sandbox files for '%s' not found", req.GetSandbox().GetSandboxId())
diff --git a/packages/shared/pkg/grpc/orchestrator/internal_flags.go b/packages/shared/pkg/grpc/orchestrator/internal_flags.go
new file mode 100644
--- /dev/null
+++ b/packages/shared/pkg/grpc/orchestrator/internal_flags.go
@@ -1,0 +1,3 @@
+package orchestrator
+
+const SandboxRebootFromRootfsGRPCMetadataKey = "x-e2b-reboot-from-rootfs"
diff --git a/spec/openapi.yml b/spec/openapi.yml
--- a/spec/openapi.yml
+++ b/spec/openapi.yml
@@ -724,6 +724,9 @@
type: boolean
deprecated: true
description: Automatically pauses the sandbox after the timeout
+ reboot:
+ type: boolean
+ description: Boot from the snapshot filesystem with fresh memory instead of restoring the memory snapshot.
ConnectSandbox:
type: object
diff --git a/tests/integration/internal/api/generated.go b/tests/integration/internal/api/generated.go
--- a/tests/integration/internal/api/generated.go
+++ b/tests/integration/internal/api/generated.go
@@ -709,6 +709,9 @@
// Deprecated: this property has been marked as deprecated upstream, but no `x-deprecated-reason` was set
AutoPause *bool `json:"autoPause,omitempty"`
+ // Reboot Boot from the snapshot filesystem with fresh memory instead of restoring the memory snapshot.
+ Reboot *bool `json:"reboot,omitempty"`
+
// Timeout Time to live for the sandbox in seconds.
Timeout *int32 `json:"timeout,omitempty"`
}You can send follow-ups to the cloud agent here.
|
Bugbot Autofix prepared fixes for both issues found in the latest run.
Or push these changes by commenting: Preview (25faf4a9ef)diff --git a/packages/api/internal/api/api.gen.go b/packages/api/internal/api/api.gen.go
--- a/packages/api/internal/api/api.gen.go
+++ b/packages/api/internal/api/api.gen.go
@@ -714,6 +714,9 @@
// Deprecated: this property has been marked as deprecated upstream, but no `x-deprecated-reason` was set
AutoPause *bool `json:"autoPause,omitempty"`
+ // Reboot Boot from the snapshot filesystem with fresh memory instead of restoring the memory snapshot.
+ Reboot *bool `json:"reboot,omitempty"`
+
// Timeout Time to live for the sandbox in seconds.
Timeout *int32 `json:"timeout,omitempty"`
}
@@ -13409,175 +13412,176 @@
// const string: with thousands of chunks the chained `+` fold is several
// times slower for the Go compiler than parsing a slice literal.
var swaggerSpec = []string{
- "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",
+ "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",
}
// decodeSpec returns the embedded OpenAPI spec as raw JSON bytes,
diff --git a/packages/api/internal/handlers/proxy_grpc.go b/packages/api/internal/handlers/proxy_grpc.go
--- a/packages/api/internal/handlers/proxy_grpc.go
+++ b/packages/api/internal/handlers/proxy_grpc.go
@@ -257,6 +257,7 @@
s.api.buildResumeSandboxData(sandboxID, nil),
&headers,
true,
+ false,
nil, // mcp
)
if apiErr != nil {
diff --git a/packages/api/internal/handlers/sandbox.go b/packages/api/internal/handlers/sandbox.go
--- a/packages/api/internal/handlers/sandbox.go
+++ b/packages/api/internal/handlers/sandbox.go
@@ -28,6 +28,7 @@
getSandboxData orchestrator.SandboxDataFetcher,
requestHeader *http.Header,
isResume bool,
+ reboot bool,
mcp api.Mcp,
) (*api.Sandbox, *api.APIError) {
sbx, apiErr := a.startSandboxInternal(
@@ -38,6 +39,7 @@
getSandboxData,
requestHeader,
isResume,
+ reboot,
mcp,
)
if apiErr != nil {
@@ -56,6 +58,7 @@
getSandboxData orchestrator.SandboxDataFetcher,
requestHeader *http.Header,
isResume bool,
+ reboot bool,
mcp api.Mcp,
) (sandbox.Sandbox, *api.APIError) {
startTime := time.Now()
@@ -77,6 +80,7 @@
timeout,
isResume,
creationMeta,
+ reboot,
)
if instanceErr != nil {
telemetry.ReportError(ctx, "error when creating instance", instanceErr.Err)
diff --git a/packages/api/internal/handlers/sandbox_connect.go b/packages/api/internal/handlers/sandbox_connect.go
--- a/packages/api/internal/handlers/sandbox_connect.go
+++ b/packages/api/internal/handlers/sandbox_connect.go
@@ -152,6 +152,7 @@
a.buildResumeSandboxData(sandboxID, nil),
&c.Request.Header,
true,
+ false,
nil, // mcp
)
if createErr != nil {
diff --git a/packages/api/internal/handlers/sandbox_create.go b/packages/api/internal/handlers/sandbox_create.go
--- a/packages/api/internal/handlers/sandbox_create.go
+++ b/packages/api/internal/handlers/sandbox_create.go
@@ -265,6 +265,7 @@
getSandboxData,
&c.Request.Header,
false,
+ false,
mcp,
)
if createErr != nil {
diff --git a/packages/api/internal/handlers/sandbox_resume.go b/packages/api/internal/handlers/sandbox_resume.go
--- a/packages/api/internal/handlers/sandbox_resume.go
+++ b/packages/api/internal/handlers/sandbox_resume.go
@@ -54,6 +54,7 @@
}
telemetry.ReportEvent(ctx, "Parsed body")
+ reboot := body.Reboot != nil && *body.Reboot
timeout := sandbox.SandboxTimeoutDefault
if body.Timeout != nil {
@@ -160,6 +161,7 @@
a.buildResumeSandboxData(sandboxID, body.AutoPause),
&c.Request.Header,
true,
+ reboot,
nil, // mcp
)
if createErr != nil {
diff --git a/packages/api/internal/orchestrator/create_instance.go b/packages/api/internal/orchestrator/create_instance.go
--- a/packages/api/internal/orchestrator/create_instance.go
+++ b/packages/api/internal/orchestrator/create_instance.go
@@ -10,6 +10,7 @@
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/metric"
"go.uber.org/zap"
+ "google.golang.org/grpc/metadata"
"google.golang.org/protobuf/types/known/timestamppb"
"github.com/e2b-dev/infra/packages/api/internal/api"
@@ -127,6 +128,7 @@
timeout time.Duration,
isResume bool,
creationMeta sandbox.CreationMetadata,
+ rebootOpt ...bool,
) (sbx sandbox.Sandbox, apiErr *api.APIError) {
ctx, childSpan := tracer.Start(ctx, "create-sandbox")
defer childSpan.End()
@@ -296,6 +298,10 @@
}
}
+ if len(rebootOpt) > 0 && rebootOpt[0] {
+ ctx = metadata.AppendToOutgoingContext(ctx, orchestrator.SandboxRebootFromRootfsGRPCMetadataKey, "true")
+ }
+
nodeClusterID := clusters.WithClusterFallback(team.ClusterID)
clusterNodes := o.GetClusterNodes(nodeClusterID)
diff --git a/packages/orchestrator/pkg/sandbox/sandbox.go b/packages/orchestrator/pkg/sandbox/sandbox.go
--- a/packages/orchestrator/pkg/sandbox/sandbox.go
+++ b/packages/orchestrator/pkg/sandbox/sandbox.go
@@ -559,8 +559,6 @@
exit.SetError(errors.Join(err, fcErr))
}()
- f.Sandboxes.MarkRunning(ctx, sbx)
-
return sbx, nil
}
diff --git a/packages/orchestrator/pkg/server/sandboxes.go b/packages/orchestrator/pkg/server/sandboxes.go
--- a/packages/orchestrator/pkg/server/sandboxes.go
+++ b/packages/orchestrator/pkg/server/sandboxes.go
@@ -24,10 +24,16 @@
"google.golang.org/protobuf/types/known/emptypb"
"google.golang.org/protobuf/types/known/timestamppb"
+ grpcmetadata "google.golang.org/grpc/metadata"
+
"github.com/e2b-dev/infra/packages/orchestrator/pkg/sandbox"
+ "github.com/e2b-dev/infra/packages/orchestrator/pkg/sandbox/block"
"github.com/e2b-dev/infra/packages/orchestrator/pkg/sandbox/fc"
sbxtemplate "github.com/e2b-dev/infra/packages/orchestrator/pkg/sandbox/template"
+ configpkg "github.com/e2b-dev/infra/packages/orchestrator/pkg/template/build/config"
+ "github.com/e2b-dev/infra/packages/orchestrator/pkg/template/constants"
"github.com/e2b-dev/infra/packages/orchestrator/pkg/template/metadata"
+ "github.com/e2b-dev/infra/packages/orchestrator/pkg/units"
"github.com/e2b-dev/infra/packages/shared/pkg/events"
"github.com/e2b-dev/infra/packages/shared/pkg/featureflags"
"github.com/e2b-dev/infra/packages/shared/pkg/grpc/orchestrator"
@@ -58,6 +64,68 @@
killReasonUnknown = "unknown"
)
+func rebootFromRootfsEnabled(ctx context.Context) bool {
+ values := grpcmetadata.ValueFromIncomingContext(ctx, orchestrator.SandboxRebootFromRootfsGRPCMetadataKey)
+ return len(values) > 0 && values[0] == "true"
+}
+
+func (s *Server) createSandboxFromRootfs(
+ ctx context.Context,
+ template sbxtemplate.Template,
+ config *sandbox.Config,
+ runtime sandbox.RuntimeMetadata,
+ req *orchestrator.SandboxCreateRequest,
+) (*sandbox.Sandbox, error) {
+ memfile, err := block.NewEmpty(
+ units.MBToBytes(config.RamMB),
+ configpkg.MemfilePageSize(config.HugePages),
+ uuid.MustParse(template.Files().BuildID),
+ )
+ if err != nil {
+ return nil, fmt.Errorf("create empty memfile: %w", err)
+ }
+ defer memfile.Close()
+
+ maskedTemplate := sbxtemplate.NewMaskTemplate(template, sbxtemplate.WithMemfile(memfile))
+
+ kvmClock, err := utils.IsGTEVersion(config.Envd.Version, "0.2.11")
+ if err != nil {
+ return nil, fmt.Errorf("compare envd version: %w", err)
+ }
+
+ sandboxTimeout := req.GetEndTime().AsTime().Sub(req.GetStartTime().AsTime())
+ if sandboxTimeout <= 0 {
+ sandboxTimeout = s.config.EnvdTimeout
+ }
+
+ sbx, err := s.sandboxFactory.CreateSandbox(
+ ctx,
+ config,
+ runtime,
+ maskedTemplate,
+ sandboxTimeout,
+ "",
+ fc.ProcessOptions{
+ InitScriptPath: constants.SystemdInitPath,
+ KvmClock: kvmClock,
+ },
+ req.GetSandbox(),
+ nil,
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ if err := sbx.WaitForEnvd(ctx, s.config.EnvdTimeout); err != nil {
+ closeErr := sbx.Close(context.WithoutCancel(ctx))
+ return nil, errors.Join(fmt.Errorf("wait for envd after rootfs reboot: %w", err), closeErr)
+ }
+
+ s.sandboxFactory.Sandboxes.MarkRunning(ctx, sbx)
+
+ return sbx, nil
+}
+
func (s *Server) Create(ctx context.Context, req *orchestrator.SandboxCreateRequest) (_ *orchestrator.SandboxCreateResponse, createErr error) {
// set max request timeout for this request
ctx, cancel := context.WithTimeoutCause(ctx, requestTimeout, errors.New("request timed out"))
@@ -187,18 +255,22 @@
SandboxType: sandbox.SandboxTypeSandbox,
}
- sbx, err := s.sandboxFactory.ResumeSandbox(
- ctx,
- template,
- config,
- runtime,
- req.GetStartTime().AsTime(),
- req.GetEndTime().AsTime(),
- req.GetSandbox(),
- )
+ var sbx *sandbox.Sandbox
+ if rebootFromRootfsEnabled(ctx) {
+ sbx, err = s.createSandboxFromRootfs(ctx, template, config, runtime, req)
+ } else {
+ sbx, err = s.sandboxFactory.ResumeSandbox(
+ ctx,
+ template,
+ config,
+ runtime,
+ req.GetStartTime().AsTime(),
+ req.GetEndTime().AsTime(),
+ req.GetSandbox(),
+ )
+ }
if err != nil {
if errors.Is(err, storage.ErrObjectNotExist) {
- // Snapshot data not found, let the API know the data aren't probably upload yet
telemetry.ReportError(ctx, "sandbox files not found", err, telemetry.WithSandboxID(req.GetSandbox().GetSandboxId()))
return nil, status.Errorf(codes.FailedPrecondition, "sandbox files for '%s' not found", req.GetSandbox().GetSandboxId())
diff --git a/packages/orchestrator/pkg/template/build/layer/create_sandbox.go b/packages/orchestrator/pkg/template/build/layer/create_sandbox.go
--- a/packages/orchestrator/pkg/template/build/layer/create_sandbox.go
+++ b/packages/orchestrator/pkg/template/build/layer/create_sandbox.go
@@ -173,5 +173,7 @@
return nil, fmt.Errorf("wait for envd: %w", err)
}
+ cs.sandboxFactory.Sandboxes.MarkRunning(ctx, sbx)
+
return sbx, nil
}
diff --git a/packages/shared/pkg/grpc/orchestrator/internal_flags.go b/packages/shared/pkg/grpc/orchestrator/internal_flags.go
new file mode 100644
--- /dev/null
+++ b/packages/shared/pkg/grpc/orchestrator/internal_flags.go
@@ -1,0 +1,3 @@
+package orchestrator
+
+const SandboxRebootFromRootfsGRPCMetadataKey = "x-e2b-reboot-from-rootfs"
diff --git a/spec/openapi.yml b/spec/openapi.yml
--- a/spec/openapi.yml
+++ b/spec/openapi.yml
@@ -724,6 +724,9 @@
type: boolean
deprecated: true
description: Automatically pauses the sandbox after the timeout
+ reboot:
+ type: boolean
+ description: Boot from the snapshot filesystem with fresh memory instead of restoring the memory snapshot.
ConnectSandbox:
type: object
diff --git a/tests/integration/internal/api/generated.go b/tests/integration/internal/api/generated.go
--- a/tests/integration/internal/api/generated.go
+++ b/tests/integration/internal/api/generated.go
@@ -709,6 +709,9 @@
// Deprecated: this property has been marked as deprecated upstream, but no `x-deprecated-reason` was set
AutoPause *bool `json:"autoPause,omitempty"`
+ // Reboot Boot from the snapshot filesystem with fresh memory instead of restoring the memory snapshot.
+ Reboot *bool `json:"reboot,omitempty"`
+
// Timeout Time to live for the sandbox in seconds.
Timeout *int32 `json:"timeout,omitempty"`
}You can send follow-ups to the cloud agent here. |
8f3c887 to
9ad58bc
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
Autofix Details
Bugbot Autofix prepared a fix for the issue found in the latest run.
- ✅ Fixed: Reboot resume uses envd timeout
- Changed createSandboxFromRootfs to calculate sandboxTimeout from request's EndTime and StartTime instead of using the 10-second envd timeout, matching the behavior of normal resume path.
Or push these changes by commenting:
@cursor push 2a4a8499e0
Preview (2a4a8499e0)
diff --git a/packages/orchestrator/pkg/server/sandboxes.go b/packages/orchestrator/pkg/server/sandboxes.go
--- a/packages/orchestrator/pkg/server/sandboxes.go
+++ b/packages/orchestrator/pkg/server/sandboxes.go
@@ -98,12 +98,14 @@
return nil, fmt.Errorf("compare envd version: %w", err)
}
+ sandboxTimeout := req.GetEndTime().AsTime().Sub(req.GetStartTime().AsTime())
+
sbx, err := s.sandboxFactory.CreateSandbox(
ctx,
config,
runtime,
maskedTemplate,
- s.config.EnvdTimeout,
+ sandboxTimeout,
"",
fc.ProcessOptions{
InitScriptPath: constants.SystemdInitPath,You can send follow-ups to the cloud agent here.
86d868e to
fdc34aa
Compare
Adds an optional `reboot` flag on the resume endpoint that boots the sandbox from its snapshot filesystem with fresh memory, discarding the memory snapshot. Useful when memfile restore is slow or corrupted. The flag flows via gRPC metadata to the orchestrator, which creates an empty memfile and cold-boots the VM through systemd. Existing paths are unchanged when the flag is not set.
fdc34aa to
558f3fc
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
Bugbot Autofix prepared a fix for the issue found in the latest run.
- ✅ Fixed: Reboot ignores API end time
- Modified CreateSandbox to accept optional startedAt/endAt parameters and updated the reboot path to pass the API's explicit timestamps instead of using time.Now().
Or push these changes by commenting:
@cursor push bd1530ed0f
Preview (bd1530ed0f)
diff --git a/packages/orchestrator/pkg/sandbox/sandbox.go b/packages/orchestrator/pkg/sandbox/sandbox.go
--- a/packages/orchestrator/pkg/sandbox/sandbox.go
+++ b/packages/orchestrator/pkg/sandbox/sandbox.go
@@ -332,6 +332,8 @@
processOptions fc.ProcessOptions,
apiConfigToStore *orchestrator.SandboxConfig,
preBootFn PreBootFn,
+ startedAt *time.Time,
+ endAt *time.Time,
) (s *Sandbox, e error) {
ctx, span := tracer.Start(ctx, "create sandbox")
defer span.End()
@@ -457,6 +459,15 @@
memory: uffd.NewNoopMemory(memfileSize, fcPageSize),
}
+ var actualStartedAt, actualEndAt time.Time
+ if startedAt != nil && endAt != nil {
+ actualStartedAt = *startedAt
+ actualEndAt = *endAt
+ } else {
+ actualStartedAt = time.Now()
+ actualEndAt = time.Now().Add(sandboxTimeout)
+ }
+
metadata := &Metadata{
internalConfig: internalConfig{
EnvdInitRequestTimeout: f.GetEnvdInitRequestTimeout(ctx),
@@ -465,8 +476,8 @@
Config: config,
Runtime: runtime,
- startedAt: time.Now(),
- endAt: time.Now().Add(sandboxTimeout),
+ startedAt: actualStartedAt,
+ endAt: actualEndAt,
}
sbx := &Sandbox{
diff --git a/packages/orchestrator/pkg/server/sandboxes.go b/packages/orchestrator/pkg/server/sandboxes.go
--- a/packages/orchestrator/pkg/server/sandboxes.go
+++ b/packages/orchestrator/pkg/server/sandboxes.go
@@ -95,6 +95,9 @@
timeout = s.config.EnvdTimeout
}
+ startTime := req.GetStartTime().AsTime()
+ endTime := req.GetEndTime().AsTime()
+
sbx, err := s.sandboxFactory.CreateSandbox(
ctx,
config,
@@ -108,6 +111,8 @@
},
req.GetSandbox(),
nil,
+ &startTime,
+ &endTime,
)
if err != nil {
return nil, err
diff --git a/packages/orchestrator/pkg/template/build/layer/create_sandbox.go b/packages/orchestrator/pkg/template/build/layer/create_sandbox.go
--- a/packages/orchestrator/pkg/template/build/layer/create_sandbox.go
+++ b/packages/orchestrator/pkg/template/build/layer/create_sandbox.go
@@ -154,6 +154,8 @@
},
nil,
cs.preBootFn,
+ nil,
+ nil,
)
if err != nil {
return nil, fmt.Errorf("create sandbox: %w", err)
diff --git a/packages/orchestrator/pkg/template/build/phases/base/provision.go b/packages/orchestrator/pkg/template/build/phases/base/provision.go
--- a/packages/orchestrator/pkg/template/build/phases/base/provision.go
+++ b/packages/orchestrator/pkg/template/build/phases/base/provision.go
@@ -142,7 +142,9 @@
Stderr: logsWriter,
},
nil,
- nil, // no pre-boot hook for provisioning
+ nil,
+ nil,
+ nil,
)
if err != nil {
return fmt.Errorf("error creating sandbox: %w", err)You can send follow-ups to the cloud agent here.
Reviewed by Cursor Bugbot for commit 13c2b3c. Configure here.
The reboot path reuses CreateSandbox, which marked the sandbox running before WaitForEnvd, unlike ResumeSandbox. Add an opt-in WithDeferredMarkRunning option so the reboot path marks running only after envd is ready, keeping the two resume paths consistent.
|
Closing for now because of other immediate prios. |


Adds an optional
rebootboolean on the create and resume endpoints. When set, the orchestrator boots the sandbox from its template/snapshot filesystem with fresh memory, discarding the memory snapshot. Useful as an escape hatch when memory snapshots are slow or corrupted.Not exposed on connect or auto-resume.