diff options
author | Julius Härtl <jus@bitgrid.net> | 2020-02-04 22:34:29 +0300 |
---|---|---|
committer | Backportbot <backportbot-noreply@rullzer.com> | 2020-02-05 11:35:12 +0300 |
commit | b754f6b75d704359d239b2ac8d63ee1cc83ba5c1 (patch) | |
tree | b7c1209dd07dba5debe313c6d0ad7eb502c8de09 | |
parent | 3c8f887d2bf60cd0bed86478df56111bcf51960d (diff) |
Use ILockingProvider
Signed-off-by: Julius Härtl <jus@bitgrid.net>
-rw-r--r-- | lib/Service/DocumentService.php | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/lib/Service/DocumentService.php b/lib/Service/DocumentService.php index d2b9bfcb0..467dc4c80 100644 --- a/lib/Service/DocumentService.php +++ b/lib/Service/DocumentService.php @@ -29,6 +29,7 @@ use \InvalidArgumentException; use OCA\Text\Db\Session; use OCP\DirectEditing\IManager; use OCP\IRequest; +use OCP\Lock\ILockingProvider; use function json_encode; use OC\Files\Node\File; use OCA\Text\Db\Document; @@ -97,7 +98,7 @@ class DocumentService { */ private $appData; - public function __construct(DocumentMapper $documentMapper, StepMapper $stepMapper, IAppData $appData, $userId, IRootFolder $rootFolder, ICacheFactory $cacheFactory, ILogger $logger, ShareManager $shareManager, IRequest $request, IManager $directManager) { + public function __construct(DocumentMapper $documentMapper, StepMapper $stepMapper, IAppData $appData, $userId, IRootFolder $rootFolder, ICacheFactory $cacheFactory, ILogger $logger, ShareManager $shareManager, IRequest $request, IManager $directManager, ILockingProvider $lockingProvider) { $this->documentMapper = $documentMapper; $this->stepMapper = $stepMapper; $this->userId = $userId; @@ -106,6 +107,7 @@ class DocumentService { $this->cache = $cacheFactory->createDistributed('text'); $this->logger = $logger; $this->shareManager = $shareManager; + $this->lockingProvider = $lockingProvider; try { $this->appData->getFolder('documents'); } catch (NotFoundException $e) { @@ -192,10 +194,11 @@ class DocumentService { $document = null; $oldVersion = null; - if ($this->cache->get('document-push-lock-' . $documentId)) { + try { + $this->lockingProvider->acquireLock('document-push-lock-' . $documentId, ILockingProvider::LOCK_EXCLUSIVE); + } catch (LockedException $e) { throw new VersionMismatchException('Version does not match'); } - $this->cache->set('document-save-lock-' . $documentId, true, 10); try { $document = $this->documentMapper->find($documentId); @@ -223,23 +226,21 @@ class DocumentService { $step->setDocumentId($documentId); $step->setVersion($version + 1); $this->stepMapper->insert($step); - // TODO restore old version for document if adding steps has failed // TODO write steps to cache for quicker reading - $this->cache->remove('document-push-lock-' . $documentId); + $this->lockingProvider->releaseLock('document-push-lock-' . $documentId, ILockingProvider::LOCK_EXCLUSIVE); return $steps; } catch (DoesNotExistException $e) { - $this->cache->remove('document-push-lock-' . $documentId); + $this->lockingProvider->releaseLock('document-push-lock-' . $documentId, ILockingProvider::LOCK_EXCLUSIVE); throw $e; } catch (\Throwable $e) { if ($document !== null && $oldVersion !== null) { - $this->logger->error('This should never happen. An error occured when storing the version, trying to recover the last stable one'); - $this->logger->logException($e); + $this->logger->logException($e, ['message' => 'This should never happen. An error occured when storing the version, trying to recover the last stable one']); $document->setCurrentVersion($oldVersion); $this->documentMapper->update($document); $this->cache->set('document-version-' . $document->getId(), $oldVersion); $this->stepMapper->deleteAfterVersion($documentId, $oldVersion); } - $this->cache->remove('document-push-lock-' . $documentId); + $this->lockingProvider->releaseLock('document-push-lock-' . $documentId, ILockingProvider::LOCK_EXCLUSIVE); throw $e; } } |