Patch for Bug 608032 - MySQL timeout and no attempt reconnect
Geert Janssens
janssens-geert at telenet.be
Thu Feb 4 16:26:25 EST 2010
On Thursday 4 February 2010, Tom Van Braeckel wrote:
> > On Thursday 4 February 2010, Tom Van Braeckel wrote:
> > > Hi guys,
> > >
> > > Here's another patch - my first *code* patch to GnuCash !
> > >
> > > Rationale: When we try to open a database transaction, and the database
> > > reports that the "server has gone away", we try to reconnect before
> >
> > failing
> >
> > > hard.
> >
> > Hi,
> >
> > Thanks you for your patch. It looks like a good start, but to my limited
> > knowledge of the sql backend, it seems incomplete.
> >
> > Here are my thoughts on the patch:
> > * you test for an error by comparing with a string. I think it would
> > probably
> > be safer and definitely be more efficient to simply test for the error
> > number
> > returned by dbi_conn_error. It's possible that the error strings returned
> > by
> > MySQL are translated into other languages on other systems, so your
> > string wouldn't always match.
>
> Thanks for the feedback !
> You're right - I've corrected this in the attached patch and cleaned it up
> a bit - hope you like it :-)
>
> Note that such string-based error checking is also done in other places
> (such as the "mysql_error_fn" function in gnc-backend-dbi.c), perhaps I'll
> rectify that in a future patch.
>
Hmm, after giving it some more thought, I think I know why Phil used the
string in the first place: MySQL is not the only database supported by dbi.
Error code 2006 in MySQL may mean something different in SQLite or Postgresql.
So using the number only, we risk that a Postgres user gets unexpected
behavior if he hits a 2006 error.
I find your reference to mysql_error_fn very interesting. This is the function
that is called whenever something goes wrong when accessing the database, and
it is specific to mysql. I wonder if you can't reuse this function instead to
handle the reconnection.
> > * what happens if not only the connection had timed out, but something
> > else changed as well (an administrator changed the login password for
> > example) ? I
> > mean you don't check the results of dbi_connect or the second
> > dbi_conn_queryf.
>
> Good question. When that happens, GnuCash will behave as it did before
> ("Could not save..." error). There's room for improvement there (such as
> asking for the new login password) but I feel like that's a different
> issue.
>
I suppose that's acceptable.
> > * I also think there may be more useful places to check for a connection
> > timeout, not only at the beginning of transactions. I found several
> > occurences
> > of dbi_conn_query and dbi_conn_queryf some of which could be called
> > passed a
> > timeout.
>
> Well, normally these timeouts have high values (8 hours in a default MySQL
> installation). Since a database query normally begins with a "begin
> transaction" (as it should) and a transaction is typically very short
> lived, I don't think the connection will ever time out between "begin
> transaction" and an actual statement. Unless I'm missing something...
>
IMHO this is a wrong assumption. Queries that WRITE to the db (update, insert,
create table,...) should all be enclosed in a transaction. But queries that
simply read data (SELECT) should not per se. So there's at least one other
place where a timeout should be tested for.
Just looking in the code, I find functions such as
conn_execute_select_statement/conn_execute_nonselect_statement which perform
database actions and are not tested for server is gone errors.
Geert
> > As said in the beginning, I'm not the dbi expert, so maybe my comments
> > are off
> > mark or plain silly.
> >
> > > I've also attached it to the bug report, and taken the liberty to add
> > > myself to the AUTHORS file.
> > > I hope that's customary here, and I apologise if it's not...
> >
> > I think this is quite ok. I would just like to ask you to put your name
> > in alpabetical order which I think would put you between Richard
> > -Gilligan- Uschold and Matthew Vanecek.
>
> Done :-)
>
> > > Thanks again for this great software,
> >
> > Keep submitting patches !
> >
> > > Tom Van Braeckel
> > > GSM: 0032 (0) 486 63 58 04
> >
> > Geert
> > _______________________________________________
> > gnucash-devel mailing list
> > gnucash-devel at gnucash.org
> > https://lists.gnucash.org/mailman/listinfo/gnucash-devel
>
More information about the gnucash-devel
mailing list