def test_non_blocking_read_during_write(self): with locks.locked_open(self.file_path, locks.M_WRITE): with self.assertRaises(IOError): with locks.locked_open(self.file_path, locks.M_READ, blocking=False): pass
def test_read_write(self): _write(self.file_path, self.test_data) with locks.locked_open(self.file_path, locks.M_READWRITE) as f: data = f.read().swapcase() f.seek(0) f.write(data) self.assertEqual(self.test_data.swapcase(), _read(self.file_path))
def get_namespace_version(namespace): """Get version of a namespace. Args: namespace (str): Namespace itself. Returns: Namespace version as an integer if it exists, otherwise None. """ validate_namespace(namespace) path = _get_ns_version_file_path(namespace) if not os.path.isfile(path): return None with locks.locked_open(path) as f: try: cont = f.read() return int(cont.decode(ENCODING_ASCII)) except ValueError as e: raise RuntimeError("Failed to get version of namespace. Error: %s" % e)
def invalidate_namespace(namespace): """Invalidates specified namespace. Invalidation is done by incrementing version of the namespace Args: namespace: Namespace that needs to be invalidated. Returns: New version number. """ validate_namespace(namespace) current_version = get_namespace_version(namespace) if current_version is None: # namespace isn't initialized new_version = 1 else: new_version = current_version + 1 with locks.locked_open(_get_ns_version_file_path(namespace), mode=locks.M_WRITE) as f: f.write(str(new_version).encode(ENCODING_ASCII)) return new_version
def get_namespace_version(namespace): """Get version of a namespace. Args: namespace (str): Namespace itself. Returns: Namespace version as an integer if it exists, otherwise None. """ validate_namespace(namespace) path = _get_ns_version_file_path(namespace) if not os.path.isfile(path): return None with locks.locked_open(path) as f: try: cont = f.read() return int(cont.decode(ENCODING_ASCII)) except ValueError as e: raise RuntimeError( "Failed to get version of namespace. Error: %s" % e)
def func_other(self): with self.assertRaises(IOError): with locks.locked_open(self.file_path, locks.M_WRITE, blocking=False): pass
def func_blocker(self): with locks.locked_open(self.file_path, locks.M_READ): while True: pass
def test_concurrent_read(self): _write(self.file_path, self.test_data) with locks.locked_open(self.file_path, locks.M_READ) as f1: with locks.locked_open(self.file_path, locks.M_READ) as f2: self.assertEqual(self.test_data, f1.read()) self.assertEqual(self.test_data, f2.read())
def test_read(self): _write(self.file_path, self.test_data) with locks.locked_open(self.file_path, locks.M_READWRITE) as f: self.assertEqual(self.test_data, f.read())
def test_non_blocking_write_during_read(self): _write(self.file_path, self.test_data) with locks.locked_open(self.file_path, locks.M_READ): with self.assertRaises(IOError): with locks.locked_open(self.file_path, locks.M_WRITE, blocking=False): pass
def test_write(self): with locks.locked_open(self.file_path, locks.M_WRITE) as f: f.write(self.test_data) self.assertEqual(self.test_data, _read(self.file_path))