Пример #1
0
def main(processes, messages, runscript, broadcastType, logsDir, testConfig):
    # Set tc for loopback
    #tc = TC(testConfig['TC'])
    #print(tc)

    sleepSends = [25, 50]
    sleepDelivers = [150, 200, 250, 300, 350]
    timeoutAcks = [10, 15]
    tries = [2]
    numOutstandings = [1400, 1500, 1600]
    sleepOutStandings = [50, 100, 150]

    best_finish = float('inf')
    best_del = 0
    best_finish_dict = defaultdict(int)
    best_del_dict = defaultdict(int)

    for sleepSend in sleepSends:
        for sleepDeliver in sleepDelivers:
            for timeoutAck in timeoutAcks:
                for tri in tries:
                    for numOutstanding in numOutstandings:
                        for sleepOutStanding in sleepOutStandings:
                            print("sleepSend:", sleepSend, flush=True)
                            print("sleepDeliver:", sleepDeliver, flush=True)
                            print("timeoutAck:", timeoutAck, flush=True)
                            print("tries:", tri, flush=True)
                            print("numOutstanding:", numOutstanding, flush=True)
                            print("sleepOutStanding:", sleepOutStanding, flush=True)
                            tot_finishes = []
                            tot_dels = []
                            for _ in range(3):
                                # Start the barrier
                                initBarrier = barrier.Barrier(BARRIER_IP, BARRIER_PORT, processes)
                                initBarrier.listen()
                                startTimesFuture = initBarrier.startTimesFuture()

                                initBarrierThread = threading.Thread(target=initBarrier.wait)
                                initBarrierThread.start()

                                # Start the finish signal
                                finishSignal = finishedSignal.FinishedSignal(SIGNAL_IP, SIGNAL_PORT, processes)
                                finishSignal.listen()
                                finishSignalThread = threading.Thread(target=finishSignal.wait)
                                finishSignalThread.start()

                                if broadcastType == "fifo":
                                    validation = FifoBroadcastValidation(processes, messages, logsDir)
                                else:
                                    validation = LCausalBroadcastValidation(processes, messages, logsDir, None)

                                hostsFile, configFile = validation.generateConfig()

                                try:
                                    # Start the processes and get their PIDs
                                    procs = startProcesses(processes, runscript, hostsFile.name, configFile.name, logsDir, 
                                                            sleepSend, sleepDeliver, timeoutAck, tri, numOutstanding, sleepOutStanding)

                                    # Create the stress test
                                    st = StressTest(procs,
                                                    testConfig['ST']['concurrency'],
                                                    testConfig['ST']['attempts'],
                                                    testConfig['ST']['attemptsDistribution'])

                                    for (logicalPID, procHandle) in procs:
                                        print("Process with logicalPID {} has PID {}".format(logicalPID, procHandle.pid), flush=True)


                                    initBarrierThread.join()
                                    print("All processes have been initialized.", flush=True)

                                    # st.run()
                                    # print("StressTest is complete.")


                                    # print("Resuming stopped processes.")
                                    # st.continueStoppedProcesses()

                                    print("Waiting until all running processes have finished broadcasting.", flush=True)
                                    finishSignalThread.join(1)

                                    if(not finishSignalThread.is_alive()):
                                        finishes = []
                                        for pid, startTs in OrderedDict(sorted(startTimesFuture.items())).items():
                                            print("Process {} finished broadcasting {} messages in {} ms".format(pid, messages, finishSignal.endTimestamps()[pid] - startTs), flush=True)
                                            finishes.append(finishSignal.endTimestamps()[pid] - startTs)
                                        avg_time = np.mean(np.array(finishes))
                                        print("Average time to finished broadcast: {} ms".format(avg_time), flush=True)
                                        tot_finishes.append(avg_time)
                                    else:
                                        tot_finishes.append(1000)
                                        print("Average time to finished broadcast: > 1 seconds", flush=True)


                                    numberDel = []
                                    time.sleep(10)
                                    st.terminateAllProcesses()
                                    time.sleep(3)
                                    for pid in range(1, processes+1):
                                        filePath = os.path.join(logsDir, 'proc{:02d}.stdout'.format(pid))
                                        with open(filePath) as f:
                                            for line in f:
                                                if "Total message delivered: " in line:
                                                    tot_del = line.split("Total message delivered: ")[-1].rstrip("\n").rstrip()
                                                    print("Process {} delivered {} messages".format(pid, tot_del), flush=True)
                                                    numberDel.append(int(tot_del))
                                                    break
                                    avg_del = np.mean(np.array(numberDel))
                                    print("Average number of delivered messages: {} ".format(avg_del), flush=True)
                                    tot_dels.append(avg_del)

                                    mutex = threading.Lock()

                                    def waitForProcess(logicalPID, procHandle, mutex):
                                        procHandle.wait()
                                        with mutex:
                                            print("Process {} exited with {}".format(logicalPID, procHandle.returncode), flush=True)

                                    # Monitor which processes have exited
                                    monitors = [threading.Thread(target=waitForProcess, args=(logicalPID, procHandle, mutex)) for (logicalPID, procHandle) in procs]
                                    [p.start() for p in monitors]
                                    [p.join() for p in monitors]
                                    if procs is not None:
                                        for _, p in procs:
                                            p.kill()

                                    # input('Hit `Enter` to validate the output')
                                    # print("Result of validation: {}".format(validation.checkAll()))
                                finally:
                                    if procs is not None:
                                        for _, p in procs:
                                            p.kill()
                            full_avg_del = np.mean(np.array(tot_dels))
                            if (full_avg_del > best_del):
                                best_del_dict["sleepSend"] = sleepSend
                                best_del_dict["sleepDeliver"] = sleepDeliver
                                best_del_dict["timeoutAck"] = timeoutAck
                                best_del_dict["tries"] = tri
                                best_del_dict["numOutstanding"] = numOutstanding
                                best_del_dict["sleepOutStanding"] = sleepOutStanding
                                print("Best del dict:", best_del_dict, flush=True)
                                print("Best del:", full_avg_del, flush=True)
                                best_del = full_avg_del
                            full_avg_finishes = np.mean(np.array(tot_finishes))
                            if (full_avg_finishes < best_finish):
                                best_finish_dict["sleepSend"] = sleepSend
                                best_finish_dict["sleepDeliver"] = sleepDeliver
                                best_finish_dict["timeoutAck"] = timeoutAck
                                best_finish_dict["tries"] = tri
                                best_finish_dict["numOutstanding"] = numOutstanding
                                best_finish_dict["sleepOutStanding"] = sleepOutStanding
                                best_finish = full_avg_finishes
                                print("Best finish dict:", best_finish_dict, flush=True)
                                print("Best finish:", full_avg_finishes, flush=True)

    print("Best del num: ", best_del, flush=True)
    print("Best del dict:", best_del_dict, flush=True)
    print("Best finish time: ", best_finish, flush=True)
    print("Best finish dict:", best_finish_dict, flush=True)
Пример #2
0
def main(processes, messages, runscript, broadcastType, logsDir, testConfig):
    # Set tc for loopback
    tc = TC(testConfig['TC'])
    print(tc)

    # Start the barrier
    initBarrier = barrier.Barrier(BARRIER_IP, BARRIER_PORT, processes)
    initBarrier.listen()
    startTimesFuture = initBarrier.startTimesFuture()

    initBarrierThread = threading.Thread(target=initBarrier.wait)
    initBarrierThread.start()

    # Start the finish signal
    finishSignal = finishedSignal.FinishedSignal(
        SIGNAL_IP, SIGNAL_PORT, processes)
    finishSignal.listen()
    finishSignalThread = threading.Thread(target=finishSignal.wait)
    finishSignalThread.start()

    if broadcastType == "fifo":
        validation = FifoBroadcastValidation(processes, messages, logsDir)
    else:
        validation = LCausalBroadcastValidation(
            processes, messages, logsDir, None)

    hostsFile, configFile = validation.generateConfig()

    try:
        # Start the processes and get their PIDs
        procs = startProcesses(processes, runscript,
                               hostsFile.name, configFile.name, logsDir)

        # Create the stress test
        st = StressTest(procs,
                        testConfig['ST']['concurrency'],
                        testConfig['ST']['attempts'],
                        testConfig['ST']['attemptsDistribution'])

        for (logicalPID, procHandle) in procs:
            print("Process with logicalPID {} has PID {}".format(
                logicalPID, procHandle.pid))

        initBarrierThread.join()
        print("All processes have been initialized.")

        st.run()
        print("StressTest is complete.")

        print("Resuming stopped processes.")
        st.continueStoppedProcesses()

        print("Waiting until all running processes have finished broadcasting.")
        finishSignalThread.join()

        for pid, startTs in OrderedDict(sorted(startTimesFuture.items())).items():
            print("Process {} finished broadcasting {} messages in {} ms".format(
                pid, messages, finishSignal.endTimestamps()[pid] - startTs))

        unterminated = st.remainingUnterminatedProcesses()
        if unterminated is not None:
            input('Hit `Enter` to terminate the remaining processes with logicalPIDs {}.'.format(
                unterminated))
            st.terminateAllProcesses()

        mutex = threading.Lock()

        def waitForProcess(logicalPID, procHandle, mutex):
            procHandle.wait()

            with mutex:
                print("Process {} exited with {}".format(
                    logicalPID, procHandle.returncode))

        # Monitor which processes have exited
        monitors = [threading.Thread(target=waitForProcess, args=(
            logicalPID, procHandle, mutex)) for (logicalPID, procHandle) in procs]
        [p.start() for p in monitors]
        [p.join() for p in monitors]

        input('Hit `Enter` to validate the output')
        print("Result of validation: {}".format(validation.checkAll()))

    finally:
        if procs is not None:
            for _, p in procs:
                p.kill()
