Esempio n. 1
0
    def test_a_request_latency(self):
        """[Sequential consistency] Test with a workload that has geo-locality and measures read and write latencies"""

        assert self.lns_geo_file is not None

        self.ns = 24
        self.lns = 24

        total_time = 0
        # write workload. decide experiment time
        lns_ids_int = range(self.ns, self.ns + self.lns)
        lns_ids = [str(lns_id) for lns_id in lns_ids_int]

        num_names = 1000
        prefix = 'test_name'
        # create new trace
        create_empty_trace_files(lns_ids, self.trace_folder)

        # delay = (self.ns + self.lns) * 1000  # (wait so that each node can ping all nodes and get their addresses)
        delay = 10000
        append_request_to_all_files([delay, RequestType.DELAY], lns_ids, self.trace_folder)
        total_time += delay / 1000
        # set a request rate
        add_req_rate = 50

        append_request_to_all_files([add_req_rate, RequestType.RATE], lns_ids, self.trace_folder)

        total_time += num_names / len(lns_ids) / add_req_rate

        gen_add_requests(self.trace_folder, number_names=num_names, append_to_file=True, lns_ids=lns_ids,
                         name_prefix=prefix)

        delay = 20000
        append_request_to_all_files([delay, RequestType.DELAY], lns_ids, self.trace_folder)
        total_time += delay / 1000
        read_write_req_rate = 170

        reads_per_epoch_per_name = 800
        writes_per_epoch_per_name = 400
        total_lookups = 0
        total_updates = 0
        num_geo_locality_changes = 3
        for i in range(num_geo_locality_changes):
            num_lookups = num_names * reads_per_epoch_per_name
            num_updates = num_names * writes_per_epoch_per_name
            expected_time = (num_lookups + num_updates) / len(lns_ids) / read_write_req_rate
            print 'Read write send time', expected_time
            actual_lookups, actual_updates = gen_geolocality_trace(self.trace_folder, self.lns_geo_file,
                                                                   number_names=num_names, num_lookups=num_lookups,
                                                                   num_updates=num_updates, append_to_file=True,
                                                                   lns_ids=lns_ids, name_prefix=prefix,
                                                                   exp_duration=expected_time,
                                                                   locality_parameter=4,
                                                                   locality_percent=1.0,
                                                                   num_lns=self.lns,
                                                                   seed=(i+1000))
            total_time += expected_time
            total_lookups += actual_lookups
            total_updates += actual_updates

        self.config_parse.set(ConfigParser.DEFAULTSECT, 'experiment_run_time', str(total_time))
        print 'Total time: ', total_time
        output_stats = self.run_exp_multi_lns()
        self.assertEqual(output_stats.requests, num_names + total_lookups + total_updates,
                         "Total number of requests mismatch")
        self.assertEqual(output_stats.success, num_names + total_lookups + total_updates,
                         "Successful requests mismatch")
        self.assertEqual(output_stats.add, num_names, "Successful adds mismatch")
        self.assertEqual(output_stats.read, total_lookups, "Successful reads mismatch")
        self.assertEqual(output_stats.write, total_updates, "Successful writes mismatch")
Esempio n. 2
0
    def run_exp_geo_locality(self, num_ns, num_lns, num_names, read_write_req_rate,
                             reads_per_epoch_per_name, writes_per_epoch_per_name, num_geo_locality_changes,
                             initial_delay=10, placement_file=None):

        assert self.lns_geo_file is not None
        self.config_parse.set(ConfigParser.DEFAULTSECT, 'emulate_ping_latencies', str(True))
        self.emulation = 'geographic'

        self.ns = num_ns
        self.lns = num_lns

        total_time = 0
        # write workload. decide experiment time
        lns_ids_int = range(self.ns, self.ns + self.lns)
        lns_ids = [str(lns_id) for lns_id in lns_ids_int]

        # num_names = 1000
        prefix = 'test_name'
        # create new trace
        create_empty_trace_files(lns_ids, self.trace_folder)

        # delay = (self.ns + self.lns) * 1000  # (wait so that each node can ping all nodes and get their addresses)
        append_request_to_all_files([initial_delay*1000, RequestType.DELAY], lns_ids, self.trace_folder)
        total_time += initial_delay
        # set a request rate
        add_req_rate = read_write_req_rate/4

        append_request_to_all_files([add_req_rate, RequestType.RATE], lns_ids, self.trace_folder)

        total_time += num_names / len(lns_ids) / add_req_rate

        if placement_file is None:
            gen_add_requests(self.trace_folder, number_names=num_names, append_to_file=True, lns_ids=lns_ids,
                             name_prefix=prefix)
        else:
            gen_add_requests_based_on_placement_file(self.trace_folder, placement_file, lns_ids, append_to_file=True,
                                                     name_prefix=prefix)
        delay = 20  # sec
        append_request_to_all_files([delay * 1000, RequestType.DELAY], lns_ids, self.trace_folder)
        total_time += delay

        total_lookups = 0
        total_updates = 0
        # num_geo_locality_changes = 1
        for i in range(num_geo_locality_changes):
            num_lookups = num_names * reads_per_epoch_per_name
            num_updates = num_names * writes_per_epoch_per_name
            expected_time = (num_lookups + num_updates) / 1.0 / len(lns_ids) / read_write_req_rate
            print 'Expected time', expected_time
            actual_lookups, actual_updates = gen_geolocality_trace(self.trace_folder, self.lns_geo_file,
                                                                   number_names=num_names, num_lookups=num_lookups,
                                                                   num_updates=num_updates, append_to_file=True,
                                                                   lns_ids=lns_ids, name_prefix=prefix,
                                                                   exp_duration=expected_time,
                                                                   locality_parameter=4,
                                                                   locality_percent=1.0,
                                                                   num_lns=self.lns,
                                                                   seed=(i+1000))
            total_time += expected_time
            total_lookups += actual_lookups
            total_updates += actual_updates

        self.config_parse.set(ConfigParser.DEFAULTSECT, 'experiment_run_time', str(total_time))
        print 'Total time: ', total_time

        output_stats = self.run_exp_multi_lns()
        self.assertEqual(output_stats.requests, num_names + total_lookups + total_updates,
                         "Total number of requests mismatch")
        self.assertEqual(output_stats.success, num_names + total_lookups + total_updates,
                         "Successful requests mismatch")
        self.assertEqual(output_stats.add, num_names, "Successful adds mismatch")
        self.assertEqual(output_stats.read, total_lookups, "Successful reads mismatch")
        self.assertEqual(output_stats.write, total_updates, "Successful writes mismatch")