YugabyteDB YSQL 出现 "Already present: Duplicate request" 个错误

Getting "Already present: Duplicate request" errors in YugabyteDB YSQL

[用户在 YugabyteDB Community Slack 上发布的问题]

在 YSQL 层发送大量并发请求,我们收到 Already present: Duplicate request, XX000 错误。这些重试安全吗?

以下是正在进行的可重试案例列表:

  • 如果您在交易过程中得到 Duplicate Request,那么可以安全地重试。

  • 如果Duplicate Request是由独立语句生成的,那么它 可能执行了原始语句并将其应用于数据库。 所以安全取决于查询和应用。

  • Catalog Version Mismatch — 这实际上是一个 txn 冲突,但特别是与 DDL。已经存在更改错误代码的问题:https://github.com/yugabyte/yugabyte-db/issues/8597.

  • 带有 Try Again 前缀的任何错误 — 但这些可能在内部已经是 re-mapped/retried。

  • Leader not ready to serve requests.Leader does not have a valid lease. 也可以重试。

  • TimedOut 请求在某些情况下也可以重试(例如纯读取和事务块中的操作),但对于单行写入不安全。

通常,对于非 XX000 错误代码,适用与普通 Postgres 相同的规则。 (例如 40001 是可重试的——我们应该已经将 YB transaction errorsread restart required 错误映射到该错误代码。

对于 XX000(内部错误),有一些特定错误应该可以安全重试。

我们已经在内部将一些错误重新映射到 YSQL/PG 错误代码(如上所述),通常我们的目标是适当地做到这一点。

内部错误代码的完整列表位于:https://github.com/yugabyte/yugabyte-db/blob/master/src/yb/util/status.h#L149