aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules/extra/m_pgsql.cpp
diff options
context:
space:
mode:
authorGravatar Sadie Powell2020-04-23 13:24:26 +0100
committerGravatar Sadie Powell2020-04-24 11:48:45 +0100
commit6f6fa13042f319bcd56ceed112c0a969337e4161 (patch)
treee7c3eb95e43784eda7be513f7a236b5dc0a84410 /src/modules/extra/m_pgsql.cpp
parentRelease v2.0.28. (diff)
downloadinspircd++-6f6fa13042f319bcd56ceed112c0a969337e4161.tar.gz
inspircd++-6f6fa13042f319bcd56ceed112c0a969337e4161.tar.bz2
inspircd++-6f6fa13042f319bcd56ceed112c0a969337e4161.zip
Opt-out of pgsql read and write events if polling fails.
Diffstat (limited to 'src/modules/extra/m_pgsql.cpp')
-rw-r--r--src/modules/extra/m_pgsql.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/modules/extra/m_pgsql.cpp b/src/modules/extra/m_pgsql.cpp
index ac247548a..3838f2b5c 100644
--- a/src/modules/extra/m_pgsql.cpp
+++ b/src/modules/extra/m_pgsql.cpp
@@ -51,8 +51,9 @@ typedef std::map<std::string, SQLConn*> ConnMap;
* WWRITE, Connected/Working and wants write event
* RREAD, Resetting and wants read event
* RWRITE, Resetting and wants write event
+ * DEAD, The connection has died
*/
-enum SQLstatus { CREAD, CWRITE, WREAD, WWRITE, RREAD, RWRITE };
+enum SQLstatus { CREAD, CWRITE, WREAD, WWRITE, RREAD, RWRITE, DEAD };
class ReconnectTimer : public Timer
{
@@ -265,6 +266,8 @@ class SQLConn : public SQLProvider, public EventHandler
status = CREAD;
return true;
case PGRES_POLLING_FAILED:
+ ServerInstance->SE->ChangeEventMask(this, FD_WANT_NO_READ | FD_WANT_NO_WRITE);
+ status = DEAD;
return false;
case PGRES_POLLING_OK:
ServerInstance->SE->ChangeEventMask(this, FD_WANT_POLL_READ | FD_WANT_NO_WRITE);
@@ -380,7 +383,7 @@ restart:
{
DoResetPoll();
}
- else
+ else if (status == WREAD || status == WWRITE)
{
DoConnectedPoll();
}
@@ -488,6 +491,7 @@ restart:
void Close()
{
+ status = DEAD;
ServerInstance->SE->DelFd(this);
if(sql)
@@ -606,6 +610,7 @@ void ReconnectTimer::Tick(time_t time)
void SQLConn::DelayReconnect()
{
+ status = DEAD;
ModulePgSQL* mod = (ModulePgSQL*)(Module*)creator;
ConnMap::iterator it = mod->connections.find(conf->getString("id"));
if (it != mod->connections.end())