Byzantine-Chain-Replication

Asynchronous systems project Fall 2017

Members:

Jiajie Li - 109255512
Raunak Shah - 111511721

PLATFORM:

DistAlgo - version 1.0.9 
Python - 3.5.2
Operating System - macOS Sierra version 10.12.6 

INSTRUCTIONS:

To build and run on same machine
python -m da -f --logfilename logs/test1.replica.phase3.log -F output -n MainNode src/main.da config/test1.txt
python -m da -f --logfilename logs/test1.client.phase3.log -F output -n ClientNode -D src/main.da config/test1.txt

To built on multiple hosts
python -m da -f --logfilename logs/test1.replica-phase3.log -F output -H <host_ip> -n MainNode src/main.da config/test1.txt
python -m da -f --logfilename logs/test1.client.phase3.log -F output -n -H <host_ip> -R <peer_ip> ClientNode -D src/main.da config/test1.txt

WORKLOAD GENERATION:

We get a random number from 0 to 100 using the given seed, and we limit it to generate (n/3) + 1 key values only. When we get a random number, we divide it by 4 and get its division, and get which operation we are doing. We also divide it by number of keys to get a division as the key value.

For put operation, divide random number by n and get its division as the value. For example, if key value = 1 and value = 2, the operation is put('key_1','value_2')

For get operation, we use the key value generated the same way as above as its argument. For example, if key value = 0, operation is get('key_0')

For slice operation, divide random number by 3 to get a division as the starting slice number. Then divide it by 5 to get a division as the ending slice number. If start is larger than end, then we make end = start + start - end The key value is generated the same way as above. For example, if key value = 0, start = 2 and end = 4, operation is slice('key_0','2:4')

For append operation, divide random number by n and get its division as the append value. The key value is generated the same way as above. For example, if key value = 0 and append value = 3, operation is append('key_0','value_3')

BUGS AND LIMITATIONS:

Sometimes reconfiguration will run in an infinite loop. However, it will work normally for another run. It depends on the order of wedged responses received by Olympus

CONTRIBUTIONS:

Jiajie Li - Pseudorandom request; Implement part of each da files; Generate some test cases; Reconfiguration; Logging; Testing

Raunak Shah - Implementation of parts of source code files; Failure Injection; Logging; Reconfiguration; Testing

MAIN FILES:

clients - Byzantine-Chain-Replication/src/client.da
replicas - Byzantine-Chain-Replication/src/replica.da
olympus - Byzantine-Chain-Replication/src/olympus.da
main - Byzantine-Chain-Replication/src/main.da

CODE SIZE:

algorithm ~ 1100 lines
other ~ 400 lines
total - 1459 lines

Obtained the non-comment and non-blank lines of code from CLOC (https://github.com/AlDanial/cloc).
Separted algorithms and other manually. About 70 % of the code in "algorithm" is for the algorithm itself and the rest deals with logging and failure injection.

LANGUAGE FEATURE USAGE:

List comprehension used - 1
Set comprehensions used - 2
Aggregrations used - 3
Quantifications used - 15