Esempio n. 1
0
    async def create_entry(ctx, db: AioRedis):
        """
        Creates a rate limiter entry.

        @param ctx: (object) data to be inserted
        @param db: (object) db connection
        """
        ctx['_id'] = str(bson.ObjectId())
        await asyncio.gather(
            RateLimiter._set_indexes(ctx, db),
            db.hmset_dict(ctx['_id'], ctx),
            db.sadd(entry_set, ctx['_id']),
            db.expire(ctx['_id'], int(ctx['timeout']))
        )
Esempio n. 2
0
async def create_redis_rate_limiter(server_id: str,
                                    redis: Redis) -> RedisRateLimiter:
    server_key = f'api-server:{server_id}'
    initialize_futures = [
        redis.script_load(_ACQUIRE_CONNECTION_SLOT),
        redis.script_load(_RELEASE_CONNECTION_SLOT),
        redis.script_load(_INCR_AND_EXPIRE_IF_NEW),
        redis.set(server_key, 'true'),
        redis.expire(server_key, SERVER_LIVENESS_EXPIRATION_SECONDS),
    ]
    [acquire_sha, release_sha, incr_expire_sha,
     *_] = await asyncio.gather(*initialize_futures)

    return RedisRateLimiter(
        server_id,
        redis,
        acquire_connection_sha=acquire_sha,
        release_connection_sha=release_sha,
        incr_expire_sha=incr_expire_sha,
    )
Esempio n. 3
0
async def _delete(redis_cli: Redis, ride_id: str, timeout: int) -> None:
    ride = await get(redis_cli, ride_id)
    if ride is not None:
        keys = [_get_ride_key(ride_id, passenger.profile.user_id) for passenger in ride.passengers]
        await asyncio.gather(*[redis_cli.expire(key, timeout) for key in keys])