Re: PATCH: pgagent fix for 'Caught unhandled unknown exception; terminating' bug in SQL steps

From: Ashesh Vashi <ashesh(dot)vashi(at)enterprisedb(dot)com>
To: Thomas Krennwallner <tk+pgsql(at)postsubmeta(dot)net>
Cc: pgadmin-hackers <pgadmin-hackers(at)postgresql(dot)org>
Subject: Re: PATCH: pgagent fix for 'Caught unhandled unknown exception; terminating' bug in SQL steps
Date: 2015-03-31 12:45:59
Message-ID: CAG7mmoxXzJAxu1CBbHHyfZB5Qbxmd3qcxghHQKf75AuYT6NqtA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgadmin-hackers

On Thu, Mar 26, 2015 at 6:19 PM, Thomas Krennwallner <
tk+pgsql(at)postsubmeta(dot)net> wrote:

> Hi!
>
> Running pgagent 3.4.0 on Debian jessie with an SQL jobstep crashes the
> worker thread with the error message
>
> Caught unhandled unknown exception; terminating
>
> Both job and jobstep status then remain as 'r' (running) until the
> pgagent process quits. After restarting pgagent, which cleans up the
> job status and sets it to 'd' (aborted), the job containing the SQL
> jobstep is free to run again, but the next run will end up in the same
> deadlock situation.
>
> I have tracked down the problem to DBconn::GetLastError(), which gets
> called after each SQL jobstep execution in Job::Execute(): there,
> DBconn::GetLastError() throws an exception whenever the last error
> message is empty.
>
> The attached patch fixes this problem by adding missing bounds checks
> to DBconn::GetLastError().
>
Thanks for the patch.
But - I was thinking about another fix for the same.
I used the wxString::Trim(trimRight=true) function in order to remove the
white-spaces from the right side.

Dave,

*diff --git a/connection.cpp b/connection.cppindex 6103c00..ccbb5c7
100644--- a/connection.cpp+++ b/connection.cpp@@ -314,14 +314,7 @@ int
DBconn::ExecuteVoid(const wxString &query) wxString
DBconn::GetLastError() { // Return the last error message, minus any
trailing line ends- if (lastError.substr(lastError.length() - 2, 2)
== wxT("\r\n")) // DOS- return lastError.substr(0,
lastError.length() - 2);- else if
(lastError.substr(lastError.length() - 1, 1) == wxT("\n")) //
Unix- return lastError.substr(0, lastError.length() -
1);- else if (lastError.substr(lastError.length() - 1, 1) ==
wxT("\r")) // Mac- return lastError.substr(0,
lastError.length() - 1);- else- return
lastError;+ return lastError.Trim(true); }*

Do you think - above diff make sense?
If yes - I will commit the code.

--

Thanks & Regards,

Ashesh Vashi
EnterpriseDB INDIA: Enterprise PostgreSQL Company
<http://www.enterprisedb.com>

*http://www.linkedin.com/in/asheshvashi*
<http://www.linkedin.com/in/asheshvashi>

>
> Here is a log of pgagent with an SQL jobstep:
>
> $ pgagent -l 2 -f hostaddr=127.0.0.1 port=5432 dbname=pgdb user=pgdb
> DEBUG: Creating primary connection
> DEBUG: Connection Information:
> DEBUG: user : pgdb
> DEBUG: port : 5432
> DEBUG: host : 127.0.0.1
> DEBUG: dbname : pgdb
> DEBUG: password :
> DEBUG: conn timeout : 0
> DEBUG: Connection Information:
> DEBUG: user : pgdb
> DEBUG: port : 5432
> DEBUG: host : 127.0.0.1
> DEBUG: dbname : pgdb
> DEBUG: password :
> DEBUG: conn timeout : 0
> DEBUG: Creating DB connection: user=pgdb port=5432 hostaddr=127.0.0.1
> dbname=pgdb
> DEBUG: Database sanity check
> DEBUG: Clearing zombies
> DEBUG: Checking for jobs to run
> DEBUG: Sleeping...
> DEBUG: Clearing inactive connections
> DEBUG: Connection stats: total - 1, free - 0, deleted - 0
> DEBUG: Checking for jobs to run
> DEBUG: Sleeping...
> [...]
> DEBUG: Clearing inactive connections
> DEBUG: Connection stats: total - 1, free - 0, deleted - 0
> DEBUG: Checking for jobs to run
> DEBUG: Sleeping...
> DEBUG: Connection stats: total - 1, free - 0, deleted - 0
> DEBUG: Checking for jobs to run
> DEBUG: Creating job thread for job 5
> DEBUG: Creating DB connection: user=pgdb port=5432 hostaddr=127.0.0.1
> dbname=pgdb
> DEBUG: Allocating new connection to database pgdb
> DEBUG: Starting job: 5
> DEBUG: Sleeping...
> DEBUG: Creating DB connection: user=pgdb port=5432 hostaddr=127.0.0.1
> dbname=pgdb dbname=pgdb
> DEBUG: Allocating new connection to database pgdb
> DEBUG: Executing SQL step 40 (part of job 5)
> *** Caught unhandled unknown exception; terminating
> DEBUG: Destroying job thread for job 5
> DEBUG: Checking for jobs to run
> DEBUG: Sleeping...
> DEBUG: Clearing inactive connections
> DEBUG: Connection stats: total - 3, free - 0, deleted - 0
> DEBUG: Checking for jobs to run
> DEBUG: Sleeping...
> DEBUG: Clearing inactive connections
> DEBUG: Connection stats: total - 3, free - 0, deleted - 0
> DEBUG: Checking for jobs to run
> DEBUG: Sleeping...
> [...]
>
>
> --
> Sent via pgadmin-hackers mailing list (pgadmin-hackers(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgadmin-hackers
>
>

In response to

Responses

Browse pgadmin-hackers by date

  From Date Subject
Next Message Dave Page 2015-03-31 12:50:13 Re: PATCH: pgagent fix for 'Caught unhandled unknown exception; terminating' bug in SQL steps
Previous Message Dave Page 2015-03-27 15:54:01 Re: PATCH: pgagent fix for 'Caught unhandled unknown exception; terminating' bug in SQL steps