Skip to content

Commit ceed599

Browse files
authored
Merge pull request #32 from PostHog/fix/concurrent-connection-issues
Fix S3 secret creation race condition for concurrent connections
2 parents 104d5b2 + eeb5c6e commit ceed599

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

server/server.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ type Server struct {
8585
closed bool
8686
closeMu sync.Mutex
8787
activeConns int64 // atomic counter for active connections
88+
89+
// duckLakeMu serializes DuckLake secret creation to avoid write-write conflicts
90+
duckLakeMu sync.Mutex
8891
}
8992

9093
func New(cfg Config) (*Server, error) {
@@ -358,6 +361,18 @@ func (s *Server) attachDuckLake(db *sql.DB) error {
358361
//
359362
// See: https://duckdb.org/docs/stable/core_extensions/httpfs/s3api
360363
func (s *Server) createS3Secret(db *sql.DB) error {
364+
// Serialize secret creation to avoid DuckDB write-write conflicts
365+
// when multiple connections try to create the same secret simultaneously
366+
s.duckLakeMu.Lock()
367+
defer s.duckLakeMu.Unlock()
368+
369+
// Check if secret already exists to avoid unnecessary creation
370+
var count int
371+
err := db.QueryRow("SELECT COUNT(*) FROM duckdb_secrets() WHERE name = 'ducklake_s3'").Scan(&count)
372+
if err == nil && count > 0 {
373+
return nil // Secret already exists
374+
}
375+
361376
// Determine provider: use credential_chain if explicitly set or if no access key provided
362377
provider := s.cfg.DuckLake.S3Provider
363378
if provider == "" {

0 commit comments

Comments
 (0)