<p>Hi,<br>
thanks for the responses.<br>
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.<br>
In my case, this is a multi-node homer-installation (as advised here: <a class="issue-link js-issue-link" data-error-text="Failed to load issue title" data-id="265268562" data-permission-text="Issue title is private" data-url="https://github.com/sipcapture/homer/issues/254" data-hovercard-type="issue" data-hovercard-url="/sipcapture/homer/issues/254/hovercard" href="https://github.com/sipcapture/homer/issues/254">sipcapture/homer#254</a> ) - 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.</p>
<p>I'm not experienced in kamailio-development, still I tried to implement that functionality - in <a href="https://github.com/kamailio/kamailio/blob/master/src/modules/sqlops/sqlops.c">https://github.com/kamailio/kamailio/blob/master/src/modules/sqlops/sqlops.c</a> I changed the static int child_init(int rank) to always return 0 (regardless of the return-value of sql_connect() ):</p>
<pre><code> 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;

</code></pre>
<p>The effect was, that kamailio starts even if the database is not reachable (and sql_connect() returns -1):</p>
<pre><code>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]
</code></pre>
<p>However, the module does not "recover" if the database gets reachable afterwards - I still get the error-message<br>
<code>ERROR: <core> [db_query.c:176]: db_do_raw_query(): invalid parameter value</code><br>
for each sql_query in the script.<br>
Can somebod advise my where/when I could trigger the re-connect after the DB comes up again?<br>
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.</p>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br />You are receiving this because you are subscribed to this thread.<br />Reply to this email directly, <a href="https://github.com/kamailio/kamailio/issues/1681#issuecomment-434053799">view it on GitHub</a>, or <a href="https://github.com/notifications/unsubscribe-auth/AF36ZWigPdCPUdKq63FFhaOmRalCvV-jks5up1vpgaJpZM4XvXbj">mute the thread</a>.<img src="https://github.com/notifications/beacon/AF36ZU6VzoqSKJEEIzrrcMpc1hkMaI2uks5up1vpgaJpZM4XvXbj.gif" height="1" width="1" alt="" /></p>
<script type="application/json" data-scope="inboxmarkup">{"api_version":"1.0","publisher":{"api_key":"05dde50f1d1a384dd78767c55493e4bb","name":"GitHub"},"entity":{"external_key":"github/kamailio/kamailio","title":"kamailio/kamailio","subtitle":"GitHub repository","main_image_url":"https://assets-cdn.github.com/images/email/message_cards/header.png","avatar_image_url":"https://assets-cdn.github.com/images/email/message_cards/avatar.png","action":{"name":"Open in GitHub","url":"https://github.com/kamailio/kamailio"}},"updates":{"snippets":[{"icon":"PERSON","message":"@mihovilkolaric in #1681: Hi,\r\nthanks for the responses. \r\nWhile 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.\r\nIn 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.\r\n\r\nI'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() ):\r\n```\r\n static int child_init(int rank)\r\n{\r\n        if (rank==PROC_INIT || rank==PROC_MAIN || rank==PROC_TCP_MAIN)\r\n                return 0;\r\n        int sql_result = sql_connect();\r\n        LM_INFO(\"SQL result: %d \\n\", sql_result);\r\n        return 0;\r\n} \r\n```\r\nThe effect was, that kamailio starts even if the database is not reachable (and sql_connect() returns -1):\r\n```\r\nINFO: sqlops [sqlops.c:156]: child_init(): SQL result: -1\r\nERROR: db_postgres [km_pg_con.c:115]: db_postgres_new_connection(): could not connect to server: Connection refused\r\nERROR: db_postgres [km_pg_con.c:148]: db_postgres_new_connection(): cleaning up 0x7f858b5d6f88=pkg_free()\r\nERROR: \u003ccore\u003e [db.c:318]: db_do_init2(): could not add connection to the pool\r\nERROR: sqlops [sql_api.c:164]: sql_connect(): failed to connect to the database [cb]\r\nINFO: sqlops [sqlops.c:156]: child_init(): SQL result: -1\r\nINFO: ctl [io_listener.c:210]: io_listen_loop(): io_listen_loop: using epoll_lt as the io watch method (auto detected)\r\nERROR: db_postgres [km_pg_con.c:115]: db_postgres_new_connection(): could not connect to server: Connection refused\r\nERROR: db_postgres [km_pg_con.c:148]: db_postgres_new_connection(): cleaning up 0x7f858b5d6f88=pkg_free()\r\nERROR: \u003ccore\u003e [db.c:318]: db_do_init2(): could not add connection to the pool\r\nERROR: sqlops [sql_api.c:164]: sql_connect(): failed to connect to the database [cb]\r\nINFO: sqlops [sqlops.c:156]: child_init(): SQL result: -1\r\nINFO: \u003cscript\u003e: INSERT INTO stats_ip_mem as stats ( method, source_ip, total) VALUES('INVITE', ...\r\nERROR: \u003ccore\u003e [db_query.c:176]: db_do_raw_query(): invalid parameter value\r\nERROR: sqlops [sql_api.c:265]: sql_do_query(): cannot do the query [INSERT INTO stats_ip_mem as stats ( method, source_ip, total) VA]\r\n```\r\n\r\nHowever, the module does not \"recover\" if the database gets reachable afterwards - I still get the error-message\r\n`ERROR: \u003ccore\u003e [db_query.c:176]: db_do_raw_query(): invalid parameter value`\r\nfor each sql_query in the script.\r\nCan somebod advise my where/when I could trigger the re-connect after the DB comes up again?\r\nAs 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."}],"action":{"name":"View Issue","url":"https://github.com/kamailio/kamailio/issues/1681#issuecomment-434053799"}}}</script>
<script type="application/ld+json">[
{
"@context": "http://schema.org",
"@type": "EmailMessage",
"potentialAction": {
"@type": "ViewAction",
"target": "https://github.com/kamailio/kamailio/issues/1681#issuecomment-434053799",
"url": "https://github.com/kamailio/kamailio/issues/1681#issuecomment-434053799",
"name": "View Issue"
},
"description": "View this Issue on GitHub",
"publisher": {
"@type": "Organization",
"name": "GitHub",
"url": "https://github.com"
}
},
{
"@type": "MessageCard",
"@context": "http://schema.org/extensions",
"hideOriginalBody": "false",
"originator": "AF6C5A86-E920-430C-9C59-A73278B5EFEB",
"title": "Re: [kamailio/kamailio] sqlops blocks startup of kamailio if database unreachable (#1681)",
"sections": [
{
"text": "",
"activityTitle": "**mihovilkolaric**",
"activityImage": "https://assets-cdn.github.com/images/email/message_cards/avatar.png",
"activitySubtitle": "@mihovilkolaric",
"facts": [

]
}
],
"potentialAction": [
{
"name": "Add a comment",
"@type": "ActionCard",
"inputs": [
{
"isMultiLine": true,
"@type": "TextInput",
"id": "IssueComment",
"isRequired": false
}
],
"actions": [
{
"name": "Comment",
"@type": "HttpPOST",
"target": "https://api.github.com",
"body": "{\n\"commandName\": \"IssueComment\",\n\"repositoryFullName\": \"kamailio/kamailio\",\n\"issueId\": 1681,\n\"IssueComment\": \"{{IssueComment.value}}\"\n}"
}
]
},
{
"name": "Close issue",
"@type": "HttpPOST",
"target": "https://api.github.com",
"body": "{\n\"commandName\": \"IssueClose\",\n\"repositoryFullName\": \"kamailio/kamailio\",\n\"issueId\": 1681\n}"
},
{
"targets": [
{
"os": "default",
"uri": "https://github.com/kamailio/kamailio/issues/1681#issuecomment-434053799"
}
],
"@type": "OpenUri",
"name": "View on GitHub"
},
{
"name": "Unsubscribe",
"@type": "HttpPOST",
"target": "https://api.github.com",
"body": "{\n\"commandName\": \"MuteNotification\",\n\"threadId\": 398292707\n}"
}
],
"themeColor": "26292E"
}
]</script>