static void ngx_http_tfs_check_exit_worker(ngx_cycle_t *cycle) { ngx_int_t i; ngx_http_tfs_main_conf_t *tmcf; ngx_http_tfs_tair_instance_t *dup_instance; tmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_tfs_module); if (tmcf == NULL) { return; } /* destroy duplicate server */ for (i = 0; i < NGX_HTTP_TFS_MAX_CLUSTER_COUNT; i++) { dup_instance = &tmcf->dup_instances[i]; if (dup_instance->server != NULL) { ngx_http_etair_destory_server(dup_instance->server, (ngx_cycle_t *) ngx_cycle); } } /* destroy remote block cache server */ if (tmcf->remote_block_cache_instance.server != NULL) { ngx_http_etair_destory_server(tmcf->remote_block_cache_instance.server, (ngx_cycle_t *) ngx_cycle); } }
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; }
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; }