mirror of
https://github.com/nextcloud/server.git
synced 2026-04-22 14:50:17 -04:00
fix: make failed availability check apply in the same request
Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
parent
a9c9379993
commit
8b3f4da52f
2 changed files with 35 additions and 4 deletions
|
|
@ -22,6 +22,7 @@ class Availability extends Wrapper {
|
|||
|
||||
/** @var IConfig */
|
||||
protected $config;
|
||||
protected ?bool $available = null;
|
||||
|
||||
public function __construct(array $parameters) {
|
||||
$this->config = $parameters['config'] ?? \OCP\Server::get(IConfig::class);
|
||||
|
|
@ -54,11 +55,14 @@ class Availability extends Wrapper {
|
|||
}
|
||||
|
||||
private function isAvailable(): bool {
|
||||
$availability = $this->getAvailability();
|
||||
if (self::shouldRecheck($availability)) {
|
||||
return $this->updateAvailability();
|
||||
if (is_null($this->available)) {
|
||||
$availability = $this->getAvailability();
|
||||
if (self::shouldRecheck($availability)) {
|
||||
return $this->updateAvailability();
|
||||
}
|
||||
$this->available = $availability['available'];
|
||||
}
|
||||
return $availability['available'];
|
||||
return $this->available;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -257,6 +261,7 @@ class Availability extends Wrapper {
|
|||
self::RECHECK_TTL_SEC
|
||||
);
|
||||
}
|
||||
$this->available = false;
|
||||
$this->getStorageCache()->setAvailability(false, $delay);
|
||||
if ($e !== null) {
|
||||
throw $e;
|
||||
|
|
|
|||
|
|
@ -155,4 +155,30 @@ class AvailabilityTest extends \Test\TestCase {
|
|||
|
||||
$this->wrapper->mkdir('foobar');
|
||||
}
|
||||
|
||||
public function testUnavailableMultiple(): void {
|
||||
$this->storage->expects($this->once())
|
||||
->method('getAvailability')
|
||||
->willReturn(['available' => true, 'last_checked' => 0]);
|
||||
$this->storage->expects($this->never())
|
||||
->method('test');
|
||||
$this->storage
|
||||
->expects($this->once()) // load-bearing `once`
|
||||
->method('mkdir')
|
||||
->willThrowException(new StorageNotAvailableException());
|
||||
|
||||
try {
|
||||
$this->wrapper->mkdir('foobar');
|
||||
$this->fail();
|
||||
} catch (StorageNotAvailableException) {
|
||||
}
|
||||
|
||||
$this->storage->expects($this->never())->method('file_exists');
|
||||
|
||||
try {
|
||||
$this->wrapper->mkdir('foobar');
|
||||
$this->fail();
|
||||
} catch (StorageNotAvailableException) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue