diff --git a/ircd/server.cc b/ircd/server.cc index 3f4d42434..346ffdce2 100644 --- a/ircd/server.cc +++ b/ircd/server.cc @@ -1351,6 +1351,17 @@ ircd::server::link::handle_writable_success() continue; } + if(tag.canceled() && tag.committed() && tag_committed() <= 1) + { + log.debug("link(%p) closing to interrupt canceled committed tag(%p) of %zu", + this, + &tag, + tag_count()); + + close(); + break; + } + if(tag_committed() == 0) wait_readable(); @@ -1423,7 +1434,7 @@ ircd::server::link::process_write_next(const const_buffer &buffer) void ircd::server::link::wait_readable() { - if(op_read || unlikely(op_fini)) + if(op_read || op_fini) return; auto handler @@ -1527,6 +1538,17 @@ try return false; } + if(tag.canceled() && tag_committed() <= 1) + { + log.debug("link(%p) closing to interrupt canceled committed tag(%p) of %zu", + this, + &tag, + tag_count()); + + close(); + return false; + } + bool done{false}; do { overrun = process_read_next(overrun, tag, done);