Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
262 changes: 262 additions & 0 deletions nginx-1.25.3.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,262 @@
diff --git src/core/ngx_connection.h src/core/ngx_connection.h
index 84dd804..21e7c4e 100644
--- src/core/ngx_connection.h
+++ src/core/ngx_connection.h
@@ -200,6 +200,9 @@ struct ngx_connection_s {
#if (NGX_THREADS || NGX_COMPAT)
ngx_thread_task_t *sendfile_task;
#endif
+#if (T_NGX_MULTI_UPSTREAM)
+ void *multi_c;
+#endif
};


diff --git src/http/ngx_http_request.h src/http/ngx_http_request.h
index cc3b7c0..ac1ddec 100644
--- src/http/ngx_http_request.h
+++ src/http/ngx_http_request.h
@@ -602,6 +602,13 @@ struct ngx_http_request_s {

unsigned http_minor:16;
unsigned http_major:16;
+
+#if (T_NGX_MULTI_UPSTREAM)
+ ngx_queue_t *multi_item;
+ ngx_queue_t *backend_r;
+ ngx_queue_t waiting_queue;
+ ngx_flag_t waiting;
+#endif
};


diff --git src/http/ngx_http_upstream.c src/http/ngx_http_upstream.c
index 2be233c..92ed8d7 100644
--- src/http/ngx_http_upstream.c
+++ src/http/ngx_http_upstream.c
@@ -9,6 +9,10 @@
#include <ngx_core.h>
#include <ngx_http.h>

+#if (T_NGX_MULTI_UPSTREAM)
+#include <ngx_http_multi_upstream_module.h>
+#endif
+

#if (NGX_HTTP_CACHE)
static ngx_int_t ngx_http_upstream_cache(ngx_http_request_t *r,
@@ -1531,6 +1535,12 @@ ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,
}


+#if (T_NGX_MULTI_UPSTREAM)
+
+#include "ngx_http_multi_upstream.c"
+
+#endif /* T_NGX_MULTI_UPSTREAM */
+
static void
ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)
{
@@ -1592,6 +1602,47 @@ ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)

c = u->peer.connection;

+#if (T_NGX_MULTI_UPSTREAM)
+ if (u->multi) {
+ if (!(u->multi_mode & NGX_MULTI_UPS_SUPPORT_MULTI)) {
+ ngx_http_multi_upstream_finalize_request(c,
+ NGX_HTTP_INTERNAL_SERVER_ERROR);
+ ngx_log_error(NGX_LOG_ERR, c->log, 0,
+ "multi: upstream configured multi, but handler no support");
+ return;
+ }
+
+ if (rc == NGX_AGAIN) { //first real connect
+ c->read->handler = ngx_http_multi_upstream_connect_handler;
+ c->write->handler = ngx_http_multi_upstream_connect_handler;
+ ngx_add_timer(c->write, u->conf->connect_timeout);
+ ngx_log_error(NGX_LOG_INFO, c->log, 0,
+ "multi: connect new to backend %p", c);
+ } else if (rc == NGX_DONE) { //use exist connection
+ if (ngx_multi_connected(c)) {
+ ngx_log_error(NGX_LOG_INFO, c->log, 0, "multi: connect reuse %p", c);
+
+ ngx_http_multi_upstream_init_request(c, r);
+ ngx_http_multi_upstream_process(c, 1);
+ } else {
+ ngx_log_error(NGX_LOG_ERR, c->log, 0, "multi: connect reuse unfinished %p", c);
+ }
+ } else {
+ ngx_log_error(NGX_LOG_ERR, c->log, 0,
+ "multi: connect return %i error", rc);
+ }
+
+ return;
+ } else if ((u->multi_mode & NGX_MULTI_UPS_NEED_MULTI) == NGX_MULTI_UPS_NEED_MULTI) {
+ ngx_http_upstream_finalize_request(r, u,
+ NGX_HTTP_INTERNAL_SERVER_ERROR);
+ ngx_log_error(NGX_LOG_ERR, c->log, 0,
+ "multi: need multi, but upstream not support, "
+ "maybee need configuration 'multi' in upstream");
+ return;
+ }
+#endif
+
c->requests++;

c->data = r;
@@ -1826,6 +1877,13 @@ ngx_http_upstream_ssl_handshake(ngx_http_request_t *r, ngx_http_upstream_t *u,
u->output.sendfile = 0;
}

+#if (T_NGX_MULTI_UPSTREAM)
+ if (u->multi) {
+ ngx_http_multi_upstream_connect_init(c);
+ return;
+ }
+#endif
+
c->write->handler = ngx_http_upstream_handler;
c->read->handler = ngx_http_upstream_handler;

@@ -2152,6 +2210,14 @@ ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u,
ngx_post_event(c->read, &ngx_posted_events);
}

+#if (T_NGX_MULTI_UPSTREAM)
+ if (u->multi && r->connection != u->peer.connection && !r->waiting) {
+ ngx_multi_connection_t *multi_c = ngx_get_multi_connection(c);
+ ngx_queue_insert_tail(&multi_c->waiting_list, &r->waiting_queue);
+ r->waiting = 1;
+ }
+#endif
+
return;
}

@@ -2193,6 +2259,12 @@ ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u,
ngx_add_timer(c->read, u->read_timeout);

if (c->read->ready) {
+#if (T_NGX_MULTI_UPSTREAM)
+ if (u->multi) {
+ ngx_http_multi_upstream_read_handler(c);
+ return;
+ }
+#endif
ngx_http_upstream_process_header(r, u);
return;
}
@@ -2230,6 +2302,11 @@ ngx_http_upstream_send_request_body(ngx_http_request_t *r,
u->request_body_blocked = 1;

} else {
+#if T_NGX_MULTI_UPSTREAM
+ if (u->multi && rc == NGX_OK) {
+ ngx_multi_clean_leak(u->peer.connection);
+ }
+#endif
u->request_body_blocked = 0;
}

@@ -3667,6 +3744,13 @@ ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r)
return;
}

+#if (T_NGX_MULTI_UPSTREAM)
+ if (u->multi) {
+ ngx_http_multi_upstream_process_non_buffered_request(r);
+ return;
+ }
+#endif
+
ngx_http_upstream_process_non_buffered_request(r, 1);
}

@@ -4338,6 +4422,16 @@ ngx_http_upstream_next(ngx_http_request_t *r, ngx_http_upstream_t *u,
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"http next upstream, %xi", ft_type);

+#if (T_NGX_MULTI_UPSTREAM)
+ if (u->multi && ngx_http_multi_connection_fake(r)) {
+ ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+ "multi: http next upstream fake_r %p", r);
+
+ ngx_http_multi_upstream_next(r->connection, ft_type);
+ return;
+ }
+#endif
+
if (u->peer.sockaddr) {

if (u->peer.connection) {
@@ -4505,6 +4599,16 @@ ngx_http_upstream_finalize_request(ngx_http_request_t *r,
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"finalize http upstream request: %i", rc);

+#if (T_NGX_MULTI_UPSTREAM)
+ if (u->multi && ngx_http_multi_connection_fake(r)) {
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
+ "http finalize upstream fake_r %p", r);
+
+ ngx_http_multi_upstream_finalize_request(r->connection, rc);
+ return;
+ }
+#endif
+
if (u->cleanup == NULL) {
/* the request was already finalized */
ngx_http_finalize_request(r, NGX_DONE);
diff --git src/http/ngx_http_upstream.h src/http/ngx_http_upstream.h
index 15a35d9..cc88133 100644
--- src/http/ngx_http_upstream.h
+++ src/http/ngx_http_upstream.h
@@ -404,6 +404,14 @@ struct ngx_http_upstream_s {
unsigned request_body_sent:1;
unsigned request_body_blocked:1;
unsigned header_sent:1;
+
+#if (T_NGX_MULTI_UPSTREAM)
+ unsigned multi:1;
+ void *multi_init;
+ ngx_pool_t *send_pool;
+ ngx_flag_t multi_mode;
+#endif
+
};


diff --git src/stream/ngx_stream.h src/stream/ngx_stream.h
index 3be24e6..a37a4ab 100644
--- src/stream/ngx_stream.h
+++ src/stream/ngx_stream.h
@@ -232,6 +232,13 @@ struct ngx_stream_session_s {
unsigned health_check:1;

unsigned limit_conn_status:2;
+
+#if (T_NGX_MULTI_UPSTREAM)
+ ngx_queue_t *multi_item;
+ ngx_queue_t *backend_r;
+ ngx_queue_t waiting_queue;
+ ngx_flag_t waiting;
+#endif
};


diff --git src/stream/ngx_stream_upstream.h src/stream/ngx_stream_upstream.h
index 25433d6..055224d 100644
--- src/stream/ngx_stream_upstream.h
+++ src/stream/ngx_stream_upstream.h
@@ -143,6 +143,10 @@ typedef struct {
unsigned connected:1;
unsigned proxy_protocol:1;
unsigned half_closed:1;
+
+#if (T_NGX_MULTI_UPSTREAM)
+ unsigned multi:1;
+#endif
} ngx_stream_upstream_t;


3 changes: 3 additions & 0 deletions patch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ elif [[ "$1" == *openresty-1.19.9.* ]]; then
elif [[ "$1" == *openresty-1.21.4.* ]]; then
patch="$PWD/nginx-1.21.4.patch"
dir="$1/bundle/nginx-1.21.4"
elif [[ "$1" == *openresty-1.25.3.* ]]; then
patch="$PWD/nginx-1.25.3.patch"
dir="$1/bundle/nginx-1.25.3"
else
err "can't detect OpenResty version"
exit 1
Expand Down