From 61591174f65775d0a39e39e361d61dbea067f96c Mon Sep 17 00:00:00 2001 From: Vijay Mamidi Date: Thu, 8 Jun 2017 13:59:29 -0700 Subject: [PATCH] Revert PR #947 - merge to 7.1.x This reverts PRs #1559, #1522 and #947 PR #947 made the HTTP state machine unstable and lead to crashes in production like #1930 #1559 #1522 #1531 #1629 This reverts commit c1ac5f8bf87fd4bc3a8e06507219970d83965acd. --- iocore/net/P_UnixNetState.h | 3 +- iocore/net/P_UnixNetVConnection.h | 1 - iocore/net/UnixNet.cc | 22 ++++---------- iocore/net/UnixNetVConnection.cc | 49 ------------------------------- 4 files changed, 7 insertions(+), 68 deletions(-) diff --git a/iocore/net/P_UnixNetState.h b/iocore/net/P_UnixNetState.h index ca807afb20d..5bdb6d00cd2 100644 --- a/iocore/net/P_UnixNetState.h +++ b/iocore/net/P_UnixNetState.h @@ -48,14 +48,13 @@ class UnixNetVConnection; struct NetState { volatile int enabled; - volatile int error; VIO vio; Link ready_link; SLink enable_link; int in_enabled_list; int triggered; - NetState() : enabled(0), error(0), vio(VIO::NONE), in_enabled_list(0), triggered(0) {} + NetState() : enabled(0), vio(VIO::NONE), in_enabled_list(0), triggered(0) {} }; #endif diff --git a/iocore/net/P_UnixNetVConnection.h b/iocore/net/P_UnixNetVConnection.h index e5b5d25da65..4d071a92d29 100644 --- a/iocore/net/P_UnixNetVConnection.h +++ b/iocore/net/P_UnixNetVConnection.h @@ -237,7 +237,6 @@ class UnixNetVConnection : public NetVConnection virtual int64_t load_buffer_and_write(int64_t towrite, MIOBufferAccessor &buf, int64_t &total_written, int &needs); void readDisable(NetHandler *nh); void readSignalError(NetHandler *nh, int err); - void writeSignalError(NetHandler *nh, int err); int readSignalDone(int event, NetHandler *nh); int readSignalAndUpdate(int event); void readReschedule(NetHandler *nh); diff --git a/iocore/net/UnixNet.cc b/iocore/net/UnixNet.cc index b574032728d..7b50136be7f 100644 --- a/iocore/net/UnixNet.cc +++ b/iocore/net/UnixNet.cc @@ -450,13 +450,8 @@ NetHandler::mainNetEvent(int event, Event *e) if (cop_list.in(vc)) { cop_list.remove(vc); } - if (get_ev_events(pd, x) & EVENTIO_READ) { + if (get_ev_events(pd, x) & (EVENTIO_READ | EVENTIO_ERROR)) { vc->read.triggered = 1; - if (get_ev_events(pd, x) & EVENTIO_ERROR) { - vc->read.error = 1; - } else { - vc->read.error = 0; - } if (!read_ready_list.in(vc)) { read_ready_list.enqueue(vc); } else if (get_ev_events(pd, x) & EVENTIO_ERROR) { @@ -466,13 +461,8 @@ NetHandler::mainNetEvent(int event, Event *e) } } vc = epd->data.vc; - if (get_ev_events(pd, x) & EVENTIO_WRITE) { + if (get_ev_events(pd, x) & (EVENTIO_WRITE | EVENTIO_ERROR)) { vc->write.triggered = 1; - if (get_ev_events(pd, x) & EVENTIO_ERROR) { - vc->write.error = 1; - } else { - vc->write.error = 0; - } if (!write_ready_list.in(vc)) { write_ready_list.enqueue(vc); } else if (get_ev_events(pd, x) & EVENTIO_ERROR) { @@ -505,7 +495,7 @@ NetHandler::mainNetEvent(int event, Event *e) set_cont_flags(vc->control_flags); if (vc->closed) close_UnixNetVConnection(vc, trigger_event->ethread); - else if (vc->read.triggered && (vc->read.enabled || (vc->read.error && vc->read.vio._cont != nullptr))) + else if (vc->read.enabled && vc->read.triggered) vc->net_read_io(this, trigger_event->ethread); else if (!vc->read.enabled) { read_ready_list.remove(vc); @@ -522,7 +512,7 @@ NetHandler::mainNetEvent(int event, Event *e) set_cont_flags(vc->control_flags); if (vc->closed) close_UnixNetVConnection(vc, trigger_event->ethread); - else if (vc->write.triggered && (vc->write.enabled || (vc->write.error && vc->write.vio._cont != nullptr))) + else if (vc->write.enabled && vc->write.triggered) write_to_net(this, vc, trigger_event->ethread); else if (!vc->write.enabled) { write_ready_list.remove(vc); @@ -540,7 +530,7 @@ NetHandler::mainNetEvent(int event, Event *e) diags->set_override(vc->control.debug_override); if (vc->closed) close_UnixNetVConnection(vc, trigger_event->ethread); - else if (vc->read.triggered && (vc->read.enabled || (vc->read.error && vc->read.vio._cont != nullptr))) + else if (vc->read.enabled && vc->read.triggered) vc->net_read_io(this, trigger_event->ethread); else if (!vc->read.enabled) vc->ep.modify(-EVENTIO_READ); @@ -549,7 +539,7 @@ NetHandler::mainNetEvent(int event, Event *e) diags->set_override(vc->control.debug_override); if (vc->closed) close_UnixNetVConnection(vc, trigger_event->ethread); - else if (vc->write.triggered && (vc->write.enabled || (vc->write.error && vc->write.vio._cont != nullptr))) + else if (vc->write.enabled && vc->write.triggered) write_to_net(this, vc, trigger_event->ethread); else if (!vc->write.enabled) vc->ep.modify(-EVENTIO_WRITE); diff --git a/iocore/net/UnixNetVConnection.cc b/iocore/net/UnixNetVConnection.cc index a737938b935..113410d931f 100644 --- a/iocore/net/UnixNetVConnection.cc +++ b/iocore/net/UnixNetVConnection.cc @@ -263,32 +263,6 @@ read_from_net(NetHandler *nh, UnixNetVConnection *vc, EThread *thread) return; } - if (!s->enabled && vc->read.error) { - int err = 0, errlen = sizeof(int); - if (getsockopt(vc->con.fd, SOL_SOCKET, SO_ERROR, &err, (socklen_t *)&errlen) == -1) { - err = errno; - } - - // if it is a non-temporary error, we should die appropriately - if (err && err != EAGAIN && err != EINTR) { - Continuation *reader_cont = vc->read.vio._cont; - - if (read_signal_error(nh, vc, err) == EVENT_DONE) { - return; - } - // If vc is closed or shutdown(WRITE) in last read_signal_error callback, - // or reader_cont is same as write.vio._cont. - // Then we must clear the write.error to avoid callback EVENT_ERROR to SM by write_ready_list. - if (vc->closed || (vc->f.shutdown & NET_VC_SHUTDOWN_WRITE) || reader_cont == vc->write.vio._cont) { - vc->write.error = 0; - } - return; - } - - // clear read.error if it is non-fatal error - vc->read.error = 0; - } - // if it is not enabled. if (!s->enabled || s->vio.op != VIO::READ) { read_disable(nh, vc); @@ -456,23 +430,6 @@ write_to_net_io(NetHandler *nh, UnixNetVConnection *vc, EThread *thread) return; } - if (!s->enabled && vc->write.error) { - int err = 0, errlen = sizeof(int); - if (getsockopt(vc->con.fd, SOL_SOCKET, SO_ERROR, &err, (socklen_t *)&errlen) == -1) { - err = errno; - } - - if (err && err != EAGAIN && err != EINTR) { - // Here is differ to net_read_io since read_signal_error always callback first. - // NetHandler::mainNetEvent() is always handle read_ready_list first and then write_ready_list. - write_signal_error(nh, vc, err); - return; - } - - // clear write.error if it is non-fatal error. - vc->write.error = 0; - } - // This function will always return true unless // vc is an SSLNetVConnection. if (!vc->getSSLHandShakeComplete()) { @@ -1124,12 +1081,6 @@ UnixNetVConnection::readSignalError(NetHandler *nh, int err) read_signal_error(nh, this, err); } -void -UnixNetVConnection::writeSignalError(NetHandler *nh, int err) -{ - write_signal_error(nh, this, err); -} - int UnixNetVConnection::readSignalDone(int event, NetHandler *nh) {