#3595·postal

当两名工人同时运行时, " 程序取消 " 与 " 不知名的表格 " 相撞( " dropp-table " 没有 " IF EXISTS " )

作者: olegbliaher创建于 2026年6月29日更新于 2026年7月8日
标签bug

1. 删除原始表的唯一代码路径是此任务。 remove_raw_tabledrop_table 仅从 remove_raw_tables_older_thanremove_raw_tables_until_less_than_size 中到达(以及 provision/clean,这些仅用于开发/测试)。消息处理从不删除原始表。因此,对同一表的 两次删除 需要 两次对同一数据库的保留任务并发执行

2. drop_table 不是等价的lib/postal/message_db/provisioner.rb:64):

ruby
def drop_table(table_name)
  @database.query("DROP TABLE `#{@database.database_name}`.`#{table_name}`")
end

在表已经消失的情况下,一个简单的 DROP TABLE 会引发 Unknown table,而不是无操作。请注意对称性: 创建 路径已经防御了这种并发 - create_raw_tablelib/postal/message_db/provisioner.rb:83):

ruby
rescue Mysql2::Error => e
  # 不要担心如果表已经存在,另一个线程已经运行了此代码。
  raise unless e.message =~ /already exists/
end

因此,代码库已经预期并发提供程序执行 - create 已受到保护,但 drop 从未收到对称保护。

内容来源: postalserver/postal