void
ngx_http_upstream_free_idempotent_peer(ngx_peer_connection_t *pc, void *data,
    ngx_uint_t state)
{
    ngx_http_upstream_free_round_robin_peer(pc, data, state);

    ngx_http_upstream_idempotent_peer_data_t  *rrp = data;

    if (rrp->method == NGX_HTTP_POST) {
        pc->tries = 0;
    }
}
void
ngx_http_upstream_free_zeromq_peer(ngx_peer_connection_t *pc, void *data,
    ngx_uint_t state)
{
    ngx_http_upstream_zeromq_peer_data_t  *zp = data;

    ngx_http_upstream_free_round_robin_peer(pc, data, state);

    if (pc->connection) {
#if defined(nginx_version) && (nginx_version >= 1001004)
        if (pc->connection->pool) {
            ngx_destroy_pool(pc->connection->pool);
        }
#endif

        pc->connection->data = zp->zmq;
        ngx_zeromq_close(pc->connection);
        pc->connection = NULL;
    }
}
void
ngx_http_lua_balancer_free_peer(ngx_peer_connection_t *pc, void *data,
    ngx_uint_t state)
{
    ngx_http_lua_balancer_peer_data_t  *bp = data;

    if (bp->sockaddr && bp->socklen) {
        bp->last_peer_state = (int) state;

        if (pc->tries) {
            pc->tries--;
        }

        return;
    }

    /* fallback */

    ngx_http_upstream_free_round_robin_peer(pc, data, state);
}
void
ngx_http_lua_balancer_free_peer(ngx_peer_connection_t *pc, void *data,
    ngx_uint_t state)
{
    ngx_http_lua_balancer_peer_data_t  *bp = data;

    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
                   "lua balancer free peer, tries: %ui", pc->tries);

    if (bp->sockaddr && bp->socklen) {
        bp->last_peer_state = (int) state;

        if (pc->tries) {
            pc->tries--;
        }

        return;
    }

    /* fallback */

    ngx_http_upstream_free_round_robin_peer(pc, data, state);
}