Skip to content

Commit 4721ffc

Browse files
committed
improved sql insert errors handling
1 parent 95fc9c3 commit 4721ffc

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

src/InfoLoggerDispatchSQL.cxx

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "InfoLoggerDispatch.h"
1313
#include <mysql.h>
1414
#include <mysqld_error.h>
15+
#include <errmsg.h>
1516
#include "utility.h"
1617
#include "infoLoggerMessage.h"
1718
#include <unistd.h>
@@ -61,6 +62,9 @@ class InfoLoggerDispatchSQLImpl
6162
int commitTimeout = 1000000; // time between commits
6263
Timer commitTimer; // timer for transaction
6364
int commitNumberOfMsg; // number of messages since last commit
65+
66+
int numberOfSuccessiveFailures = 0; // count consecutive insert failures
67+
int maxNumberOfRetries = 1; // number of retries allowed
6468
};
6569

6670
void InfoLoggerDispatchSQLImpl::start()
@@ -393,9 +397,22 @@ int InfoLoggerDispatchSQLImpl::customMessageProcess(std::shared_ptr<InfoLoggerMe
393397
if ( err == ER_TRUNCATED_WRONG_VALUE_FOR_FIELD) {
394398
return returnDroppedMessage(msg, m);
395399
}
396-
// retry with new connection - usually it means server was down
397-
disconnectDB();
398-
return returnDelayedMessage();
400+
// server gone - retry with new connection
401+
if (( err == CR_SERVER_LOST ) || ( err == CR_SERVER_GONE_ERROR )) {
402+
disconnectDB();
403+
return returnDelayedMessage();
404+
}
405+
406+
numberOfSuccessiveFailures++;
407+
if (numberOfSuccessiveFailures <= maxNumberOfRetries) {
408+
disconnectDB();
409+
return returnDelayedMessage();
410+
}
411+
numberOfSuccessiveFailures = 0;
412+
413+
// by default: drop message
414+
parent->logError("Unhandled error code %d after %d attempts", mysql_errno(db), maxNumberOfRetries);
415+
return returnDroppedMessage(msg, m);
399416
}
400417

401418
insertCount++;

0 commit comments

Comments
 (0)