Skip to content

Commit

Permalink
Revert PR #947 - merge to 7.1.x
Browse files Browse the repository at this point in the history
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 c1ac5f8.
  • Loading branch information
vmamidi authored and zwoop committed Jun 8, 2017
1 parent d91350f commit 65a001b
Show file tree
Hide file tree
Showing 4 changed files with 7 additions and 68 deletions.
3 changes: 1 addition & 2 deletions iocore/net/P_UnixNetState.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,13 @@ class UnixNetVConnection;

struct NetState {
volatile int enabled;
volatile int error;
VIO vio;
Link<UnixNetVConnection> ready_link;
SLink<UnixNetVConnection> 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
1 change: 0 additions & 1 deletion iocore/net/P_UnixNetVConnection.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
22 changes: 6 additions & 16 deletions iocore/net/UnixNet.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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) {
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand Down
49 changes: 0 additions & 49 deletions iocore/net/UnixNetVConnection.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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()) {
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit 65a001b

Please sign in to comment.