Esempio n. 1
0
	/**
	 * Lock the files at the given storage paths in the backend.
	 * This will either lock all the files or none (on failure).
	 * On failure, the status object will be updated with errors.
	 *
	 * Once the return value goes out scope, the locks will be released and
	 * the status updated. Unlock fatals will not change the status "OK" value.
	 *
	 * @see ScopedLock::factory()
	 *
	 * @param array $paths List of storage paths or map of lock types to path lists
	 * @param integer|string $type LockManager::LOCK_* constant or "mixed"
	 * @param Status $status Status to update on lock/unlock
	 * @return ScopedLock|null Returns null on failure
	 */
	final public function getScopedFileLocks( array $paths, $type, Status $status ) {
		if ( $type === 'mixed' ) {
			foreach ( $paths as &$typePaths ) {
				$typePaths = array_map( 'FileBackend::normalizeStoragePath', $typePaths );
			}
		} else {
			$paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
		}
		return ScopedLock::factory( $this->lockManager, $paths, $type, $status );
	}
Esempio n. 2
0
 private function doTestLockCalls()
 {
     $backendName = $this->backendClass();
     $paths = array("test1.txt", "test2.txt", "test3.txt", "subdir1", "subdir1", "subdir1/test1.txt", "subdir1/test2.txt", "subdir2", "subdir2", "subdir2/test3.txt", "subdir2/test4.txt", "subdir2/subdir", "subdir2/subdir/test1.txt", "subdir2/subdir/test2.txt", "subdir2/subdir/test3.txt", "subdir2/subdir/test4.txt", "subdir2/subdir/test5.txt", "subdir2/subdir/sub", "subdir2/subdir/sub/test0.txt", "subdir2/subdir/sub/120-px-file.txt");
     for ($i = 0; $i < 25; $i++) {
         $status = $this->backend->lockFiles($paths, LockManager::LOCK_EX);
         $this->assertEquals(print_r(array(), true), print_r($status->errors, true), "Locking of files succeeded ({$backendName}) ({$i}).");
         $this->assertEquals(true, $status->isOK(), "Locking of files succeeded with OK status ({$backendName}) ({$i}).");
         $status = $this->backend->lockFiles($paths, LockManager::LOCK_SH);
         $this->assertEquals(print_r(array(), true), print_r($status->errors, true), "Locking of files succeeded ({$backendName}) ({$i}).");
         $this->assertEquals(true, $status->isOK(), "Locking of files succeeded with OK status ({$backendName}) ({$i}).");
         $status = $this->backend->unlockFiles($paths, LockManager::LOCK_SH);
         $this->assertEquals(print_r(array(), true), print_r($status->errors, true), "Locking of files succeeded ({$backendName}) ({$i}).");
         $this->assertEquals(true, $status->isOK(), "Locking of files succeeded with OK status ({$backendName}) ({$i}).");
         $status = $this->backend->unlockFiles($paths, LockManager::LOCK_EX);
         $this->assertEquals(print_r(array(), true), print_r($status->errors, true), "Locking of files succeeded ({$backendName}). ({$i})");
         $this->assertEquals(true, $status->isOK(), "Locking of files succeeded with OK status ({$backendName}) ({$i}).");
         ## Flip the acquire/release ordering around ##
         $status = $this->backend->lockFiles($paths, LockManager::LOCK_SH);
         $this->assertEquals(print_r(array(), true), print_r($status->errors, true), "Locking of files succeeded ({$backendName}) ({$i}).");
         $this->assertEquals(true, $status->isOK(), "Locking of files succeeded with OK status ({$backendName}) ({$i}).");
         $status = $this->backend->lockFiles($paths, LockManager::LOCK_EX);
         $this->assertEquals(print_r(array(), true), print_r($status->errors, true), "Locking of files succeeded ({$backendName}) ({$i}).");
         $this->assertEquals(true, $status->isOK(), "Locking of files succeeded with OK status ({$backendName}) ({$i}).");
         $status = $this->backend->unlockFiles($paths, LockManager::LOCK_EX);
         $this->assertEquals(print_r(array(), true), print_r($status->errors, true), "Locking of files succeeded ({$backendName}). ({$i})");
         $this->assertEquals(true, $status->isOK(), "Locking of files succeeded with OK status ({$backendName}) ({$i}).");
         $status = $this->backend->unlockFiles($paths, LockManager::LOCK_SH);
         $this->assertEquals(print_r(array(), true), print_r($status->errors, true), "Locking of files succeeded ({$backendName}) ({$i}).");
         $this->assertEquals(true, $status->isOK(), "Locking of files succeeded with OK status ({$backendName}) ({$i}).");
     }
     $status = Status::newGood();
     $sl = $this->backend->getScopedFileLocks($paths, LockManager::LOCK_EX, $status);
     $this->assertType('ScopedLock', $sl, "Scoped locking of files succeeded ({$backendName}).");
     $this->assertEquals(array(), $status->errors, "Scoped locking of files succeeded ({$backendName}).");
     $this->assertEquals(true, $status->isOK(), "Scoped locking of files succeeded with OK status ({$backendName}).");
     ScopedLock::release($sl);
     $this->assertEquals(null, $sl, "Scoped unlocking of files succeeded ({$backendName}).");
     $this->assertEquals(array(), $status->errors, "Scoped unlocking of files succeeded ({$backendName}).");
     $this->assertEquals(true, $status->isOK(), "Scoped unlocking of files succeeded with OK status ({$backendName}).");
 }
 public function getScopedLock($virtualKey)
 {
     $status = Status::newGood();
     return ScopedLock::factory($this->lockMgr, array($virtualKey), LockManager::LOCK_EX, $status);
 }
Esempio n. 4
0
 /**
  * Lock the files at the given storage paths in the backend.
  * This will either lock all the files or none (on failure).
  * On failure, the status object will be updated with errors.
  *
  * Once the return value goes out scope, the locks will be released and
  * the status updated. Unlock fatals will not change the status "OK" value.
  *
  * @param $paths Array Storage paths
  * @param $type integer LockManager::LOCK_* constant
  * @param $status Status Status to update on lock/unlock
  * @return ScopedLock|null Returns null on failure
  */
 public final function getScopedFileLocks(array $paths, $type, Status $status)
 {
     return ScopedLock::factory($this->lockManager, $paths, $type, $status);
 }