Пример #3
0
def main(processes, messages_avoided, runscript, broadcastType, logsDir, testConfig):
    # Set tc for loopback
    # tc = TC(testConfig['TC'])
    # print(tc)

    # windowSize = [100, 500, 1000, 2500, 5000, 10000, 20000]
    # initThresh = [100, 500, 1000, 5000, 10000, 50000]
    messages_list = [100, 500, 1000, 3000, 5000, 10000, 15000, 30000, 100000, 1000000]
    waiting_time = [60, 60, 300, 600, 600, 600, 1200, 1200, 300, 600]

    for i, messages in enumerate(messages_list):
        tot_finishes = []
        tot_dels = []
        print("tentative:", i)
        print("Messages:", messages)
        print("Will wait:", waiting_time[i])
        # Start the barrier
        initBarrier = barrier.Barrier(BARRIER_IP, BARRIER_PORT, processes)
        initBarrier.listen()
        startTimesFuture = initBarrier.startTimesFuture()

        initBarrierThread = threading.Thread(target=initBarrier.wait)
        initBarrierThread.start()

        # Start the finish signal
        finishSignal = finishedSignal.FinishedSignal(SIGNAL_IP, SIGNAL_PORT, processes)
        finishSignal.listen()
        finishSignalThread = threading.Thread(target=finishSignal.wait)
        finishSignalThread.start()

        if broadcastType == "fifo":
            validation = FifoBroadcastValidation(processes, messages, logsDir)
        else:
            validation = LCausalBroadcastValidation(processes, messages, logsDir, None)

        hostsFile, configFile = validation.generateConfig()

        try:
            # Start the processes and get their PIDs
            procs = startProcesses(processes, runscript, hostsFile.name, configFile.name, logsDir, i)

            # Create the stress test
            st = StressTest(procs,
                            testConfig['ST']['concurrency'],
                            testConfig['ST']['attempts'],
                            testConfig['ST']['attemptsDistribution'])

            for (logicalPID, procHandle) in procs:
                print("Process with logicalPID {} has PID {}".format(logicalPID, procHandle.pid), flush=True)


            initBarrierThread.join()
            print("All processes have been initialized.", flush=True)

            #st.run()
            print("StressTest is complete.")


            print("Resuming stopped processes.")
            st.continueStoppedProcesses()

            print("Waiting until all running processes have finished broadcasting.", flush=True)
            finishSignalThread.join(1)

            if(not finishSignalThread.is_alive()):
                finishes = []
                for pid, startTs in OrderedDict(sorted(startTimesFuture.items())).items():
                    print("Process {} finished broadcasting {} messages in {} ms".format(pid, messages, finishSignal.endTimestamps()[pid] - startTs), flush=True)
                    finishes.append(finishSignal.endTimestamps()[pid] - startTs)
                avg_time = np.mean(np.array(finishes))
                print("Average time to finished broadcast: {} ms".format(avg_time), flush=True)
                tot_finishes.append(avg_time)
            else:
                tot_finishes.append(1000)
                print("Average time to finished broadcast: > 1 seconds", flush=True)


            numberDel = []
            time.sleep(waiting_time[i])
            st.terminateAllProcesses()
            time.sleep(3)
            for pid in range(1, processes+1):
                filePath = os.path.join(logsDir, str(i), 'proc{:02d}.stdout'.format(pid))
                with open(filePath) as f:
                    for line in f:
                        if "Total message delivered: " in line:
                            tot_del = line.split("Total message delivered: ")[-1].rstrip("\n").rstrip()
                            print("Process {} delivered {} messages".format(pid, tot_del), flush=True)
                            numberDel.append(int(tot_del))
                            break
            avg_del = np.mean(np.array(numberDel))
            print("Average number of delivered messages: {} ".format(avg_del), flush=True)
            tot_dels.append(avg_del)

            mutex = threading.Lock()

            def waitForProcess(logicalPID, procHandle, mutex):
                procHandle.wait()
                with mutex:
                    print("Process {} exited with {}".format(logicalPID, procHandle.returncode), flush=True)

            # Monitor which processes have exited
            monitors = [threading.Thread(target=waitForProcess, args=(logicalPID, procHandle, mutex)) for (logicalPID, procHandle) in procs]
            [p.start() for p in monitors]
            [p.join() for p in monitors]
            if procs is not None:
                for _, p in procs:
                    p.kill()

            # input('Hit `Enter` to validate the output')
            # print("Result of validation: {}".format(validation.checkAll()))
        finally:
            if procs is not None:
                for _, p in procs:
                    p.kill()
        full_avg_del = np.mean(np.array(tot_dels))
        print(full_avg_del, flush=True)
        full_avg_finishes = np.mean(np.array(tot_finishes))
        print(full_avg_finishes, flush=True)