Mercurial > hg > nginx-quic
annotate src/stream/ngx_stream_upstream_round_robin.h @ 8442:b3f6ad181df4 quic
QUIC: refactored CRYPTO and STREAM buffer ordering.
Generic function ngx_quic_order_bufs() is introduced. This function creates
and maintains a chain of buffers with holes. Holes are marked with b->sync
flag. Several buffers and holes in this chain may share the same underlying
memory buffer.
When processing STREAM frames with this function, frame data is copied only
once to the right place in the stream input chain. Previously data could
be copied twice. First when buffering an out-of-order frame data, and then
when filling stream buffer from ordered frame queue. Now there's only one
data chain for both tasks.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Tue, 25 May 2021 13:55:12 +0300 |
parents | 90cc7194e993 |
children |
rev | line source |
---|---|
6115 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4 * Copyright (C) Nginx, Inc. | |
5 */ | |
6 | |
7 | |
8 #ifndef _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ | |
9 #define _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ | |
10 | |
11 | |
12 #include <ngx_config.h> | |
13 #include <ngx_core.h> | |
14 #include <ngx_stream.h> | |
15 | |
16 | |
17 typedef struct ngx_stream_upstream_rr_peer_s ngx_stream_upstream_rr_peer_t; | |
18 | |
19 struct ngx_stream_upstream_rr_peer_s { | |
20 struct sockaddr *sockaddr; | |
21 socklen_t socklen; | |
22 ngx_str_t name; | |
23 ngx_str_t server; | |
24 | |
25 ngx_int_t current_weight; | |
26 ngx_int_t effective_weight; | |
27 ngx_int_t weight; | |
28 | |
29 ngx_uint_t conns; | |
6705 | 30 ngx_uint_t max_conns; |
6115 | 31 |
32 ngx_uint_t fails; | |
33 time_t accessed; | |
34 time_t checked; | |
35 | |
36 ngx_uint_t max_fails; | |
37 time_t fail_timeout; | |
6708
4080f94a996f
Modules compatibility: slow start fields.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6705
diff
changeset
|
38 ngx_msec_t slow_start; |
4080f94a996f
Modules compatibility: slow start fields.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6705
diff
changeset
|
39 ngx_msec_t start_time; |
6115 | 40 |
6713
63b8b157b776
Modules compatibility: down flag promoted to a bitmask.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6712
diff
changeset
|
41 ngx_uint_t down; |
6115 | 42 |
43 void *ssl_session; | |
44 int ssl_session_len; | |
45 | |
46 #if (NGX_STREAM_UPSTREAM_ZONE) | |
47 ngx_atomic_t lock; | |
48 #endif | |
6701
d69964eb8335
Upstream: style, ngx_http_upstream_rr_peer_t.next moved.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6643
diff
changeset
|
49 |
d69964eb8335
Upstream: style, ngx_http_upstream_rr_peer_t.next moved.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6643
diff
changeset
|
50 ngx_stream_upstream_rr_peer_t *next; |
6715
d200a0fd00b7
Introduced the NGX_COMPAT macro.
Ruslan Ermilov <ru@nginx.com>
parents:
6713
diff
changeset
|
51 |
d200a0fd00b7
Introduced the NGX_COMPAT macro.
Ruslan Ermilov <ru@nginx.com>
parents:
6713
diff
changeset
|
52 NGX_COMPAT_BEGIN(25) |
d200a0fd00b7
Introduced the NGX_COMPAT macro.
Ruslan Ermilov <ru@nginx.com>
parents:
6713
diff
changeset
|
53 NGX_COMPAT_END |
6115 | 54 }; |
55 | |
56 | |
57 typedef struct ngx_stream_upstream_rr_peers_s ngx_stream_upstream_rr_peers_t; | |
58 | |
59 struct ngx_stream_upstream_rr_peers_s { | |
60 ngx_uint_t number; | |
61 | |
62 #if (NGX_STREAM_UPSTREAM_ZONE) | |
63 ngx_slab_pool_t *shpool; | |
64 ngx_atomic_t rwlock; | |
6198
311d232ad803
Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents:
6115
diff
changeset
|
65 ngx_stream_upstream_rr_peers_t *zone_next; |
6115 | 66 #endif |
67 | |
68 ngx_uint_t total_weight; | |
8249
90cc7194e993
Upstream: excluded down servers from the next_upstream tries.
Ruslan Ermilov <ru@nginx.com>
parents:
6736
diff
changeset
|
69 ngx_uint_t tries; |
6115 | 70 |
71 unsigned single:1; | |
72 unsigned weighted:1; | |
73 | |
74 ngx_str_t *name; | |
75 | |
76 ngx_stream_upstream_rr_peers_t *next; | |
77 | |
78 ngx_stream_upstream_rr_peer_t *peer; | |
79 }; | |
80 | |
81 | |
82 #if (NGX_STREAM_UPSTREAM_ZONE) | |
83 | |
84 #define ngx_stream_upstream_rr_peers_rlock(peers) \ | |
85 \ | |
86 if (peers->shpool) { \ | |
87 ngx_rwlock_rlock(&peers->rwlock); \ | |
88 } | |
89 | |
90 #define ngx_stream_upstream_rr_peers_wlock(peers) \ | |
91 \ | |
92 if (peers->shpool) { \ | |
93 ngx_rwlock_wlock(&peers->rwlock); \ | |
94 } | |
95 | |
96 #define ngx_stream_upstream_rr_peers_unlock(peers) \ | |
97 \ | |
98 if (peers->shpool) { \ | |
99 ngx_rwlock_unlock(&peers->rwlock); \ | |
100 } | |
101 | |
102 | |
103 #define ngx_stream_upstream_rr_peer_lock(peers, peer) \ | |
104 \ | |
105 if (peers->shpool) { \ | |
106 ngx_rwlock_wlock(&peer->lock); \ | |
107 } | |
108 | |
109 #define ngx_stream_upstream_rr_peer_unlock(peers, peer) \ | |
110 \ | |
111 if (peers->shpool) { \ | |
112 ngx_rwlock_unlock(&peer->lock); \ | |
113 } | |
114 | |
115 #else | |
116 | |
117 #define ngx_stream_upstream_rr_peers_rlock(peers) | |
118 #define ngx_stream_upstream_rr_peers_wlock(peers) | |
119 #define ngx_stream_upstream_rr_peers_unlock(peers) | |
120 #define ngx_stream_upstream_rr_peer_lock(peers, peer) | |
121 #define ngx_stream_upstream_rr_peer_unlock(peers, peer) | |
122 | |
123 #endif | |
124 | |
125 | |
126 typedef struct { | |
6712
fd5c2781460b
Modules compatibility: upstream config field.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6708
diff
changeset
|
127 ngx_uint_t config; |
6115 | 128 ngx_stream_upstream_rr_peers_t *peers; |
129 ngx_stream_upstream_rr_peer_t *current; | |
130 uintptr_t *tried; | |
131 uintptr_t data; | |
132 } ngx_stream_upstream_rr_peer_data_t; | |
133 | |
134 | |
135 ngx_int_t ngx_stream_upstream_init_round_robin(ngx_conf_t *cf, | |
136 ngx_stream_upstream_srv_conf_t *us); | |
137 ngx_int_t ngx_stream_upstream_init_round_robin_peer(ngx_stream_session_t *s, | |
138 ngx_stream_upstream_srv_conf_t *us); | |
6643
9757cffc1e2f
Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents:
6198
diff
changeset
|
139 ngx_int_t ngx_stream_upstream_create_round_robin_peer(ngx_stream_session_t *s, |
9757cffc1e2f
Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents:
6198
diff
changeset
|
140 ngx_stream_upstream_resolved_t *ur); |
6115 | 141 ngx_int_t ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, |
142 void *data); | |
143 void ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, | |
144 void *data, ngx_uint_t state); | |
145 | |
146 | |
147 #endif /* _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */ |