rage-iodine 3.0.0 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/Gemfile +0 -1
- data/ext/iodine/http_internal.h +1 -1
- data/ext/iodine/iodine.c +1 -1
- data/ext/iodine/iodine_http.c +29 -40
- data/lib/iodine/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d96bd1cba30c10ee53b362f816e5c59fc05e16daecce52d294fd7fcb2f7d3727
|
4
|
+
data.tar.gz: aca815f5c9b722980cd94bd176b492d83888133f02eaa84aa4d04cc5275443eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26ad4b2eb5ebf8e3bc0ae5985b706a5126e9cddda0052e0bed5669979f794f71c7c2039a2dc867e38d00d7b06cd2d5954340821e8a725a3895d1ccf1cbac4d79
|
7
|
+
data.tar.gz: e4a708af24640800d5e86c2b0acfaaaaaddbfaeba1c818c9028a607de63898cc5eed57a244d74e935636c260e57b7ee54c02b44e219c2dbffdbc1be574a292de
|
data/CHANGELOG.md
CHANGED
@@ -6,9 +6,19 @@ Please notice that this change log contains changes for upcoming releases as wel
|
|
6
6
|
|
7
7
|
## Changes:
|
8
8
|
|
9
|
+
#### Change log v.3.0.2 (2023-12-18)
|
10
|
+
|
11
|
+
**Fix**: Correctly set timeout option.
|
12
|
+
**Fix**: Correctly set max_clients option.
|
13
|
+
|
14
|
+
#### Change log v.3.0.1 (2023-12-11)
|
15
|
+
|
16
|
+
**Fix**: Disable scheduling request fibers.
|
17
|
+
|
9
18
|
#### Change log v.3.0.0 (2023-12-09)
|
10
19
|
|
11
20
|
**Update**: Schedule request fibers.
|
21
|
+
**Update**: Improve stability and memory management under high load.
|
12
22
|
|
13
23
|
#### Change log v.2.3.0 (2023-11-27)
|
14
24
|
|
data/Gemfile
CHANGED
data/ext/iodine/http_internal.h
CHANGED
data/ext/iodine/iodine.c
CHANGED
@@ -826,7 +826,7 @@ FIO_FUNC iodine_connection_args_s iodine_connect_args(VALUE s, uint8_t is_srv) {
|
|
826
826
|
service = rb_sym2str(service);
|
827
827
|
service_str = IODINE_RSTRINFO(service);
|
828
828
|
}
|
829
|
-
if (timeout != Qnil && RB_TYPE_P(
|
829
|
+
if (timeout != Qnil && RB_TYPE_P(timeout, T_FIXNUM)) {
|
830
830
|
if (FIX2ULONG(timeout) > 255)
|
831
831
|
FIO_LOG_WARNING(":timeout value over 255 will be silently ignored.");
|
832
832
|
else
|
data/ext/iodine/iodine_http.c
CHANGED
@@ -60,9 +60,8 @@ static ID each_method_id;
|
|
60
60
|
static ID attach_method_id;
|
61
61
|
static ID iodine_call_proc_id;
|
62
62
|
static ID fiber_result_var_id;
|
63
|
+
static VALUE http_wait_directive;
|
63
64
|
static ID fiber_id_method_id;
|
64
|
-
static VALUE rb_cFiber;
|
65
|
-
static ID schedule_method_id;
|
66
65
|
|
67
66
|
static VALUE env_template_no_upgrade;
|
68
67
|
static VALUE env_template_websockets;
|
@@ -120,6 +119,7 @@ typedef struct {
|
|
120
119
|
IODINE_HTTP_XSENDFILE,
|
121
120
|
IODINE_HTTP_EMPTY,
|
122
121
|
IODINE_HTTP_ERROR,
|
122
|
+
IODINE_HTTP_WAIT,
|
123
123
|
IODINE_HTTP_DEFERRED,
|
124
124
|
} type;
|
125
125
|
enum iodine_upgrade_type_enum {
|
@@ -679,7 +679,6 @@ static inline void *iodine_handle_request_in_GVL(void *handle_) {
|
|
679
679
|
goto err_not_found;
|
680
680
|
|
681
681
|
if (handle->type == IODINE_HTTP_DEFERRED) {
|
682
|
-
// the deferred response is now ready so fetch it from the fiber
|
683
682
|
rbresponse = rb_ivar_get((VALUE)h->fiber, fiber_result_var_id);
|
684
683
|
} else {
|
685
684
|
// create / register env variable
|
@@ -688,13 +687,8 @@ static inline void *iodine_handle_request_in_GVL(void *handle_) {
|
|
688
687
|
tmp = IodineRackIO.create(h, env);
|
689
688
|
// pass env variable to handler
|
690
689
|
rbresponse = IodineCaller.call2((VALUE)h->udata, iodine_call_proc_id, 1, &env);
|
691
|
-
IodineStore.add(rbresponse);
|
692
690
|
// close rack.io
|
693
691
|
IodineRackIO.close(tmp);
|
694
|
-
|
695
|
-
// if there's a fiber in the http_s object means the request has to be deferred
|
696
|
-
if (h->fiber)
|
697
|
-
goto defer;
|
698
692
|
}
|
699
693
|
|
700
694
|
// test handler's return value
|
@@ -703,6 +697,13 @@ static inline void *iodine_handle_request_in_GVL(void *handle_) {
|
|
703
697
|
}
|
704
698
|
|
705
699
|
tmp = rb_ary_entry(rbresponse, 0);
|
700
|
+
// rack will return `[:__http_defer__, fiber_to_wait_on]` in case the request needs to be paused
|
701
|
+
if (TYPE(tmp) == T_SYMBOL && tmp == http_wait_directive) {
|
702
|
+
h->fiber = (void *)IodineStore.add(rb_ary_entry(rbresponse, 1));
|
703
|
+
goto defer;
|
704
|
+
}
|
705
|
+
|
706
|
+
IodineStore.add(rbresponse);
|
706
707
|
// set response status
|
707
708
|
if (TYPE(tmp) == T_STRING) {
|
708
709
|
char *data = RSTRING_PTR(tmp);
|
@@ -741,7 +742,8 @@ static inline void *iodine_handle_request_in_GVL(void *handle_) {
|
|
741
742
|
// review each header and write it to the response.
|
742
743
|
rb_hash_foreach(response_headers, for_each_header_data, (VALUE)(h));
|
743
744
|
// review for upgrade.
|
744
|
-
if (handle->type != IODINE_HTTP_DEFERRED && (intptr_t)h->status < 300 &&
|
745
|
+
if (handle->type != IODINE_HTTP_DEFERRED && (intptr_t)h->status < 300 &&
|
746
|
+
ruby2c_review_upgrade(handle, rbresponse, env))
|
745
747
|
goto external_done;
|
746
748
|
// send the request body.
|
747
749
|
if (ruby2c_response_send(handle, rbresponse, env))
|
@@ -750,31 +752,32 @@ static inline void *iodine_handle_request_in_GVL(void *handle_) {
|
|
750
752
|
finish:
|
751
753
|
IodineStore.remove(rbresponse);
|
752
754
|
IodineStore.remove(env);
|
753
|
-
return
|
755
|
+
return NULL;
|
754
756
|
|
755
757
|
external_done:
|
756
758
|
IodineStore.remove(rbresponse);
|
757
759
|
IodineStore.remove(env);
|
758
760
|
handle->type = IODINE_HTTP_NONE;
|
759
|
-
return
|
761
|
+
return NULL;
|
760
762
|
|
761
763
|
err_not_found:
|
762
764
|
IodineStore.remove(rbresponse);
|
763
765
|
IodineStore.remove(env);
|
764
766
|
h->status = 404;
|
765
767
|
handle->type = IODINE_HTTP_ERROR;
|
766
|
-
return
|
768
|
+
return NULL;
|
767
769
|
|
768
770
|
internal_error:
|
769
771
|
IodineStore.remove(rbresponse);
|
770
772
|
IodineStore.remove(env);
|
771
773
|
h->status = 500;
|
772
774
|
handle->type = IODINE_HTTP_ERROR;
|
773
|
-
return
|
775
|
+
return NULL;
|
774
776
|
|
775
777
|
defer:
|
776
778
|
IodineStore.remove(env);
|
777
|
-
|
779
|
+
handle->type = IODINE_HTTP_WAIT;
|
780
|
+
return NULL;
|
778
781
|
}
|
779
782
|
|
780
783
|
static inline void
|
@@ -823,10 +826,11 @@ static inline void http_resume_deferred_request_handler(http_s *h) {
|
|
823
826
|
.type = IODINE_HTTP_DEFERRED,
|
824
827
|
};
|
825
828
|
|
826
|
-
IodineCaller.enterGVL((void *(*)(void *))iodine_handle_request_in_GVL,
|
829
|
+
IodineCaller.enterGVL((void *(*)(void *))iodine_handle_request_in_GVL,
|
830
|
+
&handle);
|
827
831
|
|
828
|
-
IodineStore.remove((VALUE)h->fiber);
|
829
832
|
fio_unsubscribe((subscription_s *)h->subscription);
|
833
|
+
IodineStore.remove((VALUE)h->fiber);
|
830
834
|
|
831
835
|
iodine_perform_handle_action(handle);
|
832
836
|
}
|
@@ -835,9 +839,10 @@ static inline void on_iodine_request_id_message(fio_msg_s *msg) {
|
|
835
839
|
http_resume((http_pause_handle_s *)msg->udata1, http_resume_deferred_request_handler, NULL);
|
836
840
|
}
|
837
841
|
|
842
|
+
// when Ruby sends a message into the `fiber_id` channel means the fiber attached to
|
843
|
+
// to the `http_s h` var can be resumed
|
838
844
|
static inline void http_pause_request_handler(http_pause_handle_s *s) {
|
839
845
|
VALUE fiber_id = rb_funcall((VALUE)s->fiber, fiber_id_method_id, 0);
|
840
|
-
|
841
846
|
subscription_s *sub = fio_subscribe(.channel = {0, RSTRING_LEN(fiber_id), RSTRING_PTR(fiber_id)},
|
842
847
|
.on_message = on_iodine_request_id_message,
|
843
848
|
.udata1 = (void *)s);
|
@@ -845,31 +850,16 @@ static inline void http_pause_request_handler(http_pause_handle_s *s) {
|
|
845
850
|
s->subscription = (void *)sub;
|
846
851
|
}
|
847
852
|
|
848
|
-
static VALUE fiber_request_block(RB_BLOCK_CALL_FUNC_ARGLIST(_, handle_)) {
|
849
|
-
VALUE fiber_id = rb_funcall(rb_fiber_current(), fiber_id_method_id, 0);
|
850
|
-
|
851
|
-
iodine_http_request_handle_s *handle = (iodine_http_request_handle_s *)handle_;
|
852
|
-
VALUE rbresponse = (VALUE)IodineCaller.enterGVL((void *(*)(void *))iodine_handle_request_in_GVL, handle);
|
853
|
-
|
854
|
-
fio_publish(.channel = {0, RSTRING_LEN(fiber_id), RSTRING_PTR(fiber_id)});
|
855
|
-
rb_ivar_set(rb_fiber_current(), fiber_result_var_id, rbresponse);
|
856
|
-
|
857
|
-
return rbresponse;
|
858
|
-
}
|
859
|
-
|
860
853
|
static void on_rack_request(http_s *h) {
|
861
854
|
iodine_http_request_handle_s handle = (iodine_http_request_handle_s){
|
862
855
|
.h = h,
|
863
856
|
.upgrade = IODINE_UPGRADE_NONE,
|
864
857
|
};
|
858
|
+
IodineCaller.enterGVL((void *(*)(void *))iodine_handle_request_in_GVL,
|
859
|
+
&handle);
|
865
860
|
|
866
|
-
|
867
|
-
|
868
|
-
// the fiber encountered blocking IO and yielded - pause the request
|
869
|
-
if (rb_fiber_alive_p(fiber)) {
|
870
|
-
IodineStore.add(fiber);
|
871
|
-
h->fiber = (void *)fiber;
|
872
|
-
http_pause(h, http_pause_request_handler);
|
861
|
+
if (handle.type == IODINE_HTTP_WAIT) {
|
862
|
+
http_pause(handle.h, http_pause_request_handler);
|
873
863
|
} else {
|
874
864
|
iodine_perform_handle_action(handle);
|
875
865
|
}
|
@@ -1037,7 +1027,7 @@ intptr_t iodine_http_listen(iodine_connection_args_s args){
|
|
1037
1027
|
.on_upgrade = on_rack_upgrade, .udata = (void *)args.handler,
|
1038
1028
|
.timeout = args.timeout, .ws_timeout = args.ping,
|
1039
1029
|
.ws_max_msg_size = args.max_msg, .max_header_size = args.max_headers,
|
1040
|
-
.on_finish = free_iodine_http, .log = args.log,
|
1030
|
+
.on_finish = free_iodine_http, .log = args.log, .max_clients = args.max_clients,
|
1041
1031
|
.max_body_size = args.max_body, .public_folder = args.public.data);
|
1042
1032
|
#else
|
1043
1033
|
intptr_t uuid = http_listen(
|
@@ -1045,7 +1035,7 @@ intptr_t iodine_http_listen(iodine_connection_args_s args){
|
|
1045
1035
|
.on_upgrade = on_rack_upgrade, .udata = (void *)args.handler,
|
1046
1036
|
.tls = args.tls, .timeout = args.timeout, .ws_timeout = args.ping,
|
1047
1037
|
.ws_max_msg_size = args.max_msg, .max_header_size = args.max_headers,
|
1048
|
-
.on_finish = free_iodine_http, .log = args.log,
|
1038
|
+
.on_finish = free_iodine_http, .log = args.log, .max_clients = args.max_clients,
|
1049
1039
|
.max_body_size = args.max_body, .public_folder = args.public.data);
|
1050
1040
|
#endif
|
1051
1041
|
if (uuid == -1)
|
@@ -1249,9 +1239,8 @@ void iodine_init_http(void) {
|
|
1249
1239
|
attach_method_id = rb_intern("attach_fd");
|
1250
1240
|
iodine_call_proc_id = rb_intern("call");
|
1251
1241
|
fiber_result_var_id = rb_intern("@__result");
|
1242
|
+
http_wait_directive = ID2SYM(rb_intern("__http_defer__"));
|
1252
1243
|
fiber_id_method_id = rb_intern("__get_id");
|
1253
|
-
rb_cFiber = rb_const_get(rb_cObject, rb_intern("Fiber"));
|
1254
|
-
schedule_method_id = rb_intern("schedule");
|
1255
1244
|
|
1256
1245
|
IodineUTF8Encoding = rb_enc_find("UTF-8");
|
1257
1246
|
IodineBinaryEncoding = rb_enc_find("binary");
|
data/lib/iodine/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rage-iodine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Boaz Segev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-12-
|
11
|
+
date: 2023-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|