Just commit config transactions if something changed

This commit is contained in:
Philipp 2023-01-04 19:55:22 +01:00
parent aabe39220d
commit dce86be58e
No known key found for this signature in database
GPG key ID: 24A7501396EB5432
3 changed files with 34 additions and 8 deletions

View file

@ -175,35 +175,28 @@ class BaseURL
$currUrl = $this->url; $currUrl = $this->url;
$configTransaction = $this->config->beginTransaction(); $configTransaction = $this->config->beginTransaction();
$savable = false;
if (!empty($hostname) && $hostname !== $this->hostname) { if (!empty($hostname) && $hostname !== $this->hostname) {
$configTransaction->set('config', 'hostname', $hostname); $configTransaction->set('config', 'hostname', $hostname);
$this->hostname = $hostname; $this->hostname = $hostname;
$savable = true;
} }
if (isset($sslPolicy) && $sslPolicy !== $this->sslPolicy) { if (isset($sslPolicy) && $sslPolicy !== $this->sslPolicy) {
$configTransaction->set('system', 'ssl_policy', $sslPolicy); $configTransaction->set('system', 'ssl_policy', $sslPolicy);
$this->sslPolicy = $sslPolicy; $this->sslPolicy = $sslPolicy;
$savable = true;
} }
if (isset($urlPath) && $urlPath !== $this->urlPath) { if (isset($urlPath) && $urlPath !== $this->urlPath) {
$configTransaction->set('system', 'urlpath', $urlPath); $configTransaction->set('system', 'urlpath', $urlPath);
$this->urlPath = $urlPath; $this->urlPath = $urlPath;
$savable = true;
} }
$this->determineBaseUrl(); $this->determineBaseUrl();
if ($this->url !== $currUrl) { if ($this->url !== $currUrl) {
$configTransaction->set('system', 'url', $this->url); $configTransaction->set('system', 'url', $this->url);
$savable = true;
} }
if ($savable) { $configTransaction->commit();
$configTransaction->commit();
}
return true; return true;
} }

View file

@ -37,6 +37,8 @@ class ConfigTransaction implements ISetConfigValuesTransactionally
protected $cache; protected $cache;
/** @var Cache */ /** @var Cache */
protected $delCache; protected $delCache;
/** @var bool field to check if something is to save */
protected $changedConfig = false;
public function __construct(IManageConfigValues $config) public function __construct(IManageConfigValues $config)
{ {
@ -70,6 +72,7 @@ class ConfigTransaction implements ISetConfigValuesTransactionally
public function set(string $cat, string $key, $value): ISetConfigValuesTransactionally public function set(string $cat, string $key, $value): ISetConfigValuesTransactionally
{ {
$this->cache->set($cat, $key, $value, Cache::SOURCE_DATA); $this->cache->set($cat, $key, $value, Cache::SOURCE_DATA);
$this->changedConfig = true;
return $this; return $this;
} }
@ -80,6 +83,7 @@ class ConfigTransaction implements ISetConfigValuesTransactionally
{ {
$this->cache->delete($cat, $key); $this->cache->delete($cat, $key);
$this->delCache->set($cat, $key, 'deleted'); $this->delCache->set($cat, $key, 'deleted');
$this->changedConfig = true;
return $this; return $this;
} }
@ -87,6 +91,11 @@ class ConfigTransaction implements ISetConfigValuesTransactionally
/** {@inheritDoc} */ /** {@inheritDoc} */
public function commit(): void public function commit(): void
{ {
// If nothing changed, just do nothing :)
if (!$this->changedConfig) {
return;
}
try { try {
$newCache = $this->config->getCache()->merge($this->cache); $newCache = $this->config->getCache()->merge($this->cache);
$newCache = $newCache->diff($this->delCache); $newCache = $newCache->diff($this->delCache);

View file

@ -9,6 +9,7 @@ use Friendica\Core\Config\Util\ConfigFileManager;
use Friendica\Core\Config\ValueObject\Cache; use Friendica\Core\Config\ValueObject\Cache;
use Friendica\Test\MockedTest; use Friendica\Test\MockedTest;
use Friendica\Test\Util\VFSTrait; use Friendica\Test\Util\VFSTrait;
use Mockery\Exception\InvalidCountException;
class ConfigTransactionTest extends MockedTest class ConfigTransactionTest extends MockedTest
{ {
@ -108,4 +109,27 @@ class ConfigTransactionTest extends MockedTest
// the whole category should be gone // the whole category should be gone
self::assertNull($tempData['delete'] ?? null); self::assertNull($tempData['delete'] ?? null);
} }
/**
* This test asserts that in empty transactions, no saveData is called, thus no config file writing was performed
*/
public function testNothingToDo()
{
$this->configFileManager = \Mockery::spy(ConfigFileManager::class);
$config = new Config($this->configFileManager, new Cache());
$configTransaction = new ConfigTransaction($config);
// commit empty transaction
$configTransaction->commit();
try {
$this->configFileManager->shouldNotHaveReceived('saveData');
} catch (InvalidCountException $exception) {
self::fail($exception);
}
// If not failed, the test ends successfully :)
self::assertTrue(true);
}
} }