Skip to content

Commit 6d58f22

Browse files
committed
add finalize reason
1 parent 30d9565 commit 6d58f22

13 files changed

+91
-13
lines changed

http/ngx_http_flv_live_module.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,10 +257,14 @@ ngx_http_flv_live_write_handler(ngx_http_request_t *r)
257257
return;
258258
}
259259

260+
ctx = ngx_http_get_module_ctx(r, ngx_http_flv_live_module);
261+
s = ctx->session;
262+
260263
if (wev->timedout) {
261264
ngx_log_error(NGX_LOG_INFO, r->connection->log, NGX_ETIMEDOUT,
262265
"http flv live, client timed out");
263266
r->connection->timedout = 1;
267+
s->finalize_reason = NGX_LIVE_FLV_SEND_TIMEOUT;
264268
if (r->header_sent) {
265269
ngx_http_finalize_request(r, NGX_HTTP_CLIENT_CLOSED_REQUEST);
266270
ngx_http_run_posted_requests(r->connection);
@@ -276,9 +280,6 @@ ngx_http_flv_live_write_handler(ngx_http_request_t *r)
276280
ngx_del_timer(wev);
277281
}
278282

279-
ctx = ngx_http_get_module_ctx(r, ngx_http_flv_live_module);
280-
s = ctx->session;
281-
282283
if (ngx_rtmp_prepare_merge_frame(s) == NGX_ERROR) {
283284
ngx_http_finalize_request(r, NGX_ERROR);
284285
return;
@@ -287,6 +288,7 @@ ngx_http_flv_live_write_handler(ngx_http_request_t *r)
287288
if (s->out_chain) {
288289
rc = ngx_http_flv_live_send_header(r);
289290
if (rc == NGX_ERROR || rc > NGX_OK) {
291+
s->finalize_reason = NGX_LIVE_FLV_SEND_ERR;
290292
ngx_http_finalize_request(r, rc);
291293
return;
292294
}
@@ -318,6 +320,7 @@ ngx_http_flv_live_write_handler(ngx_http_request_t *r)
318320
if (rc == NGX_ERROR) {
319321
ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
320322
"http flv live, send error");
323+
s->finalize_reason = NGX_LIVE_FLV_SEND_ERR;
321324
ngx_http_finalize_request(r, NGX_ERROR);
322325
return;
323326
}
@@ -490,6 +493,13 @@ ngx_http_flv_live_cleanup(void *data)
490493

491494
if (ctx->session) {
492495
ctx->session->request = NULL;
496+
497+
if (ctx->session->finalize_reason == 0) {
498+
ctx->session->finalize_reason = r->connection->read->error?
499+
NGX_LIVE_FLV_RECV_ERR:
500+
NGX_LIVE_NORMAL_CLOSE;
501+
}
502+
493503
ngx_rtmp_finalize_fake_session(ctx->session);
494504
}
495505
}

ngx_live_relay.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ ngx_live_relay_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)
292292
if (s->live_stream->publish_ctx == NULL) {
293293
for (ctx = s->live_stream->play_ctx; ctx; ctx = ctx->next) {
294294
if (ctx->session->relay) {
295+
ctx->session->finalize_reason = NGX_LIVE_RELAY_CLOSE;
295296
ngx_rtmp_finalize_session(ctx->session);
296297
}
297298
}
@@ -309,6 +310,7 @@ ngx_live_relay_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)
309310
if (s->live_stream->play_ctx == NULL) {
310311
for (ctx = s->live_stream->publish_ctx; ctx; ctx = ctx->next) {
311312
if (ctx->session->relay) {
313+
ctx->session->finalize_reason = NGX_LIVE_RELAY_CLOSE;
312314
ngx_rtmp_finalize_session(ctx->session);
313315
}
314316
}

ngx_live_relay_httpflv.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,8 @@ ngx_live_relay_httpflv_recv_body(void *request, ngx_http_request_t *hcr)
363363
n = ngx_http_client_read_body(hcr, &cl);
364364

365365
if (n == 0 || n == NGX_ERROR) {
366+
s->finalize_reason = n == 0? NGX_LIVE_NORMAL_CLOSE:
367+
NGX_LIVE_FLV_RECV_ERR;
366368
ngx_log_error(NGX_LOG_INFO, s->log, ngx_errno,
367369
"http relay, recv body error");
368370
ngx_rtmp_finalize_session(s);
@@ -423,6 +425,11 @@ ngx_live_relay_httpflv_cleanup(void *data)
423425
if (s->close.posted) {
424426
ngx_delete_posted_event(&s->close);
425427
}
428+
429+
if (s->finalize_reason == 0) {
430+
s->finalize_reason = NGX_LIVE_FLV_RECV_ERR;
431+
}
432+
426433
ngx_rtmp_finalize_fake_session(s);
427434
}
428435
}
@@ -461,6 +468,7 @@ ngx_live_relay_httpflv_error(ngx_rtmp_session_t *s, ngx_uint_t status)
461468
ngx_rtmp_send_status(cctx->session, code, level, desc);
462469

