Introduce bimodal reliability (mobile/server)

This mimicks mostly offline use case
This commit is contained in:
Oskar Thoren 2019-01-09 08:26:26 -05:00
parent 6091502053
commit a8d979ec09
1 changed files with 28 additions and 13 deletions

View File

@ -33,9 +33,8 @@ class NetworkSimulator():
self.time = 0 self.time = 0
self.queue = {} self.queue = {}
self.peers = {} self.peers = {}
# XXX: Assuming nodes are offline most of the time # Global network reliability
# This is different types of nodes, not global self.reliability = 0.9
self.reliability = 0.5
def tick(self): def tick(self):
if self.time in self.queue: if self.time in self.queue:
@ -70,7 +69,7 @@ class NetworkSimulator():
self.queue[recv_time].append((sender, receiver, message)) self.queue[recv_time].append((sender, receiver, message))
class Node(): class Node():
def __init__(self, name, network): def __init__(self, name, network, reliability=0.9):
self.name = name self.name = name
self.log = [] self.log = []
self.messages = {} self.messages = {}
@ -78,6 +77,7 @@ class Node():
self.peers = {} self.peers = {}
self.network = network self.network = network
self.time = 0 self.time = 0
self.reliability = reliability
# XXX: Assumes only one group # XXX: Assumes only one group
self.group_id = GROUP_ID self.group_id = GROUP_ID
@ -140,6 +140,7 @@ class Node():
self.network.send_message(self.name, peer_id, message) self.network.send_message(self.name, peer_id, message)
def on_receive(self, sender, message): def on_receive(self, sender, message):
if random.random() < self.reliability:
#print "*** {} received message from {}".format(self.name, sender.name) #print "*** {} received message from {}".format(self.name, sender.name)
if (message.header.type == 1): if (message.header.type == 1):
self.on_receive_message(sender, message) self.on_receive_message(sender, message)
@ -147,6 +148,8 @@ class Node():
self.on_receive_ack(sender, message) self.on_receive_ack(sender, message)
else: else:
print "XXX: unknown message type" print "XXX: unknown message type"
else:
print "*** node offline, dropping message"
def on_receive_message(self, sender, message): def on_receive_message(self, sender, message):
message_id = get_message_id(message) message_id = get_message_id(message)
@ -240,9 +243,9 @@ def new_ack_record(id):
def run(steps=10): def run(steps=10):
n = NetworkSimulator() n = NetworkSimulator()
a = Node("A", n) a = Node("A", n, 0.1) # mobile
b = Node("B", n) b = Node("B", n, 0.1) # mobile
c = Node("C", n) c = Node("C", n, 0.9) # desktop/server
n.peers["A"] = a n.peers["A"] = a
n.peers["B"] = b n.peers["B"] = b
@ -258,6 +261,12 @@ def run(steps=10):
a.share("B") a.share("B")
b.share("A") b.share("A")
# XXX: Hm, a lot of coordination here? Weird?
a.share("C")
b.share("C")
c.share("A")
c.share("B")
print "\nAssuming one group context (A-B share):" print "\nAssuming one group context (A-B share):"
# XXX: Conditional append to get message graph? # XXX: Conditional append to get message graph?
@ -278,6 +287,8 @@ def run(steps=10):
#a.print_sync_state() #a.print_sync_state()
#b.print_sync_state() #b.print_sync_state()
# XXX: This confuses things somewhat, as this is
# client concerns
acc = "\n" acc = "\n"
for _, msg in a.messages.items(): for _, msg in a.messages.items():
acc += msg.payload.message.body + "\n" acc += msg.payload.message.body + "\n"
@ -347,3 +358,7 @@ ex = {'payload': "hello_world",
'content-type': "text/plain", 'content-type': "text/plain",
'signed_sender': 'A-signed-pubkey', 'signed_sender': 'A-signed-pubkey',
'dependencies': ["foo_message_id"]} 'dependencies': ["foo_message_id"]}
# XXX: How will C receive the message from A to B?
# TODO: Requires offering to B, e.g.
# Or B requesting it