[sr-dev] [kamailio/kamailio] sqlops blocks startup of kamailio if database unreachable (#1681)

mihovilkolaric notifications at github.com
Mon Oct 29 20:50:01 CET 2018


Hi,
thanks for the responses. 
While I agree that the default behavior makes fully sense for most (or nearly all) modules, still there are usecases where a more tolerant handling would be nice.
In my case, this is a multi-node homer-installation (as advised here: https://github.com/sipcapture/homer/issues/254 ) - the kamailio (used as sipcapture-server) uses a local sipcapture database, but all nodes share the same statistics database (accessed by sqlops) - in case the statistics-DB is not reachable temporarily during startup, I'd rather keep the sipcapture DB (and lose the statistics) than blocking startup of kamailio and losing both.

I'm not experienced in kamailio-development, still I tried to implement that functionality - in https://github.com/kamailio/kamailio/blob/master/src/modules/sqlops/sqlops.c I changed the static int child_init(int rank) to always return 0 (regardless of the return-value of sql_connect() ):
```
 static int child_init(int rank)
{
        if (rank==PROC_INIT || rank==PROC_MAIN || rank==PROC_TCP_MAIN)
                return 0;
        int sql_result = sql_connect();
        LM_INFO("SQL result: %d \n", sql_result);
        return 0;
} 
```
The effect was, that kamailio starts even if the database is not reachable (and sql_connect() returns -1):
```
INFO: sqlops [sqlops.c:156]: child_init(): SQL result: -1
ERROR: db_postgres [km_pg_con.c:115]: db_postgres_new_connection(): could not connect to server: Connection refused
ERROR: db_postgres [km_pg_con.c:148]: db_postgres_new_connection(): cleaning up 0x7f858b5d6f88=pkg_free()
ERROR: <core> [db.c:318]: db_do_init2(): could not add connection to the pool
ERROR: sqlops [sql_api.c:164]: sql_connect(): failed to connect to the database [cb]
INFO: sqlops [sqlops.c:156]: child_init(): SQL result: -1
INFO: ctl [io_listener.c:210]: io_listen_loop(): io_listen_loop: using epoll_lt as the io watch method (auto detected)
ERROR: db_postgres [km_pg_con.c:115]: db_postgres_new_connection(): could not connect to server: Connection refused
ERROR: db_postgres [km_pg_con.c:148]: db_postgres_new_connection(): cleaning up 0x7f858b5d6f88=pkg_free()
ERROR: <core> [db.c:318]: db_do_init2(): could not add connection to the pool
ERROR: sqlops [sql_api.c:164]: sql_connect(): failed to connect to the database [cb]
INFO: sqlops [sqlops.c:156]: child_init(): SQL result: -1
INFO: <script>: INSERT INTO stats_ip_mem as stats ( method, source_ip, total) VALUES('INVITE', ...
ERROR: <core> [db_query.c:176]: db_do_raw_query(): invalid parameter value
ERROR: sqlops [sql_api.c:265]: sql_do_query(): cannot do the query [INSERT INTO stats_ip_mem as stats ( method, source_ip, total) VA]
```

However, the module does not "recover" if the database gets reachable afterwards - I still get the error-message
`ERROR: <core> [db_query.c:176]: db_do_raw_query(): invalid parameter value`
for each sql_query in the script.
Can somebod advise my where/when I could trigger the re-connect after the DB comes up again?
As sqlops does that properly for DB-outages after a successful sql_connect(), I hoped it would work also in this case - but it seems that this case needs separate handling.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/kamailio/kamailio/issues/1681#issuecomment-434053799
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.kamailio.org/pipermail/sr-dev/attachments/20181029/c923a158/attachment-0001.html>


More information about the sr-dev mailing list