diff --git a/Assignment3/ass3.jar b/Assignment3/ass3.jar index 939af18..0ce4abc 100644 Binary files a/Assignment3/ass3.jar and b/Assignment3/ass3.jar differ diff --git a/Assignment3/doc/maxlevel.png b/Assignment3/doc/maxlevel.png new file mode 100644 index 0000000..109a3fc Binary files /dev/null and b/Assignment3/doc/maxlevel.png differ diff --git a/Assignment3/doc/report.pdf b/Assignment3/doc/report.pdf new file mode 100644 index 0000000..3c2e3a4 Binary files /dev/null and b/Assignment3/doc/report.pdf differ diff --git a/Assignment3/doc/report.tex b/Assignment3/doc/report.tex new file mode 100644 index 0000000..375f652 --- /dev/null +++ b/Assignment3/doc/report.tex @@ -0,0 +1,88 @@ +\documentclass[12pt]{article} + +\usepackage{amsmath} +\usepackage[hidelinks]{hyperref} +\usepackage{fancyhdr} +\usepackage{color} +\usepackage{titlesec} +\usepackage[pdftex]{graphicx} +\usepackage{datetime} + +\pagestyle{fancy} +\fancyhf{} + +% custom section +\titlespacing{\section}{0pt}{*2}{0pt} +\titleformat{\section}[runin] +{\normalfont\bfseries} +{\thesection. } +{0pt} +{}[\\] + +\begin{document} + +\fancyhead[L] +{ +\textbf{Distributed Algorithms: Assignment 3 C}\\ +Christos Froussios (4322754) \& Quinten Stokkink (4016270)\\ +\today +} +\setlength\headheight{0.8in} +\setlength\topmargin{-0.6in} +\setlength\textheight{9.0in} +\setlength\parindent{0pt} + +\section{Introduction} +In this report we present the results of our implemenation of Afek \& Gafni's algorithm for election in a completely connected network. +We use a slightly modified version of the algorithm to avoid drowning single processes in so many messages they slow down the +whole algorithm. This involves selecting from the untraversed link pool in a random order and a timeout between trying to capture +the same node successively. Furthermore we demote candidate processes that have been killed and have no outstanding messages +to just an ordinary process. + +\section{Methodology} +To test our algorithm we simulated a fully distributed environment by giving each process its own JVM environment. +This is quite costly for the simulating machine, but also far more accurate than testing between two or more +physical machines as every process has access to the exact same capabilities (and delays). +In fact through our tests we found that as the memory footprint nears 4 GB and the amount of threads gets close +to 10,000 our simulating machine starts locking up. + +\quad As for our testing methodology we decided to always test the worst case, which occurs when all processes present themselves +as candidate processes and start the algorithm. By testing the worst cases we should see a curve of the runtime +that is in the order of $O(n log(n))$ as advertised by the algorithm. We also simulate message delay with a normal +distribution with mean 15 ms and standard deviation of 5 ms. + +\section{Results} +We have run tests for the amounts of processes (which are both candidates and ordinary processes at the same time) of: +1, 10, 20, 30, 50, 80, 100, 130 and 150. For each of these processes we then reported the level it reached and whether +it was elected (to verify correctness). For each of these experiments we also recorded the total time. + +\quad The results of the running time experiments are visualized in \autoref{fig:totaltime} and the measurements of the +maximum levels are visualized in \autoref{fig:maxlevel}. We see that the running time does seem to follow an $O(n log(n))$ curve +and that the maximum levels reached seem to follow a linear curve. +Furthermore, \autoref{fig:captures} visualizes the total amount of captures performed in the algorithm versus the amount of +processes. While this series seems to follow a linear curve it suffers from a lot more noise than the other two metrics. + +\quad Note that due to our optimization, candidates are only killed once. Therefore it does not make much sense to report on this. + +\begin{figure}[h] + \centering + \includegraphics{totaltime.png} + \caption{The total time taken for the algorithm to terminate versus the amount of processes} + \label{fig:totaltime} +\end{figure} + +\begin{figure}[p] + \centering + \includegraphics{maxlevel.png} + \caption{The maximum level achieved versus the amount of processes} + \label{fig:maxlevel} +\end{figure} + +\begin{figure}[p] + \centering + \includegraphics{totalcapture.png} + \caption{The total amount of captures in the algorithm versus the amount of processes} + \label{fig:captures} +\end{figure} + +\end{document} \ No newline at end of file diff --git a/Assignment3/doc/results.xlsx b/Assignment3/doc/results.xlsx new file mode 100644 index 0000000..62c81ad Binary files /dev/null and b/Assignment3/doc/results.xlsx differ diff --git a/Assignment3/doc/totalcapture.png b/Assignment3/doc/totalcapture.png new file mode 100644 index 0000000..1ae3a4a Binary files /dev/null and b/Assignment3/doc/totalcapture.png differ diff --git a/Assignment3/doc/totaltime.png b/Assignment3/doc/totaltime.png new file mode 100644 index 0000000..c2529bf Binary files /dev/null and b/Assignment3/doc/totaltime.png differ diff --git a/Assignment3/experiments/1-1.txt b/Assignment3/experiments/1-1.txt new file mode 100644 index 0000000..1809a9b --- /dev/null +++ b/Assignment3/experiments/1-1.txt @@ -0,0 +1,6 @@ +1 processes, 1 candidates. +Dispatched work, waiting for setup (PRESS ANYKEY+ENTER TO ABORT) +Workload accepted: starting algorithm (est. time = 0.1 seconds) +Waiting for processes to finish (PRESS ANYKEY+ENTER TO ABORT) +DONE, time taken = 0.211 seconds +1: elected = true, level = 0 diff --git a/Assignment3/experiments/10-10.txt b/Assignment3/experiments/10-10.txt new file mode 100644 index 0000000..83da2bf --- /dev/null +++ b/Assignment3/experiments/10-10.txt @@ -0,0 +1,15 @@ +10 processes, 10 candidates. +Dispatched work, waiting for setup (PRESS ANYKEY+ENTER TO ABORT) ... +Workload accepted: starting algorithm (est. time = 3.3025850929940463 seconds) +Waiting for processes to finish (PRESS ANYKEY+ENTER TO ABORT) ... +DONE, time taken = 2.181 seconds +1: elected = false, level = 0 +2: elected = false, level = 0 +3: elected = false, level = 2 +4: elected = false, level = 0 +5: elected = true, level = 20 +6: elected = false, level = 1 +7: elected = false, level = 0 +8: elected = false, level = 1 +9: elected = false, level = 0 +10: elected = false, level = 3 \ No newline at end of file diff --git a/Assignment3/experiments/100-100.txt b/Assignment3/experiments/100-100.txt new file mode 100644 index 0000000..cf11695 --- /dev/null +++ b/Assignment3/experiments/100-100.txt @@ -0,0 +1,105 @@ +100 processes, 100 candidates. +Dispatched work, waiting for setup (PRESS ANYKEY+ENTER TO ABORT) ... +Workload accepted: starting algorithm (est. time = 56.05170185988092 seconds) +Waiting for processes to finish (PRESS ANYKEY+ENTER TO ABORT) ... +DONE, time taken = 54.435 seconds +1: elected = true, level = 427 +2: elected = false, level = 0 +3: elected = false, level = 0 +4: elected = false, level = 0 +5: elected = false, level = 0 +6: elected = false, level = 0 +7: elected = false, level = 0 +8: elected = false, level = 0 +9: elected = false, level = 0 +10: elected = false, level = 0 +11: elected = false, level = 0 +12: elected = false, level = 1 +13: elected = false, level = 0 +14: elected = false, level = 0 +15: elected = false, level = 0 +16: elected = false, level = 0 +17: elected = false, level = 0 +18: elected = false, level = 0 +19: elected = false, level = 0 +20: elected = false, level = 0 +21: elected = false, level = 0 +22: elected = false, level = 10 +23: elected = false, level = 0 +24: elected = false, level = 2 +25: elected = false, level = 0 +26: elected = false, level = 1 +27: elected = false, level = 12 +28: elected = false, level = 0 +29: elected = false, level = 39 +30: elected = false, level = 0 +31: elected = false, level = 0 +32: elected = false, level = 0 +33: elected = false, level = 0 +34: elected = false, level = 0 +35: elected = false, level = 0 +36: elected = false, level = 21 +37: elected = false, level = 0 +38: elected = false, level = 5 +39: elected = false, level = 2 +40: elected = false, level = 0 +41: elected = false, level = 3 +42: elected = false, level = 0 +43: elected = false, level = 0 +44: elected = false, level = 0 +45: elected = false, level = 0 +46: elected = false, level = 0 +47: elected = false, level = 2 +48: elected = false, level = 14 +49: elected = false, level = 2 +50: elected = false, level = 0 +51: elected = false, level = 0 +52: elected = false, level = 0 +53: elected = false, level = 1 +54: elected = false, level = 4 +55: elected = false, level = 7 +56: elected = false, level = 1 +57: elected = false, level = 5 +58: elected = false, level = 0 +59: elected = false, level = 0 +60: elected = false, level = 2 +61: elected = false, level = 0 +62: elected = false, level = 0 +63: elected = false, level = 9 +64: elected = false, level = 0 +65: elected = false, level = 2 +66: elected = false, level = 2 +67: elected = false, level = 2 +68: elected = false, level = 0 +69: elected = false, level = 0 +70: elected = false, level = 0 +71: elected = false, level = 1 +72: elected = false, level = 25 +73: elected = false, level = 0 +74: elected = false, level = 0 +75: elected = false, level = 0 +76: elected = false, level = 0 +77: elected = false, level = 0 +78: elected = false, level = 0 +79: elected = false, level = 12 +80: elected = false, level = 0 +81: elected = false, level = 1 +82: elected = false, level = 1 +83: elected = false, level = 6 +84: elected = false, level = 0 +85: elected = false, level = 6 +86: elected = false, level = 5 +87: elected = false, level = 0 +88: elected = false, level = 144 +89: elected = false, level = 6 +90: elected = false, level = 0 +91: elected = false, level = 0 +92: elected = false, level = 0 +93: elected = false, level = 11 +94: elected = false, level = 8 +95: elected = false, level = 3 +96: elected = false, level = 9 +97: elected = false, level = 0 +98: elected = false, level = 0 +99: elected = false, level = 0 +100: elected = false, level = 4 diff --git a/Assignment3/experiments/130-130.txt b/Assignment3/experiments/130-130.txt new file mode 100644 index 0000000..045bee1 --- /dev/null +++ b/Assignment3/experiments/130-130.txt @@ -0,0 +1,135 @@ +130 processes, 130 candidates. +Dispatched work, waiting for setup (PRESS ANYKEY+ENTER TO ABORT) ... +Workload accepted: starting algorithm (est. time = 76.27794785592258 seconds) +Waiting for processes to finish (PRESS ANYKEY+ENTER TO ABORT) ... +DONE, time taken = 77.687 seconds +1: elected = false, level = 0 +2: elected = false, level = 0 +3: elected = false, level = 0 +4: elected = false, level = 2 +5: elected = false, level = 0 +6: elected = false, level = 1 +7: elected = false, level = 0 +8: elected = false, level = 0 +9: elected = false, level = 0 +10: elected = false, level = 0 +11: elected = false, level = 0 +12: elected = false, level = 0 +13: elected = false, level = 0 +14: elected = false, level = 0 +15: elected = false, level = 17 +16: elected = false, level = 0 +17: elected = false, level = 1 +18: elected = false, level = 3 +19: elected = false, level = 0 +20: elected = false, level = 0 +21: elected = false, level = 0 +22: elected = false, level = 0 +23: elected = false, level = 0 +24: elected = false, level = 0 +25: elected = false, level = 0 +26: elected = false, level = 0 +27: elected = false, level = 0 +28: elected = false, level = 0 +29: elected = false, level = 0 +30: elected = false, level = 0 +31: elected = false, level = 0 +32: elected = false, level = 0 +33: elected = false, level = 0 +34: elected = false, level = 0 +35: elected = false, level = 0 +36: elected = false, level = 2 +37: elected = false, level = 0 +38: elected = false, level = 0 +39: elected = false, level = 2 +40: elected = false, level = 2 +41: elected = false, level = 0 +42: elected = false, level = 0 +43: elected = false, level = 0 +44: elected = false, level = 3 +45: elected = false, level = 1 +46: elected = false, level = 0 +47: elected = false, level = 3 +48: elected = false, level = 0 +49: elected = false, level = 0 +50: elected = false, level = 1 +51: elected = false, level = 1 +52: elected = false, level = 0 +53: elected = false, level = 2 +54: elected = false, level = 5 +55: elected = false, level = 3 +56: elected = false, level = 0 +57: elected = false, level = 0 +58: elected = false, level = 19 +59: elected = false, level = 5 +60: elected = false, level = 1 +61: elected = false, level = 1 +62: elected = false, level = 0 +63: elected = false, level = 0 +64: elected = false, level = 0 +65: elected = false, level = 0 +66: elected = false, level = 0 +67: elected = false, level = 1 +68: elected = false, level = 0 +69: elected = false, level = 0 +70: elected = false, level = 0 +71: elected = false, level = 2 +72: elected = false, level = 22 +73: elected = false, level = 1 +74: elected = false, level = 2 +75: elected = false, level = 0 +76: elected = false, level = 0 +77: elected = false, level = 10 +78: elected = false, level = 3 +79: elected = false, level = 0 +80: elected = false, level = 0 +81: elected = false, level = 0 +82: elected = false, level = 2 +83: elected = false, level = 4 +84: elected = false, level = 1 +85: elected = false, level = 90 +86: elected = false, level = 1 +87: elected = false, level = 3 +88: elected = false, level = 0 +89: elected = false, level = 0 +90: elected = false, level = 51 +91: elected = false, level = 1 +92: elected = false, level = 0 +93: elected = false, level = 0 +94: elected = false, level = 0 +95: elected = false, level = 1 +96: elected = false, level = 0 +97: elected = false, level = 0 +98: elected = false, level = 0 +99: elected = false, level = 0 +100: elected = false, level = 10 +101: elected = false, level = 3 +102: elected = false, level = 131 +103: elected = false, level = 0 +104: elected = true, level = 588 +105: elected = false, level = 2 +106: elected = false, level = 0 +107: elected = false, level = 0 +108: elected = false, level = 0 +109: elected = false, level = 58 +110: elected = false, level = 0 +111: elected = false, level = 0 +112: elected = false, level = 0 +113: elected = false, level = 0 +114: elected = false, level = 0 +115: elected = false, level = 3 +116: elected = false, level = 2 +117: elected = false, level = 7 +118: elected = false, level = 74 +119: elected = false, level = 11 +120: elected = false, level = 15 +121: elected = false, level = 9 +122: elected = false, level = 5 +123: elected = false, level = 0 +124: elected = false, level = 5 +125: elected = false, level = 5 +126: elected = false, level = 0 +127: elected = false, level = 239 +128: elected = false, level = 14 +129: elected = false, level = 12 +130: elected = false, level = 0 \ No newline at end of file diff --git a/Assignment3/experiments/150-150.txt b/Assignment3/experiments/150-150.txt new file mode 100644 index 0000000..eac6718 --- /dev/null +++ b/Assignment3/experiments/150-150.txt @@ -0,0 +1,155 @@ +150 processes, 150 candidates. +Dispatched work, waiting for setup (PRESS ANYKEY+ENTER TO ABORT) ... +Workload accepted: starting algorithm (est. time = 90.15952941144383 seconds) +Waiting for processes to finish (PRESS ANYKEY+ENTER TO ABORT) ... +DONE, time taken = 92.394 seconds +1: elected = false, level = 2 +2: elected = false, level = 0 +3: elected = false, level = 0 +4: elected = false, level = 0 +5: elected = false, level = 0 +6: elected = false, level = 1 +7: elected = false, level = 0 +8: elected = false, level = 0 +9: elected = false, level = 0 +10: elected = false, level = 6 +11: elected = false, level = 0 +12: elected = false, level = 0 +13: elected = false, level = 0 +14: elected = false, level = 0 +15: elected = false, level = 0 +16: elected = false, level = 1 +17: elected = false, level = 10 +18: elected = false, level = 1 +19: elected = false, level = 0 +20: elected = false, level = 0 +21: elected = false, level = 0 +22: elected = false, level = 0 +23: elected = false, level = 0 +24: elected = false, level = 0 +25: elected = false, level = 10 +26: elected = false, level = 0 +27: elected = false, level = 0 +28: elected = false, level = 0 +29: elected = false, level = 0 +30: elected = false, level = 0 +31: elected = false, level = 1 +32: elected = false, level = 20 +33: elected = false, level = 0 +34: elected = false, level = 0 +35: elected = false, level = 0 +36: elected = false, level = 0 +37: elected = false, level = 1 +38: elected = false, level = 0 +39: elected = false, level = 0 +40: elected = false, level = 0 +41: elected = false, level = 0 +42: elected = false, level = 0 +43: elected = false, level = 0 +44: elected = false, level = 7 +45: elected = false, level = 11 +46: elected = false, level = 0 +47: elected = false, level = 0 +48: elected = false, level = 0 +49: elected = false, level = 0 +50: elected = false, level = 0 +51: elected = false, level = 0 +52: elected = false, level = 0 +53: elected = false, level = 2 +54: elected = false, level = 5 +55: elected = false, level = 6 +56: elected = false, level = 0 +57: elected = false, level = 0 +58: elected = false, level = 6 +59: elected = true, level = 654 +60: elected = false, level = 0 +61: elected = false, level = 0 +62: elected = false, level = 0 +63: elected = false, level = 7 +64: elected = false, level = 0 +65: elected = false, level = 0 +66: elected = false, level = 4 +67: elected = false, level = 0 +68: elected = false, level = 1 +69: elected = false, level = 0 +70: elected = false, level = 0 +71: elected = false, level = 103 +72: elected = false, level = 0 +73: elected = false, level = 0 +74: elected = false, level = 0 +75: elected = false, level = 11 +76: elected = false, level = 0 +77: elected = false, level = 14 +78: elected = false, level = 0 +79: elected = false, level = 0 +80: elected = false, level = 18 +81: elected = false, level = 0 +82: elected = false, level = 0 +83: elected = false, level = 0 +84: elected = false, level = 0 +85: elected = false, level = 0 +86: elected = false, level = 0 +87: elected = false, level = 2 +88: elected = false, level = 12 +89: elected = false, level = 1 +90: elected = false, level = 3 +91: elected = false, level = 3 +92: elected = false, level = 0 +93: elected = false, level = 0 +94: elected = false, level = 12 +95: elected = false, level = 0 +96: elected = false, level = 115 +97: elected = false, level = 1 +98: elected = false, level = 1 +99: elected = false, level = 1 +100: elected = false, level = 0 +101: elected = false, level = 0 +102: elected = false, level = 0 +103: elected = false, level = 0 +104: elected = false, level = 0 +105: elected = false, level = 0 +106: elected = false, level = 0 +107: elected = false, level = 2 +108: elected = false, level = 2 +109: elected = false, level = 0 +110: elected = false, level = 0 +111: elected = false, level = 0 +112: elected = false, level = 1 +113: elected = false, level = 0 +114: elected = false, level = 4 +115: elected = false, level = 30 +116: elected = false, level = 0 +117: elected = false, level = 3 +118: elected = false, level = 0 +119: elected = false, level = 14 +120: elected = false, level = 15 +121: elected = false, level = 0 +122: elected = false, level = 0 +123: elected = false, level = 4 +124: elected = false, level = 3 +125: elected = false, level = 3 +126: elected = false, level = 0 +127: elected = false, level = 9 +128: elected = false, level = 0 +129: elected = false, level = 1 +130: elected = false, level = 3 +131: elected = false, level = 0 +132: elected = false, level = 0 +133: elected = false, level = 2 +134: elected = false, level = 1 +135: elected = false, level = 5 +136: elected = false, level = 1 +137: elected = false, level = 5 +138: elected = false, level = 8 +139: elected = false, level = 31 +140: elected = false, level = 0 +141: elected = false, level = 48 +142: elected = false, level = 0 +143: elected = false, level = 49 +144: elected = false, level = 0 +145: elected = false, level = 2 +146: elected = false, level = 0 +147: elected = false, level = 50 +148: elected = false, level = 1 +149: elected = false, level = 4 +150: elected = false, level = 3 diff --git a/Assignment3/experiments/20-20.txt b/Assignment3/experiments/20-20.txt new file mode 100644 index 0000000..fb0e14c --- /dev/null +++ b/Assignment3/experiments/20-20.txt @@ -0,0 +1,25 @@ +20 processes, 20 candidates. +Dispatched work, waiting for setup (PRESS ANYKEY+ENTER TO ABORT) ... +Workload accepted: starting algorithm (est. time = 7.991464547107981 seconds) +Waiting for processes to finish (PRESS ANYKEY+ENTER TO ABORT) ... +DONE, time taken = 7.24 seconds +1: elected = false, level = 0 +2: elected = false, level = 0 +3: elected = false, level = 0 +4: elected = false, level = 0 +5: elected = false, level = 0 +6: elected = false, level = 0 +7: elected = false, level = 1 +8: elected = false, level = 0 +9: elected = false, level = 3 +10: elected = false, level = 3 +11: elected = false, level = 9 +12: elected = false, level = 0 +13: elected = false, level = 4 +14: elected = false, level = 0 +15: elected = false, level = 5 +16: elected = false, level = 2 +17: elected = false, level = 8 +18: elected = true, level = 72 +19: elected = false, level = 0 +20: elected = false, level = 10 \ No newline at end of file diff --git a/Assignment3/experiments/30-30.txt b/Assignment3/experiments/30-30.txt new file mode 100644 index 0000000..61e94eb --- /dev/null +++ b/Assignment3/experiments/30-30.txt @@ -0,0 +1,35 @@ +30 processes, 30 candidates. +Dispatched work, waiting for setup (PRESS ANYKEY+ENTER TO ABORT) ... +Workload accepted: starting algorithm (est. time = 13.203592144986466 seconds) +Waiting for processes to finish (PRESS ANYKEY+ENTER TO ABORT) ... +DONE, time taken = 12.919 seconds +1: elected = false, level = 0 +2: elected = false, level = 0 +3: elected = false, level = 0 +4: elected = false, level = 0 +5: elected = false, level = 0 +6: elected = false, level = 0 +7: elected = false, level = 1 +8: elected = false, level = 0 +9: elected = false, level = 0 +10: elected = false, level = 0 +11: elected = false, level = 0 +12: elected = false, level = 2 +13: elected = false, level = 0 +14: elected = false, level = 6 +15: elected = false, level = 0 +16: elected = false, level = 0 +17: elected = false, level = 4 +18: elected = false, level = 29 +19: elected = true, level = 113 +20: elected = false, level = 0 +21: elected = false, level = 6 +22: elected = false, level = 2 +23: elected = false, level = 1 +24: elected = false, level = 0 +25: elected = false, level = 0 +26: elected = false, level = 0 +27: elected = false, level = 0 +28: elected = false, level = 3 +29: elected = false, level = 0 +30: elected = false, level = 0 diff --git a/Assignment3/experiments/50-50.txt b/Assignment3/experiments/50-50.txt new file mode 100644 index 0000000..e3dbb74 --- /dev/null +++ b/Assignment3/experiments/50-50.txt @@ -0,0 +1,55 @@ +50 processes, 50 candidates. +Dispatched work, waiting for setup (PRESS ANYKEY+ENTER TO ABORT) ... +Workload accepted: starting algorithm (est. time = 24.560115027140732 seconds) +Waiting for processes to finish (PRESS ANYKEY+ENTER TO ABORT) ... +DONE, time taken = 20.386 seconds +1: elected = false, level = 1 +2: elected = false, level = 0 +3: elected = false, level = 0 +4: elected = false, level = 0 +5: elected = false, level = 0 +6: elected = false, level = 7 +7: elected = false, level = 0 +8: elected = false, level = 0 +9: elected = false, level = 0 +10: elected = false, level = 0 +11: elected = false, level = 0 +12: elected = false, level = 0 +13: elected = false, level = 0 +14: elected = false, level = 0 +15: elected = false, level = 0 +16: elected = false, level = 0 +17: elected = false, level = 0 +18: elected = false, level = 5 +19: elected = false, level = 0 +20: elected = false, level = 0 +21: elected = true, level = 190 +22: elected = false, level = 7 +23: elected = false, level = 0 +24: elected = false, level = 0 +25: elected = false, level = 0 +26: elected = false, level = 0 +27: elected = false, level = 0 +28: elected = false, level = 13 +29: elected = false, level = 0 +30: elected = false, level = 0 +31: elected = false, level = 6 +32: elected = false, level = 0 +33: elected = false, level = 0 +34: elected = false, level = 0 +35: elected = false, level = 13 +36: elected = false, level = 1 +37: elected = false, level = 0 +38: elected = false, level = 4 +39: elected = false, level = 4 +40: elected = false, level = 0 +41: elected = false, level = 0 +42: elected = false, level = 0 +43: elected = false, level = 11 +44: elected = false, level = 0 +45: elected = false, level = 4 +46: elected = false, level = 2 +47: elected = false, level = 7 +48: elected = false, level = 0 +49: elected = false, level = 2 +50: elected = false, level = 0 diff --git a/Assignment3/experiments/80-80.txt b/Assignment3/experiments/80-80.txt new file mode 100644 index 0000000..0cd04da --- /dev/null +++ b/Assignment3/experiments/80-80.txt @@ -0,0 +1,85 @@ +80 processes, 80 candidates. +Dispatched work, waiting for setup (PRESS ANYKEY+ENTER TO ABORT) ... +Workload accepted: starting algorithm (est. time = 43.05621307739105 seconds) +Waiting for processes to finish (PRESS ANYKEY+ENTER TO ABORT) ... +DONE, time taken = 41.147 seconds +1: elected = false, level = 0 +2: elected = false, level = 0 +3: elected = false, level = 2 +4: elected = false, level = 2 +5: elected = false, level = 0 +6: elected = false, level = 0 +7: elected = false, level = 0 +8: elected = false, level = 0 +9: elected = false, level = 0 +10: elected = false, level = 0 +11: elected = false, level = 1 +12: elected = false, level = 1 +13: elected = false, level = 0 +14: elected = false, level = 6 +15: elected = false, level = 0 +16: elected = false, level = 11 +17: elected = false, level = 0 +18: elected = false, level = 0 +19: elected = false, level = 0 +20: elected = false, level = 2 +21: elected = false, level = 2 +22: elected = false, level = 0 +23: elected = false, level = 0 +24: elected = false, level = 20 +25: elected = false, level = 0 +26: elected = false, level = 0 +27: elected = false, level = 1 +28: elected = false, level = 0 +29: elected = false, level = 0 +30: elected = false, level = 5 +31: elected = false, level = 0 +32: elected = false, level = 1 +33: elected = false, level = 0 +34: elected = false, level = 1 +35: elected = false, level = 0 +36: elected = false, level = 0 +37: elected = false, level = 4 +38: elected = true, level = 329 +39: elected = false, level = 0 +40: elected = false, level = 0 +41: elected = false, level = 57 +42: elected = false, level = 5 +43: elected = false, level = 0 +44: elected = false, level = 8 +45: elected = false, level = 0 +46: elected = false, level = 0 +47: elected = false, level = 5 +48: elected = false, level = 0 +49: elected = false, level = 1 +50: elected = false, level = 0 +51: elected = false, level = 0 +52: elected = false, level = 0 +53: elected = false, level = 0 +54: elected = false, level = 0 +55: elected = false, level = 0 +56: elected = false, level = 0 +57: elected = false, level = 0 +58: elected = false, level = 0 +59: elected = false, level = 2 +60: elected = false, level = 0 +61: elected = false, level = 0 +62: elected = false, level = 0 +63: elected = false, level = 0 +64: elected = false, level = 0 +65: elected = false, level = 3 +66: elected = false, level = 2 +67: elected = false, level = 2 +68: elected = false, level = 0 +69: elected = false, level = 1 +70: elected = false, level = 23 +71: elected = false, level = 118 +72: elected = false, level = 0 +73: elected = false, level = 0 +74: elected = false, level = 4 +75: elected = false, level = 1 +76: elected = false, level = 4 +77: elected = false, level = 19 +78: elected = false, level = 12 +79: elected = false, level = 0 +80: elected = false, level = 0 \ No newline at end of file diff --git a/Assignment3/readme.txt.txt b/Assignment3/readme.txt.txt new file mode 100644 index 0000000..5050e9c --- /dev/null +++ b/Assignment3/readme.txt.txt @@ -0,0 +1,8 @@ +How to run + +Execute the main method of the ProcessManager with arguments: + + + +Note: +For each process, the ProcessManager invokes the compiled .jar of our code. Make sure that ass3.jar exists to execute. \ No newline at end of file diff --git a/Assignment3/src/ProcessManager.java b/Assignment3/src/ProcessManager.java index 937a770..06a8633 100644 --- a/Assignment3/src/ProcessManager.java +++ b/Assignment3/src/ProcessManager.java @@ -74,7 +74,7 @@ public static void main(String[] args) throws IOException { processes.add(invokeJar("" + i, candidate)); } - System.out.print("Dispatched work, waiting for setup "); + System.out.print("Dispatched work, waiting for setup (PRESS ANYKEY+ENTER TO ABORT) "); for (long i = 1; i <= amount; i++) { File fname = new File(i + ".txt"); while (!fname.exists()){ @@ -84,7 +84,6 @@ public static void main(String[] args) throws IOException { } Thread.sleep(10); } catch (InterruptedException e) { - // TODO Auto-generated catch block e.printStackTrace(); } } @@ -93,12 +92,11 @@ public static void main(String[] args) throws IOException { System.out.print("."); } System.out.println(); - System.out.println("Workload accepted: starting algorithm"); + System.out.println("Workload accepted: starting algorithm (est. time = " + ((candidates * Math.log(candidates) + candidates) * 0.1) + " seconds)"); try { Thread.sleep(2000); } catch (InterruptedException e1) { - // TODO Auto-generated catch block e1.printStackTrace(); } @@ -112,6 +110,8 @@ public static void main(String[] args) throws IOException { /* * Gather data */ + long startTime = System.currentTimeMillis(); + System.out.print("Waiting for processes to finish (PRESS ANYKEY+ENTER TO ABORT) "); String result = ""; for (long i = 1; i <= candidates; i++) { File fname = new File(i + ".txt"); @@ -122,17 +122,17 @@ public static void main(String[] args) throws IOException { } Thread.sleep(10); } catch (InterruptedException e) { - // TODO Auto-generated catch block e.printStackTrace(); } } Scanner sc = new Scanner(fname); String line = i + ": " + sc.nextLine(); result += line + "\n"; - System.out.println(line); sc.close(); + if (i % (amount/3) == 0) + System.out.print("."); } - //System.out.print(result); + System.out.println(); /* * Kill all @@ -141,7 +141,16 @@ public static void main(String[] args) throws IOException { t.kill(); } - System.out.println("DONE"); + /* + * Cleanup results + */ + for (long i = 1; i <= candidates; i++) { + File fname = new File(i + ".txt"); + fname.delete(); + } + + System.out.println("DONE, time taken = " + ((System.currentTimeMillis()-startTime)/1000.0d) + " seconds"); + System.out.print(result); } private static class ProcessThread extends Thread{ @@ -158,14 +167,14 @@ public void kill(){ if (process != null) process.destroy(); else if (singleProcess != null) - singleProcess.stop(); + singleProcess.interrupt(); } @Override public void run() { runJar(); -// runThread(); + //runThread(); } public void runJar() { @@ -174,17 +183,13 @@ public void runJar() { for (String arg : args) command += " \"" + arg + "\""; process = Runtime.getRuntime().exec(command); + ISConsumer stdout = new ISConsumer(process.getInputStream()); + ISConsumer stderr = new ISConsumer(process.getErrorStream()); + stdout.start(); + stderr.start(); process.waitFor(); - InputStream in = process.getInputStream(); - InputStream err = process.getErrorStream(); - - byte b[] = new byte[in.available()]; - in.read(b, 0, b.length); - System.out.println(new String(b)); - - byte c[] = new byte[err.available()]; - err.read(c, 0, c.length); - System.out.println(new String(c)); + stdout.kill(); + stderr.kill(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { @@ -193,13 +198,37 @@ public void runJar() { } public void runThread() { - SingleProcess p = new SingleProcess(args); - p.start(); + singleProcess = new SingleProcess(args); + singleProcess.start(); try { - p.join(); + singleProcess.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } + + private static class ISConsumer extends Thread{ + private final InputStream is; + private boolean alive = true; + + public ISConsumer (InputStream is){ + this.is = is; + } + + public void kill(){ + alive = false; + } + + public void run(){ + while (alive){ + try { + is.read(); + if (is.available() == 0) + Thread.sleep(10); + } catch (IOException | InterruptedException e) { + } + } + } + } } diff --git a/Assignment3/src/SingleProcess.java b/Assignment3/src/SingleProcess.java index 8c95208..8e52ea1 100644 --- a/Assignment3/src/SingleProcess.java +++ b/Assignment3/src/SingleProcess.java @@ -52,6 +52,8 @@ public static void main(String[] args) throws FileNotFoundException, RemoteExcep } op.join(); + } catch (InterruptedException ee) { + System.err.println("WARNING: " + me.getId() + " interrupted forcefully!"); } catch (Exception e){ e.printStackTrace(); } diff --git a/Assignment3/src/org/da/ass3/CandidateProcess.java b/Assignment3/src/org/da/ass3/CandidateProcess.java index 4a24ce9..79d5ca9 100644 --- a/Assignment3/src/org/da/ass3/CandidateProcess.java +++ b/Assignment3/src/org/da/ass3/CandidateProcess.java @@ -7,6 +7,7 @@ import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Collection; +import java.util.LinkedList; import java.util.Random; import java.util.concurrent.ConcurrentLinkedQueue; @@ -44,11 +45,15 @@ public CandidateProcess(Connector connector, long id, Collection allIds){ this.myid = id; connector.subscribe(this); - // TODO randomize order - this.untraversed.addAll(allIds); - + ArrayList remaining = new ArrayList(allIds); + while (!remaining.isEmpty()){ + int index = (int) Math.round(Math.random()*remaining.size()); + if (index == remaining.size()) + index--; + untraversed.add(remaining.remove(index)); + } - untraversed.remove(myid); + //untraversed.remove((Long) myid); } /** @@ -66,26 +71,33 @@ public void kill(){ @Override public void run(){ - while (alive && !untraversed.isEmpty() && !killed){ - long link = untraversed.poll(); - try { - connector.send(link, new CandidateMessage(level, myid)); - } catch (MalformedURLException | RemoteException - | NotBoundException e) { - e.printStackTrace(); - break; + while (alive && ((!untraversed.isEmpty() && !killed)||!messageQueue.isEmpty())){ + long link = 0; + if (!killed){ + link = untraversed.peek(); + try { + connector.send(link, new CandidateMessage(level, myid)); + } catch (MalformedURLException | RemoteException + | NotBoundException e) { + e.printStackTrace(); + break; + } } boolean R = true; while (R){ R = false; System.out.println(myid + "] Candidate waiting for message"); System.out.flush(); + int timeout = 50; do { // Wait - try { Thread.sleep(100); } catch (InterruptedException e) {} + try { Thread.sleep(20); } catch (InterruptedException e) {} + timeout--; } while (alive && messageQueue.isEmpty()); if (!alive) break; + if (timeout == 0) + break; MsgTuple message = messageQueue.poll(); System.out.println(myid + "] Candidate received message " + message); if (message.getId() == myid && !killed){ @@ -93,6 +105,7 @@ public void run(){ untraversed.remove(message.getLink()); System.out.println(printUntraversed()); connector.log(printUntraversed()); + R = link != message.getLink(); } else { if (message.compareTo(new MsgTuple(level, myid)) < 0){ // Goto R @@ -117,7 +130,7 @@ public void run(){ try { FileWriter fw = new FileWriter(myid + ".txt"); - fw.write("elected = " + elected); + fw.write("elected = " + elected + ", level = " + level); fw.close(); } catch (IOException e) { // TODO Auto-generated catch block @@ -130,6 +143,7 @@ private String printUntraversed() { array += "["; for (Long l : untraversed) array += l + ", "; + array = array.substring(0, array.length()-2); array += "]"; return array; } diff --git a/Assignment3/src/org/da/ass3/Connector.java b/Assignment3/src/org/da/ass3/Connector.java index 6bd6010..8e839f8 100644 --- a/Assignment3/src/org/da/ass3/Connector.java +++ b/Assignment3/src/org/da/ass3/Connector.java @@ -110,7 +110,7 @@ public synchronized void receive(long fromProcess, GenericMessage message) throw * @param message The message to write to file */ public void log(String message){ - try { + /*try { sem.acquire(); FileWriter fw = new FileWriter(id + ".log", true); fw.write(message+"\n"); @@ -121,14 +121,14 @@ public void log(String message){ e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); - } + }*/ } /** * Clear all the messages in the log file for this process */ private void clearLog(){ - try { + /*try { sem.acquire(); FileWriter fw = new FileWriter(id + ".log", false); fw.write(""); @@ -138,7 +138,7 @@ private void clearLog(){ e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); - } + }*/ } /** diff --git a/Assignment3/src/org/da/ass3/OrdinaryProcess.java b/Assignment3/src/org/da/ass3/OrdinaryProcess.java index b859d38..23bb8b2 100644 --- a/Assignment3/src/org/da/ass3/OrdinaryProcess.java +++ b/Assignment3/src/org/da/ass3/OrdinaryProcess.java @@ -57,7 +57,7 @@ public void kill(){ public void run(){ while (alive){ // Wait for a message - try { Thread.sleep(100); } catch (InterruptedException e) {} + try { Thread.sleep(50); } catch (InterruptedException e) {} if (!messageQueue.isEmpty()){ System.out.println(myid + "] Ordinary received message"); MsgTuple message = messageQueue.poll(); @@ -66,8 +66,8 @@ public void run(){ MsgTuple current = new MsgTuple(level, owner_id); // Do not send if this owner and the received owner are the same - if ( current.getId() == message.getId() ) - continue; + //if ( current.getId() == message.getId() ) + //continue; // Compare int compare = message.compareTo(current);