Пример #1
0
void hustdb_ha_init_peer_count(ngx_pool_t * pool)
{
    int count = (int) ngx_http_get_backend_count();
    g_peer_count.data = ngx_palloc(pool, 32);
    sprintf((char *)g_peer_count.data, "%d", count);
    g_peer_count.len = strlen((const char *)g_peer_count.data);
}
Пример #2
0
ngx_http_upstream_rr_peer_t * hustmq_ha_decode_ack_peer(ngx_str_t * ack_peer, ngx_pool_t * pool)
{
    char * endptr;
    uint64_t index = strtoull((const char *)ack_peer->data, &endptr, 10);
    size_t count = ngx_http_get_backend_count();
    if (index > count - 1)
    {
        return NULL;
    }
    return g_hash_table[index];
}
char * hustdb_ha_get_status()
{
    if (!g_libsync)
    {
        return NULL;
    }
    typedef char * (*libsync_get_status_t)(int hosts_size);
    libsync_get_status_t get_status = dlsym(g_libsync, "get_status");
    char * error = dlerror();
    if(!error)
    {
        return get_status(ngx_http_get_backend_count());
    }
    return NULL;
}
Пример #4
0
ngx_str_t hustmq_ha_encode_ack_peer(ngx_str_t * peer_name, ngx_pool_t * pool)
{
    ngx_str_t ack_peer = { 0, 0 };
    ngx_http_upstream_rr_peer_t * peer = ngx_http_peer_dict_get(&g_peer_dict, (const char *)peer_name->data);
    size_t count = ngx_http_get_backend_count();
    size_t i = 0;
    for (i = 0; i < count; ++i)
    {
        if (g_hash_table[i] == peer)
        {
            ack_peer.data = ngx_palloc(pool, 21);
            sprintf((char *)ack_peer.data, "%lu", i);
            ack_peer.len = strlen((const char *)ack_peer.data);
            return ack_peer;
        }
    }
    return ack_peer;
}
Пример #5
0
ngx_int_t __first_put_handler(ngx_str_t * backend_uri, ngx_http_request_t *r)
{
    ngx_str_t queue = hustmq_ha_get_queue(r);
    if (!queue.data)
    {
        return NGX_ERROR;
    }

    hustmq_ha_queue_dict_t * queue_dict = hustmq_ha_get_queue_dict();
    if (!queue_dict)
    {
        return NGX_ERROR;
    }

	if (queue_dict->dict.ref && !hustmq_ha_put_queue_item_check(queue_dict, &queue))
    {
        return ngx_http_send_response_imp(NGX_HTTP_NOT_FOUND, NULL, r);
    }
    size_t peer_count = ngx_http_get_backend_count();
    if (peer_count < 1)
    {
        return NGX_ERROR;
    }
    hustmq_ha_put_ctx_t * ctx = ngx_palloc(r->pool, sizeof(hustmq_ha_put_ctx_t));
    if (!ctx)
    {
        return NGX_ERROR;
    }
    memset(ctx, 0, sizeof(hustmq_ha_put_ctx_t));
    ngx_http_set_addon_module_ctx(r, ctx);

    ctx->base.backend_uri = backend_uri;

    ctx->peer_count = peer_count;
    ctx->count = 0;

    ngx_int_t rc = ngx_http_read_client_request_body(r, __post_body_handler);
    if ( rc >= NGX_HTTP_SPECIAL_RESPONSE )
    {
        return rc;
    }
    return NGX_DONE;
}
Пример #6
0
ngx_bool_t hustmq_ha_init_hash(ngx_pool_t * pool, ngx_http_upstream_rr_peers_t * peers)
{
    if (!pool || !peers || !peers->peer)
    {
        return false;
    }
    size_t backends = ngx_http_get_backend_count();
    g_hash_table = ngx_palloc(pool, backends * sizeof(ngx_http_upstream_rr_peer_t *));
    if (!g_hash_table)
    {
        return false;
    }
    size_t i = 0;
    ngx_http_upstream_rr_peer_t * peer = peers->peer;
    while (peer)
    {
        g_hash_table[i++] = peer;
        peer = peer->next;
    }
    return true;
}
Пример #7
0
ngx_http_upstream_rr_peer_t * hustmq_ha_get_peer(ngx_str_t * queue)
{
    ngx_uint_t hash = ngx_hash_key(queue->data, queue->len);
    hash = hash % ngx_http_get_backend_count();
    return g_hash_table[hash];
}