Merge pull request #13739 from nextcloud/cache-cleanup-change
cleanup shared lock if changing to exclusive lock failed
This commit is contained in:
commit
90e985fe4f
|
@ -1137,7 +1137,13 @@ class View {
|
||||||
list($storage, $internalPath) = Filesystem::resolvePath($absolutePath . $postFix);
|
list($storage, $internalPath) = Filesystem::resolvePath($absolutePath . $postFix);
|
||||||
if ($run and $storage) {
|
if ($run and $storage) {
|
||||||
if (in_array('write', $hooks) || in_array('delete', $hooks)) {
|
if (in_array('write', $hooks) || in_array('delete', $hooks)) {
|
||||||
$this->changeLock($path, ILockingProvider::LOCK_EXCLUSIVE);
|
try {
|
||||||
|
$this->changeLock($path, ILockingProvider::LOCK_EXCLUSIVE);
|
||||||
|
} catch (LockedException $e) {
|
||||||
|
// release the shared lock we acquired before quiting
|
||||||
|
$this->unlockFile($path, ILockingProvider::LOCK_SHARED);
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if (!is_null($extraParam)) {
|
if (!is_null($extraParam)) {
|
||||||
|
|
|
@ -1997,6 +1997,37 @@ class ViewTest extends \Test\TestCase {
|
||||||
$this->assertNull($this->getFileLockType($view, $path), 'File got unlocked after exception');
|
$this->assertNull($this->getFileLockType($view, $path), 'File got unlocked after exception');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testLockBasicOperationUnlocksAfterLockException() {
|
||||||
|
$view = new View('/' . $this->user . '/files/');
|
||||||
|
|
||||||
|
$storage = new Temporary([]);
|
||||||
|
|
||||||
|
Filesystem::mount($storage, array(), $this->user . '/');
|
||||||
|
|
||||||
|
$storage->mkdir('files');
|
||||||
|
$storage->mkdir('files/dir');
|
||||||
|
$storage->file_put_contents('files/test.txt', 'blah');
|
||||||
|
$storage->getScanner()->scan('files');
|
||||||
|
|
||||||
|
// get a shared lock
|
||||||
|
$handle = $view->fopen('test.txt', 'r');
|
||||||
|
|
||||||
|
$thrown = false;
|
||||||
|
try {
|
||||||
|
// try (and fail) to get a write lock
|
||||||
|
$view->unlink('test.txt');
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$thrown = true;
|
||||||
|
$this->assertInstanceOf(LockedException::class, $e);
|
||||||
|
}
|
||||||
|
$this->assertTrue($thrown, 'Exception was rethrown');
|
||||||
|
|
||||||
|
// clean shared lock
|
||||||
|
fclose($handle);
|
||||||
|
|
||||||
|
$this->assertNull($this->getFileLockType($view, 'test.txt'), 'File got unlocked');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test locks for fopen with fclose at the end
|
* Test locks for fopen with fclose at the end
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue