0

我正在尝试通过 plpgsql 函数中的异常来检测错误的 postgres PL/proxy 分片连接。当直接调用函数时,这完全符合预期(尝试访问坏分片会引发异常)。但是,现有代码库通过 RUN ON 语句中的 plproxy 函数间接调用该函数,在这种情况下,访问任何分片(无论好坏)都会引发异常。有没有其他人看到这个和/或有解决方案或解决方法?

这是问题的一个精简示例:

A)FunctionA是一个plproxy函数,它有一行:RUN ON functionB($1, NULL);

B) functionB 是一个 plpgsql 函数,它有一行:SELECT db_index FROM functionC();

C) functionC 也是一个 plpgsql 函数,它有检查连接的代码: FOR db_id IN () LOOP BEGIN PERFORM check_shard(db_id); -- 这只是调用一个在分片上运行的函数 EXCEPTION WHEN internal_error THEN RAISE NOTICE 'CAUGHT EXCEPTION FOR ID %', db_id; 结尾; 结束循环;

当在 SELECT 中直接调用 functionB 或 functionC 时,好的分片不会抛出异常。但是当在 RUN ON 语句中调用函数调用 plproxy functionA 时,所有分片都会抛出异常。因此,导致此问题的 plproxy 函数或 RUN ON 语句似乎发生了一些事情。

任何帮助将不胜感激!

4

1 回答 1

0

这听起来像是 pl/proxy 中的错误。我的建议是你和 skytools 的维护者一起讨论这个问题。我终其一生都看不到任何合乎逻辑的理由为什么这是理想的行为,甚至可能发生。也许某处有东西阻塞?

于 2013-11-16T05:40:08.897 回答