Ejemplo n.º 1
0
def lock_cleanup_slave(lock_dir, lock_id, pidfile):
    os.closerange(0, resource.RLIMIT_NOFILE)
    pid = os.fork()
    if pid == 0:
        l = Lock(lock_dir, lock_id)
        l.acquire()
        with open(pidfile, "w") as f:
            f.write(str(os.getpid()) + "\n")
        while True:
            time.sleep(1)
    else:
        sys.exit(0)
Ejemplo n.º 2
0
 def test_lock_cleanup(self):
     l = Lock(self.dir, "id1")
     pidfile = os.path.join(self.dir, "cleanup.pid")
     subprocess.check_call([sys.executable, __file__, "--slave", self.dir, "id1", pidfile], shell=False)
     while True:
         logger.debug("Checking for pidfile %s" % pidfile)
         if os.path.exists(pidfile):
             with open(pidfile, "r") as f:
                 d = f.read()
                 if d.endswith("\n"):
                     pid = int(d.rstrip())
                     break
         time.sleep(1)
     os.kill(pid, 9)
     logger.debug("Attempting to acquire lock %s requiring cleanup of process %d" % (l.path, pid))
     l.acquire()  # can only get after slave process exits
Ejemplo n.º 3
0
def lock_getter1(lock_dir, lock_id, qs2m, qm2s):
    l = Lock(lock_dir, lock_id)
    got_lock = l.acquire_if_available()
    qs2m.put(got_lock)
    l.acquire()
    qs2m.put(True)
    d = qm2s.get()
    l.release()
Ejemplo n.º 4
0
 def __init__(self, hash_funct, encrypt_factory, window, client=True):
     self.source_name = self.SSVName("SSV Stub name")
     self.hash = hash_funct
     self.encrypt = encrypt_factory
     self.window = window
     self.local = client  # True for client, False for server
     self.ssv_len = hash_funct().digest_size
     self.ssvs = collections.deque()
     self.ssv_seq = 0  # This basically counts the number of SET_SSV calls
     self.lock = Lock("ssv")
     # Per draft 26:
     # "Before SET_SSV is called the first time on a client ID,
     # the SSV is zero"
     self._add_ssv('\0' * self.ssv_len)
Ejemplo n.º 5
0
 def __init__(self, file):
     self.lock = lock = Lock("StateLock_%i" % file.id)
     self.file = file
     self.types = (ShareState(file, lock), ByteState(file, lock),
                   DelegState(file, lock), LayoutState(file, lock),
                   AnonState(file, lock))
     # Pass through the following attributes
     self.anon0 = self.types[ANON][(0,)]
     self.anon1 = self.types[ANON][(1,)]
     self.add_share = self.types[SHARE].add_share
     self.recall_conflicting_delegations = \
         self.types[DELEG].recall_conflicting_delegations
     self.grant_delegation = self.types[DELEG].grant_delegation
     self._create_lockowner = self.types[BYTE]._create_lockowner
     #self.delegreturn = self.types[DELEG].delegreturn
     self.grant_layout = self.types[LAYOUT].grant_layout
Ejemplo n.º 6
0
 def test_multiproc1(self):
     l = Lock(self.dir, "id1")
     l.acquire()
     qs2m = Queue()
     qm2s = Queue()
     p = Process(target=lock_getter1, args=(self.dir, "id1", qs2m, qm2s))
     p.start()
     r = qs2m.get()
     self.assertFalse(r, "Slave process was able to get lock!")
     l.release()
     d = qs2m.get()
     got_lock = l.acquire_if_available()
     self.assertFalse(got_lock)
     qm2s.put(True)
     l.acquire()
     l.release()
     l.cleanup()
Ejemplo n.º 7
0
 def test_self_deadlock(self):
     l1 = Lock(self.dir, "id1")
     l2 = Lock(self.dir, "id2")
     l1.acquire()
     l2.acquire()
     l1.release()
     l2.release()
     l1.acquire()
     l2.acquire()
     l2.release()
     l1.release()
Ejemplo n.º 8
0
 def test_sequential_locking(self):
     l = Lock(self.dir, "id1")
     self.assertFalse(l.is_locked())
     l.acquire()
     self.assertTrue(l.is_locked())
     l.release()
     self.assertFalse(l.is_locked())
     got_lock = l.acquire_if_available()
     self.assertTrue(got_lock)
     got_exception = False
     try:
         l.acquire()
     except LockError:
         got_exception = True
     self.assertTrue(got_exception)
     l.release()
     l.cleanup()
     self.assertFalse(os.path.exists(l.path))