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); }
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; }
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; }
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; }
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; }
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]; }