diff --git a/packages/orchestrator/pkg/sandbox/reclaim.go b/packages/orchestrator/pkg/sandbox/reclaim.go index 3c9343cf2f..2d65b8cd5a 100644 --- a/packages/orchestrator/pkg/sandbox/reclaim.go +++ b/packages/orchestrator/pkg/sandbox/reclaim.go @@ -84,28 +84,22 @@ func (s *Sandbox) bestEffortReclaim(ctx context.Context) { ctx, span := tracer.Start(ctx, "envd-reclaim") defer span.End() - cfg := featureflags.GetReclaimConfig(ctx, s.featureFlags, - featureflags.SandboxContext(s.Runtime.SandboxID), + ctx = featureflags.AddToContext( + ctx, + sandboxLDContext(s.Runtime, s.Config), featureflags.TeamContext(s.Runtime.TeamID), featureflags.TemplateContext(s.Runtime.TemplateID), ) - if s.featureFlags.BoolFlag(ctx, featureflags.FreezeUserCgroupFlag, - featureflags.SandboxContext(s.Runtime.SandboxID), - featureflags.TeamContext(s.Runtime.TeamID), - featureflags.TemplateContext(s.Runtime.TemplateID), - ) { + if s.featureFlags.BoolFlag(ctx, featureflags.FreezeUserCgroupFlag) { s.bestEffortFreeze(ctx) } - if s.featureFlags.BoolFlag(ctx, featureflags.CollapseEnvdHeapFlag, - featureflags.SandboxContext(s.Runtime.SandboxID), - featureflags.TeamContext(s.Runtime.TeamID), - featureflags.TemplateContext(s.Runtime.TemplateID), - ) { + if s.featureFlags.BoolFlag(ctx, featureflags.CollapseEnvdHeapFlag) { s.bestEffortCollapse(ctx) } + cfg := featureflags.GetReclaimConfig(ctx, s.featureFlags) script, timeout := s.buildReclaimScript(cfg) if script == "" { return @@ -308,11 +302,7 @@ func (s *Sandbox) bestEffortCollapse(ctx context.Context) { // Timeout comes straight from the flag, whose fallback (10s) is returned // whenever LD is unavailable or the flag is unset — so there is no separate // local default to keep in sync. - timeout := time.Duration(s.featureFlags.IntFlag(ctx, featureflags.CollapseEnvdHeapTimeoutMsFlag, - featureflags.SandboxContext(s.Runtime.SandboxID), - featureflags.TeamContext(s.Runtime.TeamID), - featureflags.TemplateContext(s.Runtime.TemplateID), - )) * time.Millisecond + timeout := time.Duration(s.featureFlags.IntFlag(ctx, featureflags.CollapseEnvdHeapTimeoutMsFlag)) * time.Millisecond start := time.Now() stats, err := s.callEnvdCollapse(ctx, timeout) diff --git a/packages/orchestrator/pkg/sandbox/sandbox.go b/packages/orchestrator/pkg/sandbox/sandbox.go index 84d656f776..4817ca57d0 100644 --- a/packages/orchestrator/pkg/sandbox/sandbox.go +++ b/packages/orchestrator/pkg/sandbox/sandbox.go @@ -187,7 +187,7 @@ type RuntimeMetadata struct { SandboxType SandboxType } -// sandboxLDContext builds an LD context with kernel/FC-version attributes for +// sandboxLDContext builds an LD context with envd/kernel/FC-version attributes for // per-sandbox flag targeting. Team/template targeting comes from the team and // template contexts the caller embeds in ctx. func sandboxLDContext(runtime RuntimeMetadata, config *Config) ldcontext.Context { @@ -196,6 +196,7 @@ func sandboxLDContext(runtime RuntimeMetadata, config *Config) ldcontext.Context SetString(featureflags.SandboxTemplateAttribute, runtime.TemplateID). SetString(featureflags.SandboxKernelVersionAttribute, config.FirecrackerConfig.KernelVersion). SetString(featureflags.SandboxFirecrackerVersionAttribute, config.FirecrackerConfig.FirecrackerVersion). + SetString(featureflags.SandboxEnvdVersionAttribute, config.Envd.Version). SetString(featureflags.SandboxTypeAttribute, runtime.SandboxType.String()). Build() } diff --git a/packages/orchestrator/pkg/server/sandboxes.go b/packages/orchestrator/pkg/server/sandboxes.go index e462bf4097..b679177ca6 100644 --- a/packages/orchestrator/pkg/server/sandboxes.go +++ b/packages/orchestrator/pkg/server/sandboxes.go @@ -112,6 +112,7 @@ func (s *Server) Create(ctx context.Context, req *orchestrator.SandboxCreateRequ SetString(featureflags.SandboxTemplateAttribute, req.GetSandbox().GetTemplateId()). SetString(featureflags.SandboxKernelVersionAttribute, req.GetSandbox().GetKernelVersion()). SetString(featureflags.SandboxFirecrackerVersionAttribute, req.GetSandbox().GetFirecrackerVersion()). + SetString(featureflags.SandboxEnvdVersionAttribute, req.GetSandbox().GetEnvdVersion()). Build(), ldcontext.NewBuilder(req.GetSandbox().GetTeamId()). Kind(featureflags.TeamKind). @@ -605,14 +606,6 @@ func (s *Server) Pause(ctx context.Context, in *orchestrator.SandboxPauseRequest telemetry.WithBuildID(in.GetBuildId()), ) - ctx = featureflags.AddToContext( - ctx, - ldcontext.NewBuilder(in.GetSandboxId()). - Kind(featureflags.SandboxKind). - SetString(featureflags.SandboxTemplateAttribute, in.GetTemplateId()). - Build(), - ) - sbx, ok := s.sandboxFactory.Sandboxes.Get(in.GetSandboxId()) if !ok { telemetry.ReportCriticalError(ctx, "sandbox not found", nil, telemetry.WithSandboxID(in.GetSandboxId())) @@ -620,6 +613,17 @@ func (s *Server) Pause(ctx context.Context, in *orchestrator.SandboxPauseRequest return nil, status.Error(codes.NotFound, "sandbox not found") } + ctx = featureflags.AddToContext( + ctx, + ldcontext.NewBuilder(in.GetSandboxId()). + Kind(featureflags.SandboxKind). + SetString(featureflags.SandboxTemplateAttribute, sbx.Runtime.TemplateID). + SetString(featureflags.SandboxKernelVersionAttribute, sbx.Config.FirecrackerConfig.KernelVersion). + SetString(featureflags.SandboxFirecrackerVersionAttribute, sbx.Config.FirecrackerConfig.FirecrackerVersion). + SetString(featureflags.SandboxEnvdVersionAttribute, sbx.Config.Envd.Version). + Build(), + ) + childSpan.SetAttributes( telemetry.WithTeamID(sbx.Runtime.TeamID), telemetry.WithFirecrackerVersion(sbx.Config.FirecrackerConfig.FirecrackerVersion), @@ -687,13 +691,6 @@ func (s *Server) Checkpoint(ctx context.Context, in *orchestrator.SandboxCheckpo telemetry.WithBuildID(in.GetBuildId()), ) - ctx = featureflags.AddToContext( - ctx, - ldcontext.NewBuilder(in.GetSandboxId()). - Kind(featureflags.SandboxKind). - Build(), - ) - sbx, ok := s.sandboxFactory.Sandboxes.Get(in.GetSandboxId()) if !ok { telemetry.ReportCriticalError(ctx, "sandbox not found", nil, telemetry.WithSandboxID(in.GetSandboxId())) @@ -701,6 +698,17 @@ func (s *Server) Checkpoint(ctx context.Context, in *orchestrator.SandboxCheckpo return nil, status.Errorf(codes.NotFound, "sandbox '%s' not found", in.GetSandboxId()) } + ctx = featureflags.AddToContext( + ctx, + ldcontext.NewBuilder(in.GetSandboxId()). + Kind(featureflags.SandboxKind). + SetString(featureflags.SandboxTemplateAttribute, sbx.Runtime.TemplateID). + SetString(featureflags.SandboxKernelVersionAttribute, sbx.Config.FirecrackerConfig.KernelVersion). + SetString(featureflags.SandboxFirecrackerVersionAttribute, sbx.Config.FirecrackerConfig.FirecrackerVersion). + SetString(featureflags.SandboxEnvdVersionAttribute, sbx.Config.Envd.Version). + Build(), + ) + childSpan.SetAttributes( telemetry.WithTeamID(sbx.Runtime.TeamID), telemetry.WithTemplateID(sbx.Runtime.TemplateID), diff --git a/packages/shared/pkg/featureflags/flags.go b/packages/shared/pkg/featureflags/flags.go index 0a20586aaa..add7770402 100644 --- a/packages/shared/pkg/featureflags/flags.go +++ b/packages/shared/pkg/featureflags/flags.go @@ -18,6 +18,7 @@ const ( SandboxTemplateAttribute string = "template-id" SandboxKernelVersionAttribute string = "kernel-version" SandboxFirecrackerVersionAttribute string = "firecracker-version" + SandboxEnvdVersionAttribute string = "envd-version" // SandboxTypeAttribute distinguishes "sandbox" from "build" runs. SandboxTypeAttribute string = "sandbox-type"