SCTP improvements, rack optimizations

This commit is contained in:
roberto@centos6
2012-03-07 01:40:57 +01:00
parent 881b3b7e0c
commit 4c854a83c9
8 changed files with 592 additions and 545 deletions
+1 -1
View File
@@ -6,7 +6,7 @@ json = auto
sqlite3 = auto
zeromq = auto
snmp = true
sctp = true
sctp = false
spooler = true
embedded = true
udp = true
+1
View File
@@ -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;
File diff suppressed because it is too large Load Diff
+11 -18
View File
@@ -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
View File
@@ -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;
}
+23 -4
View File
@@ -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) {
+1 -3
View File
@@ -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 {
+2
View File
@@ -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 *);