AssertLog instead of Assert in some places
От | Ashutosh Bapat |
---|---|
Тема | AssertLog instead of Assert in some places |
Дата | |
Msg-id | CAExHW5uy8YduhHqfh_3JTb8_E1LfEJAgrayOA1ogJOw49KHabw@mail.gmail.com обсуждение исходный текст |
Ответы |
Re: AssertLog instead of Assert in some places
|
Список | pgsql-hackers |
Hi All, PostgreSQL code uses Assert() as a way to 1. document the assumption or conditions which must be true at a given place in code 2. make sure that some bug elsewhere does not break these assumptions or rules 3. conditions which can not be (easily) induced by user actions E.g. following conditions in adjust_appendrel_attrs() /* If there's nothing to adjust, don't call this function. */ Assert(nappinfos >= 1 && appinfos != NULL); /* Should never be translating a Query tree. */ Assert(node == NULL || !IsA(node, Query)); These conditions do not make it to non-assert builds and thus do not make it to the production binary. That saves some CPU cycles. When an Assert fails, and it fails quite a lot for developers, the Postgres backend that caused the Assert is Aborted, restarting the server. So a developer testing code that caused the Assert has to start a psql again, run any session setup before running the faulting query, gdb needs to be reattached to the new backend process. That's some waste of time and frustration, esp. when the Assert does not damage the backend itself e.g. by corrupting memory. Most of the Asserts are recoverable by rolling back the transaction without crashing the backend. So an elog(ERROR, ) is enough. But just by themselves elogs are compiled into non-debug binary and the condition check can waste CPU cycles esp. conditions are mostly true like the ones we use in Assert. Attached patch combines Assert and elog(ERROR, ) so that when an Assert is triggered in assert-enabled binary, it will throw an error while keeping the backend intact. Thus it does not affect gdb session or psql session. These elogs do not make their way to non-assert binary so do not make it to production like Assert. I have been using AssertLog for my work for some time. It is quite convenient. With AssertLog I get ``` #explain (summary on) select * from a, b, c where a.c1 = b.c1 and b.c1 = c.c1 and a.c2 < b.c2 and a.c3 + b.c3 < c.c3; ERROR: failed Assert("equal(child_rinfo, adjust_appendrel_attrs(root, (Node *) rinfo, nappinfos, appinfos))"), File: "relnode.c", Line: 997, PID: 568088 ``` instead of ``` #explain (summary on) select * from a, b, c where a.c1 = b.c1 and b.c1 = c.c1 and a.c2 < b.c2 and a.c3 + b.c3 < c.c3; server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. The connection to the server was lost. Attempting reset: Failed. The connection to the server was lost. Attempting reset: Failed. @!#\q ``` If there is an interest in accepting the patch, I will add it to the commitfest and work on it further. -- Best Wishes, Ashutosh Bapat
Вложения
В списке pgsql-hackers по дате отправления: