Skip to content

Commit

Permalink
fix: Add reconnect check in case of timeouts on the db side
Browse files Browse the repository at this point in the history
Signed-off-by: Julius Härtl <jus@bitgrid.net>
  • Loading branch information
juliusknorr committed Jan 12, 2024
1 parent 48628b9 commit c919c78
Showing 1 changed file with 19 additions and 0 deletions.
19 changes: 19 additions & 0 deletions lib/private/DB/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
use Doctrine\DBAL\Connections\PrimaryReadReplicaConnection;
use Doctrine\DBAL\Driver;
use Doctrine\DBAL\Exception;
use Doctrine\DBAL\Exception\ConnectionLost;
use Doctrine\DBAL\Platforms\MySQLPlatform;
use Doctrine\DBAL\Platforms\OraclePlatform;
use Doctrine\DBAL\Platforms\SqlitePlatform;
Expand Down Expand Up @@ -78,6 +79,7 @@ class Connection extends PrimaryReadReplicaConnection {

/** @var DbDataCollector|null */
protected $dbDataCollector = null;
private array $lastConnectionCheck = [];

protected ?float $transactionActiveSince = null;

Expand Down Expand Up @@ -127,10 +129,13 @@ public function __construct(
public function connect($connectionName = null) {
try {
if ($this->_conn) {
$this->reconnectIfNeeded($connectionName);
/** @psalm-suppress InternalMethod */
return parent::connect();
}

$this->lastConnectionCheck[$connectionName] = time();

// Only trigger the event logger for the initial connect call
$eventLogger = \OC::$server->get(IEventLogger::class);
$eventLogger->start('connect:db', 'db connection opened');
Expand Down Expand Up @@ -679,4 +684,18 @@ public function rollBack() {
}
return $result;
}

private function reconnectIfNeeded(string $connectionName): void {
if ($this->lastConnectionCheck[$connectionName] + 30 >= time() || $this->isTransactionActive()) {
return;
}

try {
$this->_conn->query($this->getDriver()->getDatabasePlatform()->getDummySelectSQL());
$this->lastConnectionCheck[$connectionName] = time();
} catch (ConnectionLost|\Exception $e) {
$this->logger->warning('Exception during connectivity check, closing and reconnecting', ['exception' => $e]);
$this->close();
}
}
}

0 comments on commit c919c78

Please sign in to comment.