Hi,
I don't think there is something to fix. Kannel checks connection
before using it and then try to reconnect if needed.
If your mysql instance is not allowing to connect anymore then kannel
has only 2 options:
1) panic, this is what we doing now
2) try to connect in a loop with some timeout and if reconnect was not
successfull panic.
timeout should not be too big becuase otherwise SMSC will
timeout PDU and try to resend it.
If you would like to fix this somehow then option (2) is to go.
Thanks,
Alex
Am 27.07.2009 um 20:56 schrieb Mathieu Bruneau:
Hi,
Context: We are storing Kannel's dlr in a MySQL database. This
database is used for some other applications as well and we set
wait_timeout=10 (http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout
). Since this is a "global" settings I can't change it for the
Kannel DLR database only. While I could create a separate
installation for the mysql dlr, there is some benefits for me to
keep it together :)
Here's the log of the error happening:
2009-07-27 06:26:31 [3489] [3] ERROR: MYSQL: database check failed!
2009-07-27 06:26:31 [3489] [3] ERROR: MYSQL: Lost connection to
MySQL server during query
2009-07-27 06:26:31 [3489] [3] INFO: MYSQL: Connected to server at
db-XXXX01.
2009-07-27 06:26:31 [3489] [3] INFO: MYSQL: server version
5.0.51a-15~bpo40+1-log, client version 4.1.11.
First, the point I want to confirm :
I see that there is a check method defined as mysql_ping in
dbpool_mysql.c. From what I found, it is only triggered when there
is something happening on the mysql connections.(I'm I correct in
this assumption?) So in my case, if nothing is happening for 10s,
MySQL disconnect us and I have this error logged on the next
activity to use the MySQL connection.
All in all this isn't that much of an issue, however we suffered a
small issue where our database maxed out his connections and while
we expected some stuff to failed, we didn't expect Kannel to died on
us because of it:
2009-07-27 14:40:09 [3489] [3] ERROR: MYSQL: database check failed!
2009-07-27 14:40:09 [3489] [3] ERROR: MYSQL: Lost connection to
MySQL server during query
2009-07-27 14:40:09 [3489] [3] ERROR: MYSQL: can not connect to
database!
2009-07-27 14:40:09 [3489] [3] ERROR: MYSQL: Too many connections
2009-07-27 14:40:10 [3489] [29] PANIC: DBPOOL: Deadlock detected!!!
2009-07-27 14:40:10 [3489] [29] PANIC: /usr/sbin/bearerbox(gw_panic
+0xcc) [0x80cc73c]
2009-07-27 14:40:10 [3489] [29] PANIC: /usr/sbin/
bearerbox(dbpool_conn_consume+0xec) [0x80bf71c]
2009-07-27 14:40:10 [3489] [29] PANIC: /usr/sbin/bearerbox [0x805e59e]
2009-07-27 14:40:10 [3489] [29] PANIC: /usr/sbin/bearerbox [0x805eaf4]
2009-07-27 14:40:10 [3489] [29] PANIC: /usr/sbin/bearerbox(dlr_add
+0x33b) [0x805d95b]
<....>
Since not being able to store the DLR in MySQL crashed Kannel, I
believe some effort should be put so that kannel can maintain the
connection alive correctly. I see 2 possible solutions:
1 - Have a timer that exec the mysql_check every n seconds
(Configurable of course)
2 - Send a set wait_timeout on connection to override the value from
MySQL, however in this case I don't know what we should set it to
since the mysql_ping is based on activity... (Maybe 8h ? since it's
the default MySQL value)
Solution 1 seems the best way to handle it, however solutions 2 may
be easier to implement (Comment on those?)
I may tried one of those change based on the feedback received, so
feel free to let me know your toughts :)
--
Math
aka ROunofF
[email protected]