diff options
author | Julius Härtl <jus@bitgrid.net> | 2019-06-26 15:04:43 +0300 |
---|---|---|
committer | Julius Härtl <jus@bitgrid.net> | 2019-06-26 15:04:43 +0300 |
commit | c9a87cc9bb15d927c1f9d26f40f8e9eeecf2ad73 (patch) | |
tree | a95e9f57f60a785eaa6f91e817401d6c18e23586 /lib | |
parent | 0b0ed6bf23960abffb4213f995cf16b64db6a256 (diff) |
Make autosave exclusive and avoid conflict during save
Signed-off-by: Julius Härtl <jus@bitgrid.net>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Service/DocumentService.php | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/Service/DocumentService.php b/lib/Service/DocumentService.php index 611ee1c68..f2784da5c 100644 --- a/lib/Service/DocumentService.php +++ b/lib/Service/DocumentService.php @@ -241,6 +241,7 @@ class DocumentService { return $document; } + $savedEtag = $file->getEtag(); $lastMTime = $document->getLastSavedVersionTime(); if ($autoaveDocument === null) { @@ -254,9 +255,14 @@ class DocumentService { if ($file->getMTime() === $lastMTime && $lastMTime > time() - self::AUTOSAVE_MINIMUM_DELAY && $manualSave === false) { return $document; } - if ($lastMTime > 0 && $file->getEtag() !== $document->getLastSavedVersionEtag() && $force === false) { - throw new DocumentSaveConflictException('File changed in the meantime from outside'); + if ($lastMTime > 0 && $savedEtag !== $document->getLastSavedVersionEtag() && $force === false) { + if (!$this->cache->get('document-save-lock-' . $documentId)) { + throw new DocumentSaveConflictException('File changed in the meantime from outside'); + } else { + return $document; + } } + $this->cache->set('document-save-lock-' . $documentId, true, 10); try { $file->putContent($autoaveDocument); } catch (LockedException $e) { @@ -267,6 +273,7 @@ class DocumentService { $document->setLastSavedVersionTime(time()); $document->setLastSavedVersionEtag($file->getEtag()); $this->documentMapper->update($document); + $this->cache->remove('document-save-lock-' . $documentId); return $document; } |