def test_lossy_comms_wraparound(self): sim_reset() node = QuantumNode("TestNode 1", 1) node2 = QuantumNode("TestNode 2", 2) conn = ClassicalFibreConnection(node, node2, length=0.1) dq = DistributedQueue(node, conn, numQueues=3, throw_local_queue_events=True) dq2 = DistributedQueue(node2, conn, numQueues=3, throw_local_queue_events=True) dq.connect_to_peer_protocol(dq2, conn) self.lost_messages = 0 self.lost_seq = dq.myWsize + 1 def faulty_send_msg(cmd, data, clock): if self.lost_messages == 0 and clock[0] == self.lost_seq: self.lost_messages += 1 else: dq.conn.put_from(dq.myID, (cmd, data, clock)) dq.send_msg = faulty_send_msg nodes = [ (node, [dq]), (node2, [dq2]), ] conns = [(conn, "dq_conn", [dq, dq2])] network = EasyNetwork(name="DistQueueNetwork", nodes=nodes, connections=conns) network.start() num_adds = 0 r = 1 curr_time = 0 import pdb while num_adds < 2 * dq.maxCommsSeq: add_delay = 2 for i in range(dq.myWsize): request = SchedulerRequest(0, 0, 0, 0, i, 0, 0, True, False, False, True) dq.add(request) sim_run(curr_time + (i + 1) * add_delay) curr_time += add_delay for j in range(dq2.myWsize): request = SchedulerRequest(0, 0, 0, 0, j, 0, 0, True, False, False, True) dq2.add(request) sim_run(curr_time + (j + 1) * add_delay) curr_time += add_delay num_adds += dq.myWsize num_adds += dq2.myWsize run_time = r * dq.comm_delay * 4 sim_run(curr_time + run_time) curr_time += run_time r += 1 self.ready_items(dq.queueList[0]) self.ready_items(dq2.queueList[0]) self.check_local_queues(dq.queueList[0], dq2.queueList[0]) for i in range(dq.myWsize + dq2.myWsize): dq.local_pop() dq2.local_pop()
def test_lost_add_slave(self): sim_reset() node = QuantumNode("TestNode 1", 1) node2 = QuantumNode("TestNode 2", 2) conn = ClassicalFibreConnection(node, node2, length=0.0001) dq = DistributedQueue(node, conn, numQueues=3) dq2 = DistributedQueue(node2, conn, numQueues=3) dq.connect_to_peer_protocol(dq2, conn) self.lost_messages = defaultdict(int) def faulty_send_add(cmd, data, clock): if cmd == dq2.CMD_ADD: _, cseq, qid, qseq, request = data if self.lost_messages[(cseq, qid, qseq)] >= 1: dq2.conn.put_from(dq2.myID, (cmd, data, clock)) else: self.lost_messages[(cseq, qid, qseq)] += 1 else: dq2.conn.put_from(dq2.myID, (cmd, data, clock)) def faulty_send_ack(cmd, data, clock): if cmd == dq.CMD_ADD_ACK: _, ackd_id, qseq = data if self.lost_messages[(ackd_id, qseq)] >= 1: dq.conn.put_from(dq.myID, (cmd, data, clock)) else: self.lost_messages[(ackd_id, qseq)] += 1 else: dq.conn.put_from(dq.myID, (cmd, data, clock)) nodes = [ (node, [dq]), (node2, [dq2]), ] conns = [(conn, "dq_conn", [dq, dq2])] dq2.send_msg = faulty_send_add dq.send_msg = faulty_send_ack network = EasyNetwork(name="DistQueueNetwork", nodes=nodes, connections=conns) network.start() reqs = [] num_reqs = 10 for i in range(num_reqs): req = [node2.nodeID, i] reqs.append(req) dq2.add(req) sim_run(0.1 * (i + 1)) sim_run(200) # Check that all add and add_ack messages were lost once for v in self.lost_messages.values(): self.assertEqual(v, 1) # Check that the item successfully got added self.assertEqual(len(dq.queueList[0].queue), 10) self.assertEqual(len(dq2.queueList[0].queue), 10) for i, expected_req in zip(range(num_reqs), reqs): item1 = dq.queueList[0].queue[i] item2 = dq2.queueList[0].queue[i] self.assertEqual(item1.request, expected_req) self.assertEqual(item2.request, expected_req)