463470
if (ngx_strcmp(level, "error") == 0) {
471+
cctx->session->finalize_reason = NGX_LIVE_RELAY_TRANSIT;
464472
ngx_rtmp_finalize_session(cctx->session);
465473
}
466474
}
@@ -481,6 +489,7 @@ ngx_live_relay_httpflv_recv(void *request, ngx_http_request_t *hcr)
481489

482490
if (status_code != NGX_HTTP_OK) {
483491
ngx_live_relay_httpflv_error(s, status_code);
492+
s->finalize_reason = NGX_LIVE_FLV_RECV_ERR;
484493
ngx_http_client_finalize_request(hcr, 1);
485494
return;
486495
}

ngx_live_relay_inner.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ ngx_live_relay_inner_handler(ngx_event_t *ev)
166166
if (!ctx->failed_delay && ev->timedout) { // connect timeout
167167
ngx_log_error(NGX_LOG_ERR, s->log, NGX_ETIMEDOUT,
168168
"inner relay, relay timeout");
169+
s->finalize_reason = NGX_LIVE_RELAY_TIMEOUT;
169170
ngx_rtmp_finalize_session(s);
170171

171172
return;

ngx_live_relay_rtmp.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,7 @@ ngx_live_relay_rtmp_status_error(ngx_rtmp_session_t *s, char *type, char *code,
463463
: ngx_rtmp_send_error(cctx->session, code, level, desc);
464464

465465
if (ngx_rtmp_relay_status_error_code[i].finalize) {
466+
cctx->session->finalize_reason = NGX_LIVE_RELAY_TRANSIT;
466467
ngx_rtmp_finalize_session(cctx->session);
467468
}
468469
}

ngx_live_relay_simple.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ ngx_live_relay_simple_handler(ngx_event_t *ev)
125125
if (!ctx->failed_delay && ev->timedout) { // connect timeout
126126
ngx_log_error(NGX_LOG_ERR, s->log, NGX_ETIMEDOUT,
127127
"simple relay, relay timeout");
128+
s->finalize_reason = NGX_LIVE_RELAY_TIMEOUT;
128129
ngx_rtmp_finalize_session(s);
129130

130131
return;

ngx_live_relay_static.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ ngx_live_relay_static_handler(ngx_event_t *ev)
143143
if (!ctx->failed_delay && ev->timedout) { // connect timeout
144144
ngx_log_error(NGX_LOG_ERR, s->log, NGX_ETIMEDOUT,
145145
"static relay, relay timeout");
146+
s->finalize_reason = NGX_LIVE_RELAY_TIMEOUT;
146147
ngx_rtmp_finalize_session(s);
147148

148149
return;
@@ -451,6 +452,7 @@ ngx_live_relay_static_init_main_dconf(ngx_conf_t *cf, void *conf)
451452

452453
rctx = ngx_rtmp_get_module_ctx(srelay->session, ngx_live_relay_module);
453454
rctx->giveup = 1;
455+
srelay->session->finalize_reason = NGX_LIVE_NORMAL_CLOSE;
454456
ngx_rtmp_finalize_session(srelay->session);
455457

456458
ngx_map_delete(&rsmcf->pulls[rsmcf->used],

ngx_rtmp.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,22 @@ typedef struct ngx_rtmp_addr_conf_s ngx_rtmp_addr_conf_t;
183183
#define NGX_LIVE_AV 6
184184
#define NGX_LIVE_CLOSE 7
185185

186-
extern char *ngx_live_stage[];
186+
#define NGX_LIVE_INTERNAL_ERR 0
187+
#define NGX_LIVE_NORMAL_CLOSE 1
188+
#define NGX_LIVE_RTMP_SEND_ERR 2
189+
#define NGX_LIVE_RTMP_SEND_TIMEOUT 3
190+
#define NGX_LIVE_FLV_SEND_ERR 4
191+
#define NGX_LIVE_FLV_SEND_TIMEOUT 5
192+
#define NGX_LIVE_RTMP_RECV_ERR 6
193+
#define NGX_LIVE_FLV_RECV_ERR 7
194+
#define NGX_LIVE_RELAY_TRANSIT 8
195+
#define NGX_LIVE_RELAY_TIMEOUT 9
196+
#define NGX_LIVE_CONTROL_DROP 10
197+
#define NGX_LIVE_DROP_IDLE 11
198+
#define NGX_LIVE_OCLP_NOTIFY_ERR 12
199+
#define NGX_LIVE_OCLP_RELAY_ERR 13
200+
#define NGX_LIVE_OCLP_PARA_ERR 14
201+
#define NGX_LIVE_RELAY_CLOSE 15
187202

188203
struct ngx_rtmp_session_s {
189204
uint32_t signature; /* "RTMP" */ /* <-- FIXME wtf */
@@ -301,6 +316,8 @@ struct ngx_rtmp_session_s {
301316
ngx_rtmp_prepared_pt prepare_handler;
302317

303318
/* for trace and statistics */
319+
ngx_int_t oclp_status;
320+
ngx_uint_t finalize_reason;
304321
ngx_uint_t stage;
305322
ngx_msec_t init_time;
306323
ngx_msec_t handshake_done_time;

ngx_rtmp_control_module.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ ngx_rtmp_control_drop_handler(ngx_http_request_t *r, ngx_rtmp_session_t *s)
133133

134134
ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module);
135135

136+
s->finalize_reason = NGX_LIVE_CONTROL_DROP;
136137
ngx_rtmp_finalize_session(s);
137138

138139
++ctx->count;

ngx_rtmp_handler.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,8 @@ ngx_rtmp_recv(ngx_event_t *rev)
256256
n = c->recv(c, b->last, b->end - b->last);
257257

258258
if (n == NGX_ERROR || n == 0) {
259+
s->finalize_reason = n == 0? NGX_LIVE_NORMAL_CLOSE:
260+
NGX_LIVE_RTMP_RECV_ERR;
259261
ngx_rtmp_finalize_session(s);
260262
return;
261263
}
@@ -682,6 +684,7 @@ ngx_rtmp_send(ngx_event_t *wev)
682684
if (wev->timedout) {
683685
ngx_log_error(NGX_LOG_INFO, s->log, NGX_ETIMEDOUT, "client timed out");
684686
c->timedout = 1;
687+
s->finalize_reason = NGX_LIVE_RTMP_SEND_TIMEOUT;
685688
ngx_rtmp_finalize_session(s);
686689
return;
687690
}
@@ -708,6 +711,7 @@ ngx_rtmp_send(ngx_event_t *wev)
708711

709712
if (chain == NGX_CHAIN_ERROR) { /* NGX_ERROR */
710713
c->error = 1;
714+
s->finalize_reason = NGX_LIVE_RTMP_SEND_ERR;
711715
ngx_rtmp_finalize_session(s);
712716
return;
713717
}

ngx_rtmp_init.c

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ typedef struct {
2727
} ngx_rtmp_error_log_ctx_t;
2828

2929

30-
char *ngx_live_stage[] = {
30+
static char *ngx_live_stage[] = {
3131
"init",
3232
"handshake_done",
3333
"connect",
@@ -39,6 +39,26 @@ char *ngx_live_stage[] = {
3939
};
4040

4141

42+
static char *ngx_live_err[] = {
43+
"internal_err",
44+
"normal_close",
45+
"rtmp_send_err",
46+
"rtmp_send_timeout",
47+
"flv_send_err",
48+
"flv_send_timeout",
49+
"rtmp_recv_err",
50+
"flv_recv_err",
51+
"relay_transit",
52+
"relay_timeout",
53+
"control_drop",
54+
"drop_idle",
55+
"oclp_notify_err",
56+
"oclp_relay_err",
57+
"oclp_para_err",
58+
"relay_close",
59+
};
60+
61+
4262
void
4363
ngx_rtmp_init_connection(ngx_connection_t *c)
4464
{
@@ -177,12 +197,6 @@ ngx_rtmp_log_error(ngx_log_t *log, u_char *buf, size_t len)
177197

178198
p = buf;
179199

180-
if (log->action) {
181-
p = ngx_snprintf(buf, len, " while %s", log->action);
182-
len -= p - buf;
183-
buf = p;
184-
}
185-
186200
ctx = log->data;
187201

188202
if (ctx->client) {
@@ -197,8 +211,7 @@ ngx_rtmp_log_error(ngx_log_t *log, u_char *buf, size_t len)
197211
return p;
198212
}
199213

200-
p = ngx_snprintf(buf, len, ", server: %V, session: %p, stage: %s",
201-
s->addr_text, s, ngx_live_stage[s->stage]);
214+
p = ngx_snprintf(buf, len, ", server: %V, session: %p", s->addr_text, s);
202215
len -= p - buf;
203216
buf = p;
204217

@@ -242,6 +255,9 @@ ngx_rtmp_close_connection(ngx_connection_t *c)
242255
static void
243256
ngx_rtmp_close_session(ngx_rtmp_session_t *s)
244257
{
258+
ngx_log_error(NGX_LOG_INFO, s->log, 0, "close session at %s: %s",
259+
ngx_live_stage[s->stage], ngx_live_err[s->finalize_reason]);
260+
245261
if (s->ping_evt.timer_set) {
246262
ngx_del_timer(&s->ping_evt);
247263
}

ngx_rtmp_live_module.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ ngx_rtmp_live_idle(ngx_event_t *pev)
213213
ngx_log_error(NGX_LOG_ERR, s->log, 0,
214214
"live: drop idle publisher");
215215

216+
s->finalize_reason = NGX_LIVE_DROP_IDLE;
216217
ngx_rtmp_finalize_session(s);
217218
}
218219

ngx_rtmp_oclp_module.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -863,6 +863,8 @@ ngx_rtmp_oclp_pnotify_start_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)
863863

864864
octx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_oclp_module);
865865

866+
s->oclp_status = code;
867+
866868
if (code < NGX_HTTP_OK || code > NGX_HTTP_SPECIAL_RESPONSE) {
867869
ngx_log_error(NGX_LOG_ERR, s->log, 0,
868870
"oclp %s start notify error: %i",
@@ -899,6 +901,7 @@ ngx_rtmp_oclp_pnotify_start_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)
899901
ngx_rtmp_send_status(s, "NetStream.Play.Forbidden", "status",
900902
"Play stream Forbidden");
901903
}
904+
s->finalize_reason = NGX_LIVE_OCLP_NOTIFY_ERR;
902905
ngx_rtmp_finalize_session(s);
903906
}
904907

@@ -980,6 +983,7 @@ ngx_rtmp_oclp_relay_error(ngx_rtmp_session_t *s, ngx_uint_t status)
980983

981984
for (; cctx; cctx = cctx->next) {
982985
cctx->session->status = status;
986+
cctx->session->finalize_reason = NGX_LIVE_RELAY_TRANSIT;
983987
ngx_rtmp_finalize_session(cctx->session);
984988
}
985989
}
@@ -1008,9 +1012,12 @@ ngx_rtmp_oclp_relay_start_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)
10081012
return;
10091013
}
10101014

1015+
s->oclp_status = code;
1016+
10111017
if (code == -1) { // wait for oclp relay reconnect
10121018
ngx_log_error(NGX_LOG_ERR, s->log, 0, "oclp relay start failed");
10131019

1020+
s->finalize_reason = NGX_LIVE_OCLP_RELAY_ERR;
10141021
ngx_rtmp_finalize_session(s); // only reconnect immediately
10151022

10161023
return;
@@ -1025,6 +1032,7 @@ ngx_rtmp_oclp_relay_start_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)
10251032
} else { // relay push
10261033
ngx_rtmp_oclp_relay_error(s, 400);
10271034
}
1035+
s->finalize_reason = NGX_LIVE_OCLP_RELAY_ERR;
10281036
ngx_rtmp_finalize_session(s);
10291037

10301038
return;
@@ -1033,6 +1041,7 @@ ngx_rtmp_oclp_relay_start_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)
10331041
if (code == NGX_HTTP_OK) { // successd but no need to relay
10341042
ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);
10351043
ctx->giveup = 1;
1044+
s->finalize_reason = NGX_LIVE_NORMAL_CLOSE;
10361045
ngx_rtmp_finalize_session(s);
10371046
return;
10381047
}
@@ -1042,6 +1051,7 @@ ngx_rtmp_oclp_relay_start_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)
10421051
if (local_name == NULL) {
10431052
ngx_log_error(NGX_LOG_ERR, s->log, 0,
10441053
"oclp relay start has no Location when redirect");
1054+
s->finalize_reason = NGX_LIVE_OCLP_PARA_ERR;
10451055
ngx_rtmp_finalize_session(s);
10461056

10471057
return;
@@ -1072,6 +1082,7 @@ ngx_rtmp_oclp_relay_start_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)
10721082
if (ngx_parse_request_url(&url->url, local_name) != NGX_OK) {
10731083
ngx_log_error(NGX_LOG_ERR, s->log, 0,
10741084
"oclp relay start, request url format error: %V", &location);
1085+
s->finalize_reason = NGX_LIVE_OCLP_PARA_ERR;
10751086
ngx_rtmp_finalize_session(s);
10761087

10771088
return;
@@ -1085,6 +1096,7 @@ ngx_rtmp_oclp_relay_start_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)
10851096
if (url->port == 0) {
10861097
ngx_log_error(NGX_LOG_ERR, s->log, 0,
10871098
"oclp relay start, request url port error");
1099+
s->finalize_reason = NGX_LIVE_OCLP_PARA_ERR;
10881100
ngx_rtmp_finalize_session(s);
10891101

10901102
return;
@@ -1155,6 +1167,7 @@ ngx_rtmp_oclp_relay_handler(ngx_event_t *ev)
11551167
if (!ctx->failed_delay && ev->timedout) { // connect timeout
11561168
ngx_log_error(NGX_LOG_ERR, s->log, NGX_ETIMEDOUT,
11571169
"oclp relay, relay timeout");
1170+
s->finalize_reason = NGX_LIVE_RELAY_TIMEOUT;
11581171
ngx_rtmp_finalize_session(s);
11591172

11601173
if (octx->nctx->hcr) {

0 commit comments

Comments
 (0)