Selaa lähdekoodia

perf(ILockManager): Allow registering a lock provider lazy

Signed-off-by: Julius Härtl <jus@bitgrid.net>
pull/44953/head
Julius Härtl 1 kuukausi sitten
vanhempi
commit
ff3fc85d10

+ 33
- 8
lib/private/Files/Lock/LockManager.php Näytä tiedosto

use OCP\Files\Lock\ILockProvider; use OCP\Files\Lock\ILockProvider;
use OCP\Files\Lock\LockContext; use OCP\Files\Lock\LockContext;
use OCP\PreConditionNotMetException; use OCP\PreConditionNotMetException;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;


class LockManager implements ILockManager { class LockManager implements ILockManager {
private ?string $lockProviderClass = null;
private ?ILockProvider $lockProvider = null; private ?ILockProvider $lockProvider = null;
private ?LockContext $lockInScope = null; private ?LockContext $lockInScope = null;


$this->lockProvider = $lockProvider; $this->lockProvider = $lockProvider;
} }


public function registerLazyLockProvider(string $lockProviderClass): void {
if ($this->lockProviderClass || $this->lockProvider) {
throw new PreConditionNotMetException('There is already a registered lock provider');
}

$this->lockProviderClass = $lockProviderClass;
}

private function getLockProvider(): ?ILockProvider {
if ($this->lockProvider) {
return $this->lockProvider;
}
if ($this->lockProviderClass) {
try {
$this->lockProvider = \OCP\Server::get($this->lockProviderClass);
} catch (NotFoundExceptionInterface|ContainerExceptionInterface $e) {
}
}

return $this->lockProvider;
}

public function isLockProviderAvailable(): bool { public function isLockProviderAvailable(): bool {
return $this->lockProvider !== null;
return $this->getLockProvider() !== null;
} }


public function runInScope(LockContext $lock, callable $callback): void { public function runInScope(LockContext $lock, callable $callback): void {
if (!$this->lockProvider) {
if (!$this->getLockProvider()) {
$callback(); $callback();
return; return;
} }
} }


public function getLocks(int $fileId): array { public function getLocks(int $fileId): array {
if (!$this->lockProvider) {
if (!$this->getLockProvider()) {
throw new PreConditionNotMetException('No lock provider available'); throw new PreConditionNotMetException('No lock provider available');
} }


return $this->lockProvider->getLocks($fileId);
return $this->getLockProvider()->getLocks($fileId);
} }


public function lock(LockContext $lockInfo): ILock { public function lock(LockContext $lockInfo): ILock {
if (!$this->lockProvider) {
if (!$this->getLockProvider()) {
throw new PreConditionNotMetException('No lock provider available'); throw new PreConditionNotMetException('No lock provider available');
} }


return $this->lockProvider->lock($lockInfo);
return $this->getLockProvider()->lock($lockInfo);
} }


public function unlock(LockContext $lockInfo): void { public function unlock(LockContext $lockInfo): void {
if (!$this->lockProvider) {
if (!$this->getLockProvider()) {
throw new PreConditionNotMetException('No lock provider available'); throw new PreConditionNotMetException('No lock provider available');
} }


$this->lockProvider->unlock($lockInfo);
$this->getLockProvider()->unlock($lockInfo);
} }
} }

+ 8
- 0
lib/public/Files/Lock/ILockManager.php Näytä tiedosto

/** /**
* @throws PreConditionNotMetException if there is already a lock provider registered * @throws PreConditionNotMetException if there is already a lock provider registered
* @since 24.0.0 * @since 24.0.0
* @deprecated 30.0.0 Use registerLazyLockProvider
*/ */
public function registerLockProvider(ILockProvider $lockProvider): void; public function registerLockProvider(ILockProvider $lockProvider): void;


/**
* @param string $lockProviderClass
* @return void
* @since 30.0.0
*/
public function registerLazyLockProvider(string $lockProviderClass): void;

/** /**
* @return bool * @return bool
* @since 24.0.0 * @since 24.0.0

Loading…
Peruuta
Tallenna