aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAditya Naik2017-12-04 15:25:29 -0500
committerAditya Naik2017-12-04 15:25:29 -0500
commitae89b89e884edf471ec0a5d975e84b784f091874 (patch)
tree3114d5f82105d9b16e3cf868b4899d3816e79a11
parent6b71dba112cfbaeb9001fccdc333abb8a8640bb0 (diff)
Added support for multiple ballots
-rw-r--r--prelim.py43
1 files changed, 25 insertions, 18 deletions
diff --git a/prelim.py b/prelim.py
index b225cf6..a45e217 100644
--- a/prelim.py
+++ b/prelim.py
@@ -52,7 +52,7 @@ sequence of function writing (follow this when evaluating):
- leader.evaluate
- messenger.send_message (condensed messenger)
TODO:
-
+- multiple ballots in single instance
TODO future:
- split classes into different files for readability
@@ -84,9 +84,9 @@ class god:
#create and name the priests and messengers (quite godly)
for name in range(0, self.num_priests):
if name == random_leader:
- self.priests[name] = priest(name, (name+1)*offset, True)
+ self.priests[name] = priest(name, (name+1)*offset, True, num_ballots)
else:
- self.priests[name] = priest(name, (name+1)*offset, False)
+ self.priests[name] = priest(name, (name+1)*offset, False, num_ballots)
for priest_name in self.priests.keys():
self.priests[priest_name].start()
@@ -127,36 +127,42 @@ resulting ballot numbers: 100 200 101 300 201 102
"""
class priest(messenger, Thread):
- def __init__(self, name, start_offset, is_leader): #is_leader: temporary var for single ballot test
+ def __init__(self, name, start_offset, is_leader, ballot_count): #is_leader: temporary var for single ballot test
Thread.__init__(self)
- self.name = name #write this name in the ledger in case it gets lost (ledger fileaname)
+ self.name = name
self.messenger = messenger(self.name) #hire a messenger
self.ledger = "ledgers/" + self.name
self.messagebook = "messages/" + self.name
-
-
with open(self.ledger, 'w') as ledgerfile:
- ledgerfile.write("ballot,decree\n")
-
+ ledgerfile.write("ballot,decree\n")
with open(self.messagebook, 'w') as msgbookfile:
msgbookfile.write("from,code,ballot,decree\n")
- self.messages_recieved = 0
-
+
+ self.messages_recieved = 0
self.offset = start_offset
self.is_leader = is_leader
+ self.ballot_count = ballot_count
+ self.ballots_done = 0
+
def run(self):
if(self.is_leader):
- self.leader_main()
+ while self.ballots_done < self.ballot_count:
+ print("LOG: *****Starting ballot #" + str(self.ballots_done+1) + " *******")
+ self.leader_main()
+ self.ballots_done += 1
else:
- self.priest_main()
+ while self.ballots_done < self.ballot_count:
+ self.priest_main()
+ self.ballots_done += 1
+
#=====================leader functions===================
def leader_main(self):
print("LOG: " + self.name + " is the leader")
try:
ledger_data = pd.read_csv(self.ledger)
- last_ballot_num= ledger_data.at[ledger_data.shape[0]-1,'ballot_num']
+ last_ballot_num= ledger_data.at[ledger_data.shape[0]-1,'ballot']
#B1 is satisfied assuming num_ballots < difference between offsets (currently 100)
ballot_num = self.offset + (int(last_ballot_num)%100) + 1
except pd.errors.EmptyDataError: #first pallot ever
@@ -209,6 +215,7 @@ class priest(messenger, Thread):
ledger_entry_df.to_csv(f, header=False, index=False)
else:
#send failed code
+ print("LOG: ballot failed")
self.send_ballot_result(quorum, ballot_num, voted_decree, 4)
def next_ballot(self, ballot, decree):
@@ -240,18 +247,18 @@ class priest(messenger, Thread):
msg = self.new_message() #block for nextBallot from leader
leader = msg[0] # leader
print("LOG: priest #" + self.name + " recieved msg from #" + str(leader))
- self.last_vote(leader)
-
+ self.last_vote(leader)
+
while msg[1] != 2:
msg = self.new_message() # block for beginBallot from leader
if(msg[1] == 2): # recieved beginBallot
#TODO probability of voting variable
#currently: 100% probability of voting yes
vote_yes = random.randrange(0,99)
- if vote_yes < 100: #change this value to vary probability
+ if vote_yes < 50: #change this value to vary probability
self.vote(leader, 2, msg[2], msg[3])
else:
- vote(leader, 3, msg[2], msg[3])
+ self.vote(leader, 3, msg[2], msg[3])
msg = self.new_message() #block for success (or failure) message
if msg[0] == leader and msg[1] == 3: