Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/text.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJulius Härtl <jus@bitgrid.net>2019-06-26 15:04:43 +0300
committerJulius Härtl <jus@bitgrid.net>2019-06-26 15:04:43 +0300
commitc9a87cc9bb15d927c1f9d26f40f8e9eeecf2ad73 (patch)
treea95e9f57f60a785eaa6f91e817401d6c18e23586 /lib
parent0b0ed6bf23960abffb4213f995cf16b64db6a256 (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.php11
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;
}