File tree Expand file tree Collapse file tree 1 file changed +15
-0
lines changed
Expand file tree Collapse file tree 1 file changed +15
-0
lines changed Original file line number Diff line number Diff 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
9093func 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
360363func (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 == "" {
You can’t perform that action at this time.
0 commit comments