[Serusers] [Serdev] mysql timeout in ser 2.0

Jan Janak jan at iptel.org
Thu Dec 13 12:50:34 CET 2007


Greger V. Teigre wrote:
> I'm not sure what the conclusion to this thread was.
> SIP: could you verify your mysql version?
> Jan: I haven't seen a ticket on that. Will we say that we don't support
> mysql version >=5.0.3 and <5.0.19?

  No, I will try to fix it in both 2.0 and 2.1

   Jan.

> g-)
> 
> Jan Janak wrote:
>> Some more information:
>>
>> mysql_options(ptr->con, MYSQL_OPT_RECONNECT,(char*)&my_auto_reconnect)
>>
>> is internally implemented as:
>>
>> case MYSQL_OPT_RECONNECT:
>>   mysql->reconnect= *(my_bool *) arg;
>>   break;
>>
>> and that code is already present in 2.0:
>>
>> if (!mysql_real_connect(ptr->con, id->host, id->username, id->password,
>> id->database, id->port, 0, 0)) {
>>         LOG(L_ERR, "new_connection: %s\n", mysql_error(ptr->con));
>>         mysql_close(ptr->con);
>>         goto err;
>>     }
>>
>> /* Enable reconnection explicitly */
>> ptr->con->reconnect = 1;
>>
>> This is the old way of enabling automatic reconnects in mysql but it
>> does the same.
>>
>>    Jan.
>>
>>
>> Andrei Pelinescu-Onciul wrote:
>>  
>>> On Dec 10, 2007 at 07:20, Greger V. Teigre <greger at teigre.com> wrote:
>>>    
>>>> [removed sems and semsdev from cc]
>>>>
>>>>
>>>> SIP wrote:
>>>>      
>>>>>>> Secondary (but no less important) items that are a must-have:
>>>>>>> -MySQL (I'm voting for 5 series here, but that will require my
>>>>>>> patch for the mysql code in SER 2.0)
>>>>>>>                     
>>>>>> why the patch?
>>>>>>  
>>>>>>              
>>>>> MySQL 5.0.X automatically times out its sockets after a hardcoded
>>>>> period of time. Unless you have configured the socket to auto
>>>>> reconnect (see http://www.ideasip.com/support/utils/my_con.c.SER2
>>>>> ), after a little while, the socket will just time out and you will
>>>>> have to restart SER in order to connect to the database (it will
>>>>> throw errors).
>>>>>  
>>>>>         
>>>> I thought that issue was resolved. Can you check the tracker ticket
>>>> and verify that it is scheduled for ser 2.0 release?
>>>>       
>>> It is fixed in a different way in 2.1, but it was not backported to 2.0
>>> (see http://lists.iptel.org/pipermail/serdev/2007-June/010460.html).
>>>
>>> Jan, have you forgotten to backport it or is there some other reason?
>>>
>>> (patch for 2.0  attached)
>>>
>>>
>>> Andrei
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> ? modules/mysql/.db_mod.c.swp
>>> Index: modules/mysql/db_mod.c
>>> ===================================================================
>>> RCS file: /cvsroot/ser/sip_router/modules/mysql/Attic/db_mod.c,v
>>> retrieving revision 1.29
>>> diff -u -r1.29 db_mod.c
>>> --- modules/mysql/db_mod.c    8 Jan 2006 22:43:17 -0000    1.29
>>> +++ modules/mysql/db_mod.c    22 Jun 2007 14:33:02 -0000
>>> @@ -41,6 +41,14 @@
>>>  
>>>  int ping_interval = 5 * 60; /* Default is 5 minutes */
>>>  int auto_reconnect = 1;     /* Default is enabled */
>>> +unsigned int my_connect_to=2; /* 2 s by default */
>>> +unsigned int my_send_to=0; /*  enabled only for mysql >= 5.25  */
>>> +unsigned int my_recv_to=0; /* enabled only for mysql >= 5.25 */
>>> +
>>> +unsigned long my_client_ver=0;
>>> +
>>> +#define DEFAULT_MY_SEND_TO  2   /* s */
>>> +#define DEFAULT_MY_RECV_TO  4   /* s */
>>>  
>>>  static int mysql_mod_init(void);
>>>  
>>> @@ -71,6 +79,9 @@
>>>  static param_export_t params[] = {
>>>      {"ping_interval", PARAM_INT, &ping_interval},
>>>      {"auto_reconnect", PARAM_INT, &auto_reconnect},
>>> +    {"connect_timeout", PARAM_INT, &my_connect_to},
>>> +    {"send_timeout", PARAM_INT, &my_send_to},
>>> +    {"receive_timeout", PARAM_INT, &my_recv_to},
>>>      {0, 0, 0}
>>>  };
>>>  
>>> @@ -90,6 +101,28 @@
>>>  
>>>  static int mysql_mod_init(void)
>>>  {
>>> +#if MYSQL_VERSION_ID >= 40101
>>> +    my_client_ver=mysql_get_client_version();
>>> +    if ((my_client_ver>=50025) || ((my_client_ver >= 40122) &&
>>> +            (my_client_ver < 50000))){
>>> +        if (my_send_to==0)
>>> +            my_send_to= DEFAULT_MY_SEND_TO;
>>> +        if (my_recv_to==0)
>>> +            my_recv_to= DEFAULT_MY_RECV_TO;
>>> +    }else if (my_recv_to || my_send_to){
>>> +        LOG(L_WARN, "WARNING: mysql send or received timeout set, but "
>>> +                " not supported by the installed mysql client library"
>>> +                " (needed at least 4.1.22 or 5.0.25, but installed
>>> %ld)\n",
>>> +                my_client_ver);
>>> +    }
>>> +#else
>>> +    if (my_recv_to || my_send_to){
>>> +        LOG(L_WARN, "WARNING: mysql send or received timeout set, but "
>>> +                " not supported by the mysql client library used to
>>> compile"
>>> +                " the mysql module (needed at least 4.1.1 but "
>>> +                " compiled against %ld)\n", MYSQL_VERSION_ID);
>>> +    }
>>> +#endif
>>>      DBG("mysql: MySQL client version is %s\n",
>>> mysql_get_client_info());
>>>      return 0;
>>>  }
>>> Index: modules/mysql/db_mod.h
>>> ===================================================================
>>> RCS file: /cvsroot/ser/sip_router/modules/mysql/Attic/db_mod.h,v
>>> retrieving revision 1.3
>>> diff -u -r1.3 db_mod.h
>>> --- modules/mysql/db_mod.h    28 Oct 2004 23:36:14 -0000    1.3
>>> +++ modules/mysql/db_mod.h    22 Jun 2007 14:33:02 -0000
>>> @@ -38,5 +38,10 @@
>>>  
>>>  extern int ping_interval;
>>>  extern int auto_reconnect;
>>> +extern unsigned int my_connect_to; /* 2 s by default */
>>> +extern unsigned int my_send_to; /*  enabled only for mysql >= 5.25  */
>>> +extern unsigned int my_recv_to; /* enabled only for mysql >= 5.25 */
>>> +
>>> +extern unsigned long my_client_ver;
>>>  
>>>  #endif /* DB_MOD_H */
>>> Index: modules/mysql/dbase.c
>>> ===================================================================
>>> RCS file: /cvsroot/ser/sip_router/modules/mysql/Attic/dbase.c,v
>>> retrieving revision 1.48.2.1
>>> diff -u -r1.48.2.1 dbase.c
>>> --- modules/mysql/dbase.c    23 Feb 2007 21:19:31 -0000    1.48.2.1
>>> +++ modules/mysql/dbase.c    22 Jun 2007 14:33:02 -0000
>>> @@ -68,7 +68,7 @@
>>>          t = time(0);
>>>          if ((t - CON_TIMESTAMP(_h)) > ping_interval) {
>>>              if (mysql_ping(CON_CONNECTION(_h))) {
>>> -                DBG("submit_query: mysql_ping failed\n");
>>> +                ERR("mysql: submit_query: mysql_ping failed\n");
>>>              }
>>>          }
>>>          CON_TIMESTAMP(_h) = t;
>>> Index: modules/mysql/my_con.c
>>> ===================================================================
>>> RCS file: /cvsroot/ser/sip_router/modules/mysql/my_con.c,v
>>> retrieving revision 1.7
>>> diff -u -r1.7 my_con.c
>>> --- modules/mysql/my_con.c    30 Jan 2006 16:49:51 -0000    1.7
>>> +++ modules/mysql/my_con.c    22 Jun 2007 14:33:02 -0000
>>> @@ -26,6 +26,7 @@
>>>   */
>>>  
>>>  #include "my_con.h"
>>> +#include "db_mod.h"
>>>  #include "../../mem/mem.h"
>>>  #include "../../dprint.h"
>>>  #include "../../ut.h"
>>> @@ -41,6 +42,9 @@
>>>  struct my_con* new_connection(struct db_id* id)
>>>  {
>>>      struct my_con* ptr;
>>> +#if MYSQL_VERSION_ID >= 50013 +    my_bool my_auto_reconnect;
>>> +#endif
>>>  
>>>      if (!id) {
>>>          LOG(L_ERR, "new_connection: Invalid parameter value\n");
>>> @@ -82,6 +86,34 @@
>>>              ZSW(id->database)
>>>              );
>>>      }
>>> +#if MYSQL_VERSION_ID >= 50013 +    my_auto_reconnect=1;
>>> +    if (my_client_ver>=50013){
>>> +        if (mysql_options(ptr->con, MYSQL_OPT_RECONNECT ,
>>> +                    (char*)&my_auto_reconnect))
>>> +                WARN("mysql: failed to set MYSQL_OPT_RECONNECT\n");
>>> +    }
>>> +#endif
>>> +    if (my_connect_to){
>>> +        if (mysql_options(ptr->con, MYSQL_OPT_CONNECT_TIMEOUT,
>>> +                    (char*)&my_connect_to))
>>> +                WARN("mysql: failed to set
>>> MYSQL_OPT_CONNECT_TIMEOUT\n");
>>> +    }
>>> +#if MYSQL_VERSION_ID >= 40101 +    if ((my_client_ver>=50025) ||
>>> ((my_client_ver >= 40122) && +            (my_client_ver < 50000))){
>>> +        if (my_send_to){
>>> +            if (mysql_options(ptr->con, MYSQL_OPT_WRITE_TIMEOUT ,
>>> +                        (char*)&my_send_to))
>>> +                WARN("mysql: failed to set MYSQL_OPT_WRITE_TIMEOUT\n");
>>> +        }
>>> +        if (my_recv_to){
>>> +            if (mysql_options(ptr->con, MYSQL_OPT_READ_TIMEOUT ,
>>> +                        (char*)&my_recv_to))
>>> +                WARN("mysql: failed to set MYSQL_OPT_READ_TIMEOUT\n");
>>> +        }
>>> +    }
>>> +#endif
>>>  
>>>      if (!mysql_real_connect(ptr->con, id->host, id->username,
>>> id->password, id->database, id->port, 0, 0)) {
>>>          LOG(L_ERR, "new_connection: %s\n", mysql_error(ptr->con));
>>>     
>>
>> _______________________________________________
>> Serdev mailing list
>> Serdev at lists.iptel.org
>> http://lists.iptel.org/mailman/listinfo/serdev
>>
>>
>>   
> 




More information about the sr-users mailing list