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")
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")