Skip to content

Commit

Permalink
Merge pull request #42929 from nextcloud/fix/db/transacted-read-not-d…
Browse files Browse the repository at this point in the history
…irty

fix(db): Do not log transacted reads as dirty read
  • Loading branch information
ChristophWurst authored Jan 23, 2024
2 parents 9bce24b + f54b08c commit 033a654
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions lib/private/DB/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -265,13 +265,16 @@ public function prepare($sql, $limit = null, $offset = null): Statement {
*/
public function executeQuery(string $sql, array $params = [], $types = [], QueryCacheProfile $qcp = null): Result {
$tables = $this->getQueriedTables($sql);
if (count(array_intersect($this->tableDirtyWrites, $tables)) === 0 && !$this->isTransactionActive()) {
if ($this->isTransactionActive()) {
// Transacted queries go to the primary. The consistency of the primary guarantees that we can not run
// into a dirty read.
} elseif (count(array_intersect($this->tableDirtyWrites, $tables)) === 0) {
// No tables read that could have been written already in the same request and no transaction active
// so we can switch back to the replica for reading as long as no writes happen that switch back to the primary
// We cannot log here as this would log too early in the server boot process
$this->ensureConnectedToReplica();
} else {
// Read to a table that was previously written to
// Read to a table that has been written to previously
// While this might not necessarily mean that we did a read after write it is an indication for a code path to check
$this->logger->debug('dirty table reads: ' . $sql, ['tables' => $this->tableDirtyWrites, 'reads' => $tables, 'exception' => new \Exception()]);
}
Expand Down

0 comments on commit 033a654

Please sign in to comment.