in index.js [977:1070]
function runPgCommand(clusterInfo, client, command, retries, retryableErrorTraps, retryBackoffBaseMs, callback) {
var completed = false;
var retryCount = 0;
var lastError;
async.until(function (test_cb) {
test_cb(null, completed || !retries || retryCount >= retries);
}, function (asyncCallback) {
logger.debug("Performing Database Command:");
logger.debug(command);
client.query(command, function (queryCommandErr, result) {
if (queryCommandErr) {
lastError = queryCommandErr;
// check all the included retryable error traps to see if
// this is a retryable error
var retryable = false;
if (retryableErrorTraps) {
retryableErrorTraps.map(function (retryableError) {
if (queryCommandErr.detail && queryCommandErr.detail.indexOf(retryableError) > -1) {
retryable = true;
}
});
}
// if the error is not retryable, then fail by calling the
// async callback with the specified error
if (!retryable) {
completed = true;
if (queryCommandErr && queryCommandErr.detail) {
logger.error(queryCommandErr.detail);
}
asyncCallback(queryCommandErr);
} else {
// incre ment the retry count
retryCount += 1;
logger.warn("Retryable Error detected. Try Attempt " + retryCount);
// exponential backoff
// if a backoff time is
// provided
if (retryBackoffBaseMs) {
setTimeout(function () {
// call the async callback
asyncCallback(null);
}, Math.pow(2, retryCount) * retryBackoffBaseMs);
}
}
} else {
completed = true;
asyncCallback(queryCommandErr);
}
});
}, function (afterQueryCompletedErr) {
// close the server connection
client.end((disconnectErr) => {
if (disconnectErr) {
logger.error("Error during server disconnect: " + disconnectErr.stack);
logger.error("Watch for database connection count increasing without limit!!!");
}
/*
* check the status of the query completion, but don't worry
* about disconnection errors here. we can't fix them, and
* hopefully the server will just close them effectively :/
*/
if (afterQueryCompletedErr) {
// callback as error
callback(null, {
status: ERROR,
error: afterQueryCompletedErr,
cluster: clusterInfo.clusterEndpoint.S
});
} else {
if (!completed) {
// we were unable to complete the command
callback(null, {
status: ERROR,
error: lastError,
cluster: clusterInfo.clusterEndpoint.S
});
} else {
// command ok
callback(null, {
status: OK,
error: null,
cluster: clusterInfo.clusterEndpoint.S
});
}
}
});
});
};