ngx_http_subrequest_peer_t * __get_peer_by_args(ngx_http_request_t *r)
{
    char * key = ngx_http_get_param_val(&r->args, "key", r->pool);
    if (!key)
    {
        return NULL;
    }
    return ngx_http_get_first_peer(hustdb_ha_get_readlist(key));
}
static ngx_http_subrequest_peer_t * __get_readable_peer(ngx_bool_t key_in_body, ngx_http_request_t *r)
{
    if (key_in_body)
    {
        char * key = hustdb_ha_get_key_from_body(r);
        if (!key)
        {
            return NULL;
        }
        return ngx_http_get_first_peer(hustdb_ha_get_readlist(key));
    }
    return __get_peer_by_args(r);
}
ngx_bool_t hustdb_ha_get_readable_peer(size_t buckets, size_t bucket, hustdb_ha_bucket_buf_t * result)
{
    for (result->bucket = bucket; result->bucket < buckets; ++result->bucket)
    {
        hustdb_ha_bucket_t * bk = hustdb_ha_get_bucket(result->bucket);
        if (bk)
        {
            result->peer = ngx_http_get_first_peer(bk->readlist);
            if (result->peer)
            {
                return true;
            }
        }
        ++result->bad_buckets;
    }
    return false;
}