From 803c5a8dcae031e7e80ed2bc2d5dae1d9d28e53b Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 30 Jun 2026 10:38:51 -0700 Subject: [PATCH] fix(filer): use DROP TABLE IF EXISTS in SQL stores (#10158) Concurrent bucket deletion across multiple filer replicas races on the per-bucket DROP TABLE. The first replica drops the table; the rest hit an undefined-table error (postgres 42P01, mysql 1051) which propagates out of DeleteFolderChildren and panics the filer. On restart the same pending DROP re-runs and the filer crash-loops. Make the drop idempotent. Same defect class in all SQL backends, so fix postgres, postgres2, mysql, mysql2, and sqlite together. --- weed/filer/mysql/mysql_store.go | 2 +- weed/filer/mysql2/mysql2_store.go | 2 +- weed/filer/postgres/postgres_store.go | 2 +- weed/filer/postgres2/postgres2_store.go | 2 +- weed/filer/sqlite/sqlite_store.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/weed/filer/mysql/mysql_store.go b/weed/filer/mysql/mysql_store.go index 3513b5523..abcef6fe6 100644 --- a/weed/filer/mysql/mysql_store.go +++ b/weed/filer/mysql/mysql_store.go @@ -72,7 +72,7 @@ func (store *MysqlStore) initialize(dsn string, upsertQuery string, enableUpsert } gen := &SqlGenMysql{ CreateTableSqlTemplate: "", - DropTableSqlTemplate: "DROP TABLE `%s`", + DropTableSqlTemplate: "DROP TABLE IF EXISTS `%s`", UpsertQueryTemplate: upsertQuery, } store.SqlGenerator = gen diff --git a/weed/filer/mysql2/mysql2_store.go b/weed/filer/mysql2/mysql2_store.go index b4845ec07..0ff58f2ac 100644 --- a/weed/filer/mysql2/mysql2_store.go +++ b/weed/filer/mysql2/mysql2_store.go @@ -65,7 +65,7 @@ func (store *MysqlStore2) initialize(createTable, upsertQuery string, enableUpse } gen := &mysql.SqlGenMysql{ CreateTableSqlTemplate: createTable, - DropTableSqlTemplate: "DROP TABLE `%s`", + DropTableSqlTemplate: "DROP TABLE IF EXISTS `%s`", UpsertQueryTemplate: upsertQuery, } store.SqlGenerator = gen diff --git a/weed/filer/postgres/postgres_store.go b/weed/filer/postgres/postgres_store.go index a2388624b..c694f77c3 100644 --- a/weed/filer/postgres/postgres_store.go +++ b/weed/filer/postgres/postgres_store.go @@ -64,7 +64,7 @@ func (store *PostgresStore) initialize(upsertQuery string, enableUpsert bool, us } gen := &SqlGenPostgres{ CreateTableSqlTemplate: "", - DropTableSqlTemplate: `drop table "%s"`, + DropTableSqlTemplate: `drop table if exists "%s"`, UpsertQueryTemplate: upsertQuery, } store.SqlGenerator = gen diff --git a/weed/filer/postgres2/postgres2_store.go b/weed/filer/postgres2/postgres2_store.go index b818e550d..3a08118af 100644 --- a/weed/filer/postgres2/postgres2_store.go +++ b/weed/filer/postgres2/postgres2_store.go @@ -70,7 +70,7 @@ func (store *PostgresStore2) initialize(createTable, upsertQuery string, enableU } gen := &postgres.SqlGenPostgres{ CreateTableSqlTemplate: createTable, - DropTableSqlTemplate: `drop table "%s"`, + DropTableSqlTemplate: `drop table if exists "%s"`, UpsertQueryTemplate: upsertQuery, } store.SqlGenerator = gen diff --git a/weed/filer/sqlite/sqlite_store.go b/weed/filer/sqlite/sqlite_store.go index 5f04e6470..0e9fb7396 100644 --- a/weed/filer/sqlite/sqlite_store.go +++ b/weed/filer/sqlite/sqlite_store.go @@ -54,7 +54,7 @@ func (store *SqliteStore) initialize(dbFile, createTable, upsertQuery string) (e store.SupportBucketTable = true store.SqlGenerator = &mysql.SqlGenMysql{ CreateTableSqlTemplate: createTable, - DropTableSqlTemplate: "drop table `%s`", + DropTableSqlTemplate: "drop table if exists `%s`", UpsertQueryTemplate: upsertQuery, }