aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArthur Schiwon <blizzz@arthur-schiwon.de>2024-08-29 21:06:11 +0200
committerGitHub <noreply@github.com>2024-08-29 21:06:11 +0200
commit59ba0554ef89e115493a1bc11707caded1d7dcca (patch)
treef281483308e8b6efd14ebf1f754c6a2334e6a094
parent0b5c424f3a8a9ae73248e7ddd7efe6cc37db830f (diff)
parent656412daa422533ddc09e7b97bbb00ca3a3042e3 (diff)
downloadnextcloud-server-59ba0554ef89e115493a1bc11707caded1d7dcca.tar.gz
nextcloud-server-59ba0554ef89e115493a1bc11707caded1d7dcca.zip
Merge pull request #47612 from nextcloud/backport/47611/stable30
[stable30] fix(DB): set sharding parameters only when intended
-rw-r--r--lib/private/DB/Connection.php32
-rw-r--r--lib/private/DB/ConnectionFactory.php15
-rw-r--r--tests/lib/DB/QueryBuilder/Partitioned/PartitionedQueryBuilderTest.php3
-rw-r--r--tests/lib/DB/QueryBuilder/Sharded/SharedQueryBuilderTest.php3
-rw-r--r--version.php2
5 files changed, 36 insertions, 19 deletions
diff --git a/lib/private/DB/Connection.php b/lib/private/DB/Connection.php
index 1b724179f06..adcae868bd3 100644
--- a/lib/private/DB/Connection.php
+++ b/lib/private/DB/Connection.php
@@ -91,6 +91,7 @@ class Connection extends PrimaryReadReplicaConnection {
protected array $shards = [];
protected ShardConnectionManager $shardConnectionManager;
protected AutoIncrementHandler $autoIncrementHandler;
+ protected bool $isShardingEnabled;
public const SHARD_PRESETS = [
'filecache' => [
@@ -130,14 +131,17 @@ class Connection extends PrimaryReadReplicaConnection {
parent::__construct($params, $driver, $config, $eventManager);
$this->adapter = new $params['adapter']($this);
$this->tablePrefix = $params['tablePrefix'];
-
- /** @psalm-suppress InvalidArrayOffset */
- $this->shardConnectionManager = $this->params['shard_connection_manager'] ?? Server::get(ShardConnectionManager::class);
- /** @psalm-suppress InvalidArrayOffset */
- $this->autoIncrementHandler = $this->params['auto_increment_handler'] ?? new AutoIncrementHandler(
- Server::get(ICacheFactory::class),
- $this->shardConnectionManager,
- );
+ $this->isShardingEnabled = isset($this->params['sharding']) && !empty($this->params['sharding']);
+
+ if ($this->isShardingEnabled) {
+ /** @psalm-suppress InvalidArrayOffset */
+ $this->shardConnectionManager = $this->params['shard_connection_manager'] ?? Server::get(ShardConnectionManager::class);
+ /** @psalm-suppress InvalidArrayOffset */
+ $this->autoIncrementHandler = $this->params['auto_increment_handler'] ?? new AutoIncrementHandler(
+ Server::get(ICacheFactory::class),
+ $this->shardConnectionManager,
+ );
+ }
$this->systemConfig = \OC::$server->getSystemConfig();
$this->clock = Server::get(ClockInterface::class);
$this->logger = Server::get(LoggerInterface::class);
@@ -192,10 +196,12 @@ class Connection extends PrimaryReadReplicaConnection {
*/
public function getShardConnections(): array {
$connections = [];
- foreach ($this->shards as $shardDefinition) {
- foreach ($shardDefinition->getAllShards() as $shard) {
- /** @var ConnectionAdapter $connection */
- $connections[] = $this->shardConnectionManager->getConnection($shardDefinition, $shard);
+ if ($this->isShardingEnabled) {
+ foreach ($this->shards as $shardDefinition) {
+ foreach ($shardDefinition->getAllShards() as $shard) {
+ /** @var ConnectionAdapter $connection */
+ $connections[] = $this->shardConnectionManager->getConnection($shardDefinition, $shard);
+ }
}
}
return $connections;
@@ -255,7 +261,7 @@ class Connection extends PrimaryReadReplicaConnection {
$this->systemConfig,
$this->logger
);
- if (count($this->partitions) > 0) {
+ if ($this->isShardingEnabled && count($this->partitions) > 0) {
$builder = new PartitionedQueryBuilder(
$builder,
$this->shards,
diff --git a/lib/private/DB/ConnectionFactory.php b/lib/private/DB/ConnectionFactory.php
index d8764f07753..03a7a4f8444 100644
--- a/lib/private/DB/ConnectionFactory.php
+++ b/lib/private/DB/ConnectionFactory.php
@@ -225,11 +225,16 @@ class ConnectionFactory {
}
$connectionParams['sharding'] = $this->config->getValue('dbsharding', []);
- $connectionParams['shard_connection_manager'] = $this->shardConnectionManager;
- $connectionParams['auto_increment_handler'] = new AutoIncrementHandler(
- $this->cacheFactory,
- $this->shardConnectionManager,
- );
+ if (!empty($connectionParams['sharding'])) {
+ $connectionParams['shard_connection_manager'] = $this->shardConnectionManager;
+ $connectionParams['auto_increment_handler'] = new AutoIncrementHandler(
+ $this->cacheFactory,
+ $this->shardConnectionManager,
+ );
+ } else {
+ // just in case only the presence could lead to funny behaviour
+ unset($connectionParams['sharding']);
+ }
$connectionParams = array_merge($connectionParams, $additionalConnectionParams);
diff --git a/tests/lib/DB/QueryBuilder/Partitioned/PartitionedQueryBuilderTest.php b/tests/lib/DB/QueryBuilder/Partitioned/PartitionedQueryBuilderTest.php
index 0397ce68776..12ba74fe89f 100644
--- a/tests/lib/DB/QueryBuilder/Partitioned/PartitionedQueryBuilderTest.php
+++ b/tests/lib/DB/QueryBuilder/Partitioned/PartitionedQueryBuilderTest.php
@@ -26,6 +26,9 @@ class PartitionedQueryBuilderTest extends TestCase {
private AutoIncrementHandler $autoIncrementHandler;
protected function setUp(): void {
+ if (PHP_INT_SIZE < 8) {
+ $this->markTestSkipped('Test requires 64bit');
+ }
$this->connection = Server::get(IDBConnection::class);
$this->shardConnectionManager = Server::get(ShardConnectionManager::class);
$this->autoIncrementHandler = Server::get(AutoIncrementHandler::class);
diff --git a/tests/lib/DB/QueryBuilder/Sharded/SharedQueryBuilderTest.php b/tests/lib/DB/QueryBuilder/Sharded/SharedQueryBuilderTest.php
index 7af93bbbe59..8f95c1b6263 100644
--- a/tests/lib/DB/QueryBuilder/Sharded/SharedQueryBuilderTest.php
+++ b/tests/lib/DB/QueryBuilder/Sharded/SharedQueryBuilderTest.php
@@ -27,6 +27,9 @@ class SharedQueryBuilderTest extends TestCase {
private AutoIncrementHandler $autoIncrementHandler;
protected function setUp(): void {
+ if (PHP_INT_SIZE < 8) {
+ $this->markTestSkipped('Test requires 64bit');
+ }
$this->connection = Server::get(IDBConnection::class);
$this->autoIncrementHandler = Server::get(AutoIncrementHandler::class);
}
diff --git a/version.php b/version.php
index b0aee7c7ee0..0d26e5bbbef 100644
--- a/version.php
+++ b/version.php
@@ -9,7 +9,7 @@
// between betas, final and RCs. This is _not_ the public version number. Reset minor/patch level
// when updating major/minor version number.
-$OC_Version = [30, 0, 0, 10];
+$OC_Version = [30, 0, 0, 11];
// The human-readable string
$OC_VersionString = '30.0.0 RC2';