From 5b3c6814a99cb02d6c689b21518591e01c47539b Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Mon, 26 Jun 2023 17:09:24 +0000 Subject: [PATCH] fix(enterprise/coderd): avoid deadlock during entitlements update --- enterprise/coderd/coderd.go | 11 +++++++---- enterprise/coderd/workspaceagents.go | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/enterprise/coderd/coderd.go b/enterprise/coderd/coderd.go index 6545e599202f3..4a03731c5b21a 100644 --- a/enterprise/coderd/coderd.go +++ b/enterprise/coderd/coderd.go @@ -313,8 +313,9 @@ type API struct { // ProxyHealth checks the reachability of all workspace proxies. ProxyHealth *proxyhealth.ProxyHealth - entitlementsMu sync.RWMutex - entitlements codersdk.Entitlements + entitlementsUpdateMu sync.Mutex + entitlementsMu sync.RWMutex + entitlements codersdk.Entitlements } func (api *API) Close() error { @@ -329,8 +330,8 @@ func (api *API) Close() error { } func (api *API) updateEntitlements(ctx context.Context) error { - api.entitlementsMu.Lock() - defer api.entitlementsMu.Unlock() + api.entitlementsUpdateMu.Lock() + defer api.entitlementsUpdateMu.Unlock() entitlements, err := license.Entitlements( ctx, api.Database, @@ -457,6 +458,8 @@ func (api *API) updateEntitlements(ctx context.Context) error { } } + api.entitlementsMu.Lock() + defer api.entitlementsMu.Unlock() api.entitlements = entitlements api.AGPL.SiteHandler.Entitlements.Store(&entitlements) diff --git a/enterprise/coderd/workspaceagents.go b/enterprise/coderd/workspaceagents.go index d5595e6570543..05590342aec5b 100644 --- a/enterprise/coderd/workspaceagents.go +++ b/enterprise/coderd/workspaceagents.go @@ -9,9 +9,9 @@ import ( ) func (api *API) shouldBlockNonBrowserConnections(rw http.ResponseWriter) bool { - api.entitlementsMu.Lock() + api.entitlementsMu.RLock() browserOnly := api.entitlements.Features[codersdk.FeatureBrowserOnly].Enabled - api.entitlementsMu.Unlock() + api.entitlementsMu.RUnlock() if browserOnly { httpapi.Write(context.Background(), rw, http.StatusConflict, codersdk.Response{ Message: "Non-browser connections are disabled for your deployment.",