예제 #1
0
ngx_int_t
ngx_http_tfs_get_dedup_instance(ngx_http_tfs_dedup_ctx_t *ctx,
    ngx_http_tfs_tair_server_addr_info_t *server_addr_info,
    uint32_t server_addr_hash)
{
    ngx_str_t                     *st;
    ngx_int_t                      rc, i;
    ngx_array_t                    config_server;
    ngx_http_tfs_t                *t;
    ngx_http_etair_server_conf_t  *server;
    ngx_http_tfs_tair_instance_t  *instance;

    t = ctx->data;

    for (i = 0; i < NGX_HTTP_TFS_MAX_CLUSTER_COUNT; i++) {
        instance = &t->main_conf->dup_instances[i];

        if (instance->server == NULL) {
            break;
        }

        if (instance->server_addr_hash == server_addr_hash) {
            ctx->tair_instance = instance;
            return NGX_OK;
        }
    }

    /* not found && full, clear */
    if (i > NGX_HTTP_TFS_MAX_CLUSTER_COUNT) {
        for (i = 0; i < NGX_HTTP_TFS_MAX_CLUSTER_COUNT; i++) {
            instance = &t->main_conf->dup_instances[i];
            if (instance->server != NULL) {
                ngx_http_etair_destory_server(instance->server,
                                              (ngx_cycle_t *) ngx_cycle);
                instance->server = NULL;
            }
        }
        instance = &t->main_conf->dup_instances[0];
    }

    rc = ngx_array_init(&config_server, t->pool,
                        NGX_HTTP_TFS_TAIR_CONFIG_SERVER_COUNT,
                        sizeof(ngx_str_t));
    if (rc == NGX_ERROR) {
        return NGX_ERROR;
    }

    for (i = 0; i < NGX_HTTP_TFS_TAIR_CONFIG_SERVER_COUNT; i++) {
        if (server_addr_info->server[i].len > 0 ) {
            st = (ngx_str_t *) ngx_array_push(&config_server);
            *st = server_addr_info->server[i];
        }
    }

    server = &server_addr_info->server[NGX_HTTP_TFS_TAIR_CONFIG_SERVER_COUNT];
    server = ngx_http_etair_create_server(server,
                                          &config_server,
                                          t->main_conf->tair_timeout,
                                          (ngx_cycle_t *) ngx_cycle);
    if (server == NULL) {
        return NGX_ERROR;
    }

    instance->server = server;
    instance->server_addr_hash = server_addr_hash;
    instance->area = server_addr_info->area;
    ctx->tair_instance = instance;

    return NGX_OK;
}
예제 #2
0
ngx_int_t
ngx_http_tfs_get_remote_block_cache_instance(
    ngx_http_tfs_remote_block_cache_ctx_t *ctx,
    ngx_str_t *server_addr)
{
    size_t                                server_addr_len;
    uint32_t                              server_addr_hash;
    ngx_int_t                             rc, i;
    ngx_str_t                            *st, *group_name;
    ngx_array_t                           config_server;
    ngx_http_tfs_t                       *t;
    ngx_http_tfs_tair_instance_t         *instance;
    ngx_http_tfs_tair_server_addr_info_t  server_addr_info;

    if (server_addr->len == 0
        || server_addr->data == NULL)
    {
        return NGX_ERROR;
    }

    t = ctx->data;
    server_addr_len = server_addr->len;
    server_addr_hash = ngx_murmur_hash2(server_addr->data, server_addr_len);

    instance = ctx->tair_instance;
    if (instance->server != NULL) {
        if (instance->server_addr_hash == server_addr_hash) {
            return NGX_OK;
        }

        ngx_http_etair_destory_server(instance->server,
                                      (ngx_cycle_t *) ngx_cycle);
        instance->server = NULL;
    }

    rc = ngx_http_tfs_parse_tair_server_addr_info(&server_addr_info,
                                                  server_addr->data,
                                                  server_addr_len,
                                                  t->pool, 0);
    if (rc == NGX_ERROR) {
        return NGX_ERROR;
    }

    rc = ngx_array_init(&config_server, t->pool,
                        NGX_HTTP_TFS_TAIR_CONFIG_SERVER_COUNT,
                        sizeof(ngx_str_t));
    if (rc == NGX_ERROR) {
        return NGX_ERROR;
    }

    for (i = 0; i < NGX_HTTP_TFS_TAIR_CONFIG_SERVER_COUNT; i++) {
        if (server_addr_info.server[i].len > 0 ) {
            st = (ngx_str_t *) ngx_array_push(&config_server);
            *st = server_addr_info.server[i];
        }
    }

    group_name = &server_addr_info.server[NGX_HTTP_TFS_TAIR_CONFIG_SERVER_COUNT];
    instance->server = ngx_http_etair_create_server(group_name,
                                                    &config_server,
                                                    t->main_conf->tair_timeout,
                                                    (ngx_cycle_t *) ngx_cycle);
    if (instance->server == NULL) {
        return NGX_ERROR;
    }
    instance->server_addr_hash = server_addr_hash;
    instance->area = server_addr_info.area;

    return NGX_OK;
}