@@ -69,7 +69,7 @@ func TestConnect_FailsWhenDataDirLocked(t *testing.T) {
69 require.NoError(t, err, "expected to take the data-dir lock for the first time")
69 require.NoError(t, err, "expected to take the data-dir lock for the first time")
70 t.Cleanup(release)
70 t.Cleanup(release)
72− _, err = Connect(context.Background(), dataDir)
72+ _, err = Connect(context.Background(), dataDir, WithDataDirLock(true))
73 require.Error(t, err, "Connect must refuse to open a locked data dir")
73 require.Error(t, err, "Connect must refuse to open a locked data dir")
74 require.ErrorIs(t, err, ErrDataDirLocked)
74 require.ErrorIs(t, err, ErrDataDirLocked)
@@ -85,12 +85,12 @@ func TestConnect_SucceedsAfterContenderReleases(t *testing.T) {
85 release, err := tryFileLock(lockPath)
85 release, err := tryFileLock(lockPath)
86 require.NoError(t, err)
86 require.NoError(t, err)
88− _, err = Connect(context.Background(), dataDir)
88+ _, err = Connect(context.Background(), dataDir, WithDataDirLock(true))
89 require.ErrorIs(t, err, ErrDataDirLocked)
89 require.ErrorIs(t, err, ErrDataDirLocked)
93− conn, err := Connect(context.Background(), dataDir)
93+ conn, err := Connect(context.Background(), dataDir, WithDataDirLock(true))
94 require.NoError(t, err, "Connect should succeed once the contender releases the lock")
94 require.NoError(t, err, "Connect should succeed once the contender releases the lock")
95 require.NoError(t, conn.PingContext(context.Background()))
95 require.NoError(t, conn.PingContext(context.Background()))
96 require.NoError(t, Release(dataDir))
96 require.NoError(t, Release(dataDir))
@@ -105,7 +105,7 @@ func TestConnect_LockReleasedOnFinalRelease(t *testing.T) {
105 dataDir := t.TempDir()
105 dataDir := t.TempDir()
106 lockPath := filepath.Join(dataDir, dataDirLockFile)
106 lockPath := filepath.Join(dataDir, dataDirLockFile)
108− conn, err := Connect(context.Background(), dataDir)
108+ conn, err := Connect(context.Background(), dataDir, WithDataDirLock(true))
109 require.NoError(t, err)
109 require.NoError(t, err)
110 require.NoError(t, conn.PingContext(context.Background()))
110 require.NoError(t, conn.PingContext(context.Background()))
@@ -135,10 +135,10 @@ func TestConnect_SharedPoolDoesNotReacquireLock(t *testing.T) {
135 dataDir := t.TempDir()
135 dataDir := t.TempDir()
136 lockPath := filepath.Join(dataDir, dataDirLockFile)
136 lockPath := filepath.Join(dataDir, dataDirLockFile)
138− _, err := Connect(context.Background(), dataDir)
138+ _, err := Connect(context.Background(), dataDir, WithDataDirLock(true))
139 require.NoError(t, err)
139 require.NoError(t, err)
141− _, err = Connect(context.Background(), dataDir)
141+ _, err = Connect(context.Background(), dataDir, WithDataDirLock(true))
142 require.NoError(t, err)
142 require.NoError(t, err)
144 // Drop one reference; lock must still be held.
144 // Drop one reference; lock must still be held.
@@ -163,8 +163,47 @@ func TestConnect_SkipLockEnvBypassesAcquisition(t *testing.T) {
164 t.Setenv("CRUSH_SKIP_DATADIR_LOCK", "1")
164 t.Setenv("CRUSH_SKIP_DATADIR_LOCK", "1")
166− conn, err := Connect(context.Background(), dataDir)
166+ conn, err := Connect(context.Background(), dataDir, WithDataDirLock(true))
167 require.NoError(t, err, "skip-lock env should bypass contention")
167 require.NoError(t, err, "skip-lock env should bypass contention")
168 require.NoError(t, conn.PingContext(context.Background()))
168 require.NoError(t, conn.PingContext(context.Background()))
169 require.NoError(t, Release(dataDir))
169 require.NoError(t, Release(dataDir))
172+// TestConnect_DefaultIgnoresContendedLock confirms that without
173+// WithDataDirLock(true) the lock file is irrelevant: a contender can
174+// hold tryFileLock and Connect still succeeds. This pins the
175+// local-mode default to its pre-lock behavior.
176+func TestConnect_DefaultIgnoresContendedLock(t *testing.T) {
177+ t.Cleanup(ResetPool)
179+ dataDir := t.TempDir()
180+ lockPath := filepath.Join(dataDir, dataDirLockFile)
182+ release, err := tryFileLock(lockPath)
183+ require.NoError(t, err, "expected to take the data-dir lock for the first time")
186+ conn, err := Connect(context.Background(), dataDir)
187+ require.NoError(t, err, "default Connect must not take the lock and must succeed under contention")
188+ require.NoError(t, conn.PingContext(context.Background()))
189+ require.NoError(t, Release(dataDir))
192+// TestConnect_ServerPathFailsWhenDataDirLocked is the server's
193+// workspace-bootstrap analogue of TestConnect_FailsWhenDataDirLocked:
194+// passing WithDataDirLock(true) must surface ErrDataDirLocked when a
195+// contender already holds the lock.
196+func TestConnect_ServerPathFailsWhenDataDirLocked(t *testing.T) {
197+ t.Cleanup(ResetPool)
199+ dataDir := t.TempDir()
200+ lockPath := filepath.Join(dataDir, dataDirLockFile)
202+ release, err := tryFileLock(lockPath)
203+ require.NoError(t, err, "expected to take the data-dir lock for the first time")
206+ _, err = Connect(context.Background(), dataDir, WithDataDirLock(true))
207+ require.Error(t, err, "server-path Connect must refuse to open a locked data dir")
208+ require.ErrorIs(t, err, ErrDataDirLocked)