void ProtocolV2::execute_server_wait()
{
- // TODO not implemented
- // trigger_state(state_t::SERVER_WAIT, write_state_t::delay, false);
- ceph_assert(false);
+ trigger_state(state_t::SERVER_WAIT, write_state_t::delay, false);
+ execution_done = seastar::with_gate(pending_dispatch, [this] {
+ return read_exactly(1).then([this] (auto bl) {
+ logger().warn("{} SERVER_WAIT got read, abort", conn);
+ abort_in_fault();
+ }).handle_exception([this] (std::exception_ptr eptr) {
+ logger().debug("{} execute_server_wait(): got exception {} at state {}",
+ conn, eptr, get_state_name(state));
+ close();
+ });
+ });
}
// CLOSING state
void ProtocolV2::trigger_close()
{
- if (state == state_t::ACCEPTING) {
+ if (state == state_t::ACCEPTING || state == state_t::SERVER_WAIT) {
messenger.unaccept_conn(
seastar::static_pointer_cast<SocketConnection>(
conn.shared_from_this()));
enum class state_t {
NONE = 0,
ACCEPTING,
+ SERVER_WAIT,
CONNECTING,
READY,
STANDBY,
WAIT, // ? CLIENT_WAIT
- SERVER_WAIT, // ?
REPLACING, // ?
CLOSING
};
static const char *get_state_name(state_t state) {
const char *const statenames[] = {"NONE",
"ACCEPTING",
+ "SERVER_WAIT",
"CONNECTING",
"READY",
"STANDBY",
"WAIT", // ? CLIENT_WAIT
- "SERVER_WAIT", // ?
"REPLACING", // ?
"CLOSING"};
return statenames[static_cast<int>(state)];