diff --git a/packages/envd/internal/api/init.go b/packages/envd/internal/api/init.go index 4d0081b0a2..f49f317647 100644 --- a/packages/envd/internal/api/init.go +++ b/packages/envd/internal/api/init.go @@ -128,8 +128,12 @@ func (a *API) PostInit(w http.ResponseWriter, r *http.Request) { // Safe because Destroy() is nil-safe and TakeFrom clears the source. defer initRequest.AccessToken.Destroy() - a.initLock.Lock() - defer a.initLock.Unlock() + if err := a.initLock.Acquire(ctx, 1); err != nil { + w.WriteHeader(http.StatusServiceUnavailable) + + return + } + defer a.initLock.Release(1) // Update data only if the request is newer or if there's no timestamp at all if initRequest.Timestamp == nil || a.lastSetTime.SetToGreater(initRequest.Timestamp.UnixNano()) { diff --git a/packages/envd/internal/api/store.go b/packages/envd/internal/api/store.go index 7564d1e62b..e5c536fead 100644 --- a/packages/envd/internal/api/store.go +++ b/packages/envd/internal/api/store.go @@ -8,6 +8,7 @@ import ( "sync/atomic" "github.com/rs/zerolog" + "golang.org/x/sync/semaphore" "github.com/e2b-dev/infra/packages/envd/internal/execcontext" "github.com/e2b-dev/infra/packages/envd/internal/host" @@ -37,7 +38,7 @@ type API struct { mmdsClient MMDSClient lastSetTime *utils.AtomicMax - initLock sync.Mutex + initLock *semaphore.Weighted caCertInstaller *host.CACertInstaller isMountingNFS atomic.Bool @@ -54,6 +55,7 @@ func New(l *zerolog.Logger, defaults *execcontext.Defaults, mmdsChan chan *host. lastSetTime: utils.NewAtomicMax(), accessToken: &SecureToken{}, caCertInstaller: host.NewCACertInstaller(l), + initLock: semaphore.NewWeighted(1), } } diff --git a/packages/envd/pkg/version.go b/packages/envd/pkg/version.go index 88bc32c769..4cfbb08b29 100644 --- a/packages/envd/pkg/version.go +++ b/packages/envd/pkg/version.go @@ -1,3 +1,3 @@ package pkg -const Version = "0.5.23" +const Version = "0.5.24"