def add_vehicles_helper(sess, chunk, n): owners = sess.query(User).filter_by(city=city).all() vehicles = [] for i in range(chunk, n): vehicle_type = MovRGenerator.generate_random_vehicle() vehicles.append(Vehicle(id=MovRGenerator.generate_uuid(), type=vehicle_type, city=city, current_location=datagen.address(), owner_id=(random.choice(owners)).id, status=MovRGenerator.get_vehicle_availability(), ext=MovRGenerator.generate_vehicle_metadata(vehicle_type))) sess.bulk_save_objects(vehicles)
def simulate_movr_load(conn_string, cities, movr_objects, active_rides, read_percentage, follower_reads, connection_duration_in_seconds, echo_sql=False): datagen = Faker() while True: logging.debug( "creating a new connection to %s, which will reset in %d seconds", conn_string, connection_duration_in_seconds) try: with MovR(conn_string, echo=echo_sql) as movr: timeout = time.time( ) + connection_duration_in_seconds #refresh connections so load can balance among cluster nodes even if the cluster size changes while True: if TERMINATE_GRACEFULLY: logging.debug("Terminating thread.") return if time.time() > timeout: break active_city = random.choice(cities) if random.random() < read_percentage: # simulate user loading screen start = time.time() movr.get_vehicles(active_city, follower_reads, 25) stats.add_latency_measurement("get vehicles", time.time() - start) else: # every write tick, simulate the various vehicles updating their locations if they are being used for rides for ride in active_rides[0:10]: latlong = MovRGenerator.generate_random_latlong() start = time.time() movr.update_ride_location(ride['city'], ride_id=ride['id'], lat=latlong['lat'], long=latlong['long']) stats.add_latency_measurement( ACTION_UPDATE_RIDE_LOC, time.time() - start) #do write operations randomly if random.random() < .03: # simulate a movr marketer creating a new promo code start = time.time() promo_code = movr.create_promo_code( code="_".join(datagen.words(nb=3)) + "_" + str(time.time()), description=datagen.paragraph(), expiration_time=datetime.datetime.now() + datetime.timedelta(days=random.randint(0, 30)), rules={ "type": "percent_discount", "value": "10%" }) stats.add_latency_measurement( ACTION_NEW_CODE, time.time() - start) movr_objects["global"].get("promo_codes", []).append(promo_code) elif random.random() < .1: # simulate a user applying a promo code to her account start = time.time() movr.apply_promo_code( active_city, random.choice(movr_objects["local"] [active_city]["users"])['id'], random.choice( movr_objects["global"]["promo_codes"])) stats.add_latency_measurement( ACTION_APPLY_CODE, time.time() - start) elif random.random() < .3: # simulate new signup start = time.time() new_user = movr.add_user( active_city, datagen.name(), datagen.address(), datagen.credit_card_number()) stats.add_latency_measurement( ACTION_NEW_USER, time.time() - start) movr_objects["local"][active_city]["users"].append( new_user) elif random.random() < .1: # simulate a user adding a new vehicle to the population start = time.time() new_vehicle = movr.add_vehicle( active_city, owner_id=random.choice( movr_objects["local"][active_city] ["users"])['id'], type=MovRGenerator.generate_random_vehicle(), vehicle_metadata=MovRGenerator. generate_vehicle_metadata(type), status=MovRGenerator.get_vehicle_availability( ), current_location=datagen.address()) stats.add_latency_measurement( ACTION_ADD_VEHICLE, time.time() - start) movr_objects["local"][active_city][ "vehicles"].append(new_vehicle) elif random.random() < .5: # simulate a user starting a ride start = time.time() ride = movr.start_ride( active_city, random.choice(movr_objects["local"] [active_city]["users"])['id'], random.choice(movr_objects["local"] [active_city]["vehicles"])['id']) stats.add_latency_measurement( ACTION_START_RIDE, time.time() - start) active_rides.append(ride) else: if len(active_rides): #simulate a ride ending ride = active_rides.pop() start = time.time() movr.end_ride(ride['city'], ride['id']) stats.add_latency_measurement( ACTION_END_RIDE, time.time() - start) except DBAPIError: logging.error("lost connection to the db. sleeping for 10 seconds") time.sleep(10)