only allow a single concurrent dav write to a file
Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
parent
642ebea490
commit
187acecff7
|
@ -28,6 +28,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\DAV\Connector\Sabre;
|
||||
|
||||
use OC\Files\View;
|
||||
|
@ -147,8 +148,16 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node
|
|||
$info = new \OC\Files\FileInfo($path, null, null, [], null);
|
||||
}
|
||||
$node = new \OCA\DAV\Connector\Sabre\File($this->fileView, $info);
|
||||
|
||||
// only allow 1 process to upload a file at once but still allow reading the file while writing the part file
|
||||
$node->acquireLock(ILockingProvider::LOCK_SHARED);
|
||||
return $node->put($data);
|
||||
$this->fileView->lockFile($path . '.upload.part', ILockingProvider::LOCK_EXCLUSIVE);
|
||||
|
||||
$result = $node->put($data);
|
||||
|
||||
$this->fileView->unlockFile($path . '.upload.part', ILockingProvider::LOCK_EXCLUSIVE);
|
||||
$node->releaseLock(ILockingProvider::LOCK_SHARED);
|
||||
return $result;
|
||||
} catch (\OCP\Files\StorageNotAvailableException $e) {
|
||||
throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage(), $e->getCode(), $e);
|
||||
} catch (InvalidPathException $ex) {
|
||||
|
|
Loading…
Reference in New Issue