mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-09-06 21:51:30 +00:00
SCTP improvements, rack optimizations
This commit is contained in:
@@ -6,7 +6,7 @@ json = auto
|
||||
sqlite3 = auto
|
||||
zeromq = auto
|
||||
snmp = true
|
||||
sctp = true
|
||||
sctp = false
|
||||
spooler = true
|
||||
embedded = true
|
||||
udp = true
|
||||
|
||||
@@ -566,6 +566,7 @@ void fastrouter_loop(int id) {
|
||||
|
||||
ufr.fr_table[new_connection] = alloc_fr_session();
|
||||
ufr.fr_table[new_connection]->instance_fd = new_connection;
|
||||
ufr.fr_table[new_connection]->fd = -1;
|
||||
ufr.fr_table[new_connection]->persistent = 1;
|
||||
ufr.fr_table[new_connection]->status = FASTROUTER_STATUS_SCTP_NODE_FREE;
|
||||
|
||||
|
||||
+520
-505
File diff suppressed because it is too large
Load Diff
+11
-18
@@ -546,9 +546,7 @@ VALUE send_header(VALUE obj, VALUE headers) {
|
||||
|
||||
struct wsgi_request *wsgi_req = current_wsgi_req();
|
||||
|
||||
size_t len;
|
||||
VALUE hkey, hval;
|
||||
|
||||
|
||||
//uwsgi_log("HEADERS %d\n", TYPE(obj));
|
||||
if (TYPE(obj) == T_ARRAY) {
|
||||
@@ -581,18 +579,16 @@ VALUE send_header(VALUE obj, VALUE headers) {
|
||||
size_t header_value_len = RSTRING_LEN(hval);
|
||||
size_t i,cnt=0;
|
||||
char *this_header = header_value;
|
||||
struct iovec iov[4];
|
||||
|
||||
for(i=0;i<header_value_len;i++) {
|
||||
// multiline header, send it !!!
|
||||
if (header_value[i] == '\n') {
|
||||
len = wsgi_req->socket->proto_write_header( wsgi_req, RSTRING_PTR(hkey), RSTRING_LEN(hkey));
|
||||
wsgi_req->headers_size += len;
|
||||
len = wsgi_req->socket->proto_write_header( wsgi_req, (char *)": ", 2);
|
||||
wsgi_req->headers_size += len;
|
||||
len = wsgi_req->socket->proto_write_header( wsgi_req, this_header, cnt);
|
||||
wsgi_req->headers_size += len;
|
||||
len = wsgi_req->socket->proto_write_header( wsgi_req, (char *)"\r\n", 2);
|
||||
wsgi_req->headers_size += len;
|
||||
iov[0].iov_base = RSTRING_PTR(hkey); iov[0].iov_len = RSTRING_LEN(hkey);
|
||||
iov[1].iov_base = (char *)": "; iov[1].iov_len = 2;
|
||||
iov[2].iov_base = this_header; iov[2].iov_len = cnt;
|
||||
iov[3].iov_base = (char *)"\r\n"; iov[3].iov_len = 2;
|
||||
wsgi_req->headers_size += wsgi_req->socket->proto_writev_header( wsgi_req, iov, 4);
|
||||
|
||||
//uwsgi_log("(multi) --%.*s: %.*s--\n", RSTRING_LEN(hkey), RSTRING_PTR(hkey), cnt, this_header);
|
||||
|
||||
@@ -606,14 +602,11 @@ VALUE send_header(VALUE obj, VALUE headers) {
|
||||
}
|
||||
|
||||
if (cnt > 0) {
|
||||
len = wsgi_req->socket->proto_write_header( wsgi_req, RSTRING_PTR(hkey), RSTRING_LEN(hkey));
|
||||
wsgi_req->headers_size += len;
|
||||
len = wsgi_req->socket->proto_write_header( wsgi_req, (char *)": ", 2);
|
||||
wsgi_req->headers_size += len;
|
||||
len = wsgi_req->socket->proto_write_header( wsgi_req, this_header, cnt);
|
||||
wsgi_req->headers_size += len;
|
||||
len = wsgi_req->socket->proto_write_header( wsgi_req, (char *)"\r\n", 2);
|
||||
wsgi_req->headers_size += len;
|
||||
iov[0].iov_base = RSTRING_PTR(hkey); iov[0].iov_len = RSTRING_LEN(hkey);
|
||||
iov[1].iov_base = (char *)": "; iov[1].iov_len = 2;
|
||||
iov[2].iov_base = this_header; iov[2].iov_len = cnt;
|
||||
iov[3].iov_base = (char *)"\r\n"; iov[3].iov_len = 2;
|
||||
wsgi_req->headers_size += wsgi_req->socket->proto_writev_header( wsgi_req, iov, 4);
|
||||
wsgi_req->header_cnt++;
|
||||
//uwsgi_log("--%.*s: %.*s--\n", RSTRING_LEN(hkey), RSTRING_PTR(hkey), cnt, this_header);
|
||||
}
|
||||
|
||||
+33
-14
@@ -46,25 +46,17 @@ int uwsgi_proto_sctp_parser(struct wsgi_request *wsgi_req) {
|
||||
|
||||
ssize_t len = sctp_recvmsg(wsgi_req->socket->fd, wsgi_req->buffer, uwsgi.buffer_size, NULL, NULL, &sinfo, &msg_flags);
|
||||
|
||||
if (len < 0) {
|
||||
uwsgi_error("sctp_recvmsg()");
|
||||
if (msg_flags == 0) {
|
||||
// connection lost, retrigger it
|
||||
close(wsgi_req->socket->fd);
|
||||
wsgi_req->socket->fd = connect_to_sctp(wsgi_req->socket->name, wsgi_req->socket->queue);
|
||||
// avoid closing connection
|
||||
wsgi_req->fd_closed = 1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
else if (len == 0) {
|
||||
if (len <= 0) {
|
||||
if (len < 0)
|
||||
uwsgi_error("sctp_recvmsg()");
|
||||
uwsgi_log("lost connection with the SCTP server %d\n", msg_flags);
|
||||
// connection lost, retrigger it
|
||||
close(wsgi_req->socket->fd);
|
||||
wsgi_req->socket->fd = connect_to_sctp(wsgi_req->socket->name, wsgi_req->socket->queue);
|
||||
// avoid closing connection
|
||||
wsgi_req->fd_closed = 1;
|
||||
return -2;
|
||||
// no special message needed
|
||||
return -3;
|
||||
}
|
||||
|
||||
// get the uwsgi 4 bytes header from ppid
|
||||
@@ -160,13 +152,13 @@ void uwsgi_proto_sctp_close(struct wsgi_request *wsgi_req) {
|
||||
if (wsgi_req->fd_closed) return;
|
||||
|
||||
struct uwsgi_header uh;
|
||||
// ppid->modifier1 200 is used for closing requests
|
||||
uh.modifier1 = 200;
|
||||
uh.pktsize = 0;
|
||||
uh.modifier2 = 0;
|
||||
|
||||
struct sctp_sndrcvinfo sinfo;
|
||||
memset(&sinfo, 0, sizeof(struct sctp_sndrcvinfo));
|
||||
// ppid->modifier1 200 is used for closing requests
|
||||
memcpy(&sinfo.sinfo_ppid, &uh, sizeof(uint32_t));
|
||||
sinfo.sinfo_stream = wsgi_req->stream_id;
|
||||
|
||||
@@ -210,3 +202,30 @@ ssize_t uwsgi_proto_sctp_sendfile(struct wsgi_request * wsgi_req) {
|
||||
|
||||
}
|
||||
|
||||
ssize_t uwsgi_proto_sctp_read_body(struct wsgi_request * wsgi_req, char *buf, size_t len) {
|
||||
|
||||
struct sctp_sndrcvinfo sinfo;
|
||||
memset(&sinfo, 0, sizeof(sinfo));
|
||||
int msg_flags = 0;
|
||||
struct uwsgi_header *uh;
|
||||
|
||||
ssize_t slen = sctp_recvmsg(wsgi_req->socket->fd, buf, len, NULL, NULL, &sinfo, &msg_flags);
|
||||
|
||||
if (slen <= 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (wsgi_req->stream_id != sinfo.sinfo_stream) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
uh = (struct uwsgi_header *) &sinfo.sinfo_ppid;
|
||||
|
||||
if (uh->modifier1 != 199) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return slen;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1558,7 +1558,12 @@ int uwsgi_read_whole_body_in_mem(struct wsgi_request *wsgi_req, char *buf) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
len = read(wsgi_req->poll.fd, ptr, post_remains);
|
||||
if (wsgi_req->socket->proto_read_body) {
|
||||
len = wsgi_req->socket->proto_read_body(wsgi_req, ptr, post_remains);
|
||||
}
|
||||
else {
|
||||
len = read(wsgi_req->poll.fd, ptr, post_remains);
|
||||
}
|
||||
|
||||
if (len <= 0) {
|
||||
uwsgi_error("read()");
|
||||
@@ -1582,7 +1587,6 @@ int uwsgi_read_whole_body(struct wsgi_request *wsgi_req, char *buf, size_t len)
|
||||
const char *x_progress_id = "X-Progress-ID=";
|
||||
char *xpi_ptr = (char *) x_progress_id;
|
||||
|
||||
|
||||
wsgi_req->async_post = tmpfile();
|
||||
if (!wsgi_req->async_post) {
|
||||
uwsgi_error("tmpfile()");
|
||||
@@ -1668,10 +1672,20 @@ int uwsgi_read_whole_body(struct wsgi_request *wsgi_req, char *buf, size_t len)
|
||||
}
|
||||
|
||||
if (post_remains > len) {
|
||||
post_chunk = read(wsgi_req->poll.fd, buf, len);
|
||||
if (wsgi_req->socket->proto_read_body) {
|
||||
post_chunk = wsgi_req->socket->proto_read_body(wsgi_req, buf, len);
|
||||
}
|
||||
else {
|
||||
post_chunk = read(wsgi_req->poll.fd, buf, len);
|
||||
}
|
||||
}
|
||||
else {
|
||||
post_chunk = read(wsgi_req->poll.fd, buf, post_remains);
|
||||
if (wsgi_req->socket->proto_read_body) {
|
||||
post_chunk = wsgi_req->socket->proto_read_body(wsgi_req, buf, len);
|
||||
}
|
||||
else {
|
||||
post_chunk = read(wsgi_req->poll.fd, buf, post_remains);
|
||||
}
|
||||
}
|
||||
|
||||
if (post_chunk < 0) {
|
||||
@@ -4034,6 +4048,7 @@ int uwsgi_file_to_string_list(char *filename, struct uwsgi_string_list **list) {
|
||||
}
|
||||
|
||||
void uwsgi_setup_post_buffering(void) {
|
||||
int i;
|
||||
uwsgi.async_post_buf = uwsgi_malloc(sizeof(char *) * uwsgi.cores);
|
||||
if (!uwsgi.post_buffering_bufsize)
|
||||
uwsgi.post_buffering_bufsize = 8192;
|
||||
@@ -4042,6 +4057,10 @@ void uwsgi_setup_post_buffering(void) {
|
||||
uwsgi_log("setting request body buffering size to %d bytes\n", uwsgi.post_buffering_bufsize);
|
||||
}
|
||||
|
||||
for(i=0;i<uwsgi.cores;i++) {
|
||||
uwsgi.async_post_buf[i] = uwsgi_malloc(uwsgi.post_buffering_bufsize);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void uwsgi_emulate_cow_for_apps(int id) {
|
||||
|
||||
@@ -1936,9 +1936,6 @@ int uwsgi_start(void *v_argv) {
|
||||
}
|
||||
for (i = 0; i < uwsgi.cores; i++) {
|
||||
uwsgi.async_buf[i] = uwsgi_malloc(uwsgi.buffer_size);
|
||||
if (uwsgi.post_buffering > 0) {
|
||||
uwsgi.async_post_buf[i] = uwsgi_malloc(uwsgi.post_buffering_bufsize);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef UWSGI_DEBUG
|
||||
@@ -2304,6 +2301,7 @@ skipzero:
|
||||
uwsgi_sock->proto_writev_header = uwsgi_proto_sctp_writev_header;
|
||||
uwsgi_sock->proto_sendfile = uwsgi_proto_sctp_sendfile;
|
||||
uwsgi_sock->proto_close = uwsgi_proto_sctp_close;
|
||||
uwsgi_sock->proto_read_body = uwsgi_proto_sctp_read_body;
|
||||
}
|
||||
#endif
|
||||
else {
|
||||
|
||||
@@ -579,6 +579,7 @@ struct uwsgi_socket {
|
||||
ssize_t(*proto_write_header) (struct wsgi_request *, char *, size_t);
|
||||
ssize_t(*proto_writev_header) (struct wsgi_request *, struct iovec *, size_t);
|
||||
ssize_t(*proto_sendfile) (struct wsgi_request *);
|
||||
ssize_t(*proto_read_body) (struct wsgi_request *, char *, size_t);
|
||||
void (*proto_close) (struct wsgi_request *);
|
||||
int edge_trigger;
|
||||
|
||||
@@ -2349,6 +2350,7 @@ ssize_t uwsgi_proto_sctp_write_header(struct wsgi_request *, char *, size_t);
|
||||
int uwsgi_proto_sctp_accept(struct wsgi_request *, int);
|
||||
void uwsgi_proto_sctp_close(struct wsgi_request *);
|
||||
ssize_t uwsgi_proto_sctp_sendfile(struct wsgi_request *);
|
||||
ssize_t uwsgi_proto_sctp_read_body(struct wsgi_request *, char *, size_t);
|
||||
#endif
|
||||
|
||||
int uwsgi_proto_http_parser(struct wsgi_request *);
|
||||
|
||||
Reference in New Issue
Block a user