示例#1
0
 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)
示例#2
0
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:
                # refresh connections so load can balance among cluster nodes even if the cluster size changes
                timeout = time.time() + connection_duration_in_seconds
                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 database. Sleeping for 10 seconds.")
            time.sleep(10)