From 51f005d62ed1c1c6563d19efb400672aea389008 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 9 Mar 2020 13:33:40 -0700 Subject: [PATCH] client warn when operation implicitly canceled --- src/clientget.cpp | 15 +++++++++++---- src/clientintrospect.cpp | 12 ++++++++++-- src/clientmon.cpp | 16 ++++++++++++---- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/clientget.cpp b/src/clientget.cpp index 042ede7..283aaf5 100644 --- a/src/clientget.cpp +++ b/src/clientget.cpp @@ -39,7 +39,7 @@ struct GPROp : public OperationBase :OperationBase (op, chan) {} ~GPROp() { - cancel(); + _cancel(true); } void notify() { @@ -57,11 +57,18 @@ struct GPROp : public OperationBase } } - virtual void cancel() override final - { + virtual void cancel() override final { + _cancel(false); + } + + void _cancel(bool implicit) { auto context = chan->context; decltype (done) junk; - context->tcp_loop.call([this, &junk](){ + context->tcp_loop.call([this, &junk, implicit](){ + if(implicit && state!=Done) { + log_warn_printf(setup, "implied cancel of op%x on channel '%s'\n", + op, chan ? chan->name.c_str() : ""); + } if(state==GetOPut || state==Exec) { chan->conn->sendDestroyRequest(chan->sid, ioid); diff --git a/src/clientintrospect.cpp b/src/clientintrospect.cpp index dc9c8df..2d09e71 100644 --- a/src/clientintrospect.cpp +++ b/src/clientintrospect.cpp @@ -34,13 +34,21 @@ struct InfoOp : public OperationBase virtual ~InfoOp() { - cancel(); + _cancel(true); } virtual void cancel() override final { + _cancel(false); + } + + void _cancel(bool implicit) { auto context = chan->context; decltype (done) junk; - context->tcp_loop.call([this, &junk](){ + context->tcp_loop.call([this, &junk, implicit](){ + if(implicit && state!=Done) { + log_warn_printf(setup, "implied cancel of INFO on channel '%s'\n", + chan ? chan->name.c_str() : ""); + } if(state==Waiting) { chan->conn->sendDestroyRequest(chan->sid, ioid); diff --git a/src/clientmon.cpp b/src/clientmon.cpp index 58ac220..8d188ea 100644 --- a/src/clientmon.cpp +++ b/src/clientmon.cpp @@ -66,7 +66,7 @@ struct SubscriptionImpl : public OperationBase, public Subscription ,ackTick(event_new(chan->context->tcp_loop.base, -1, EV_TIMEOUT, &tickAckS, this)) {} virtual ~SubscriptionImpl() { - cancel(); + _cancel(true); } void notify() @@ -150,11 +150,19 @@ struct SubscriptionImpl : public OperationBase, public Subscription return ret; } - virtual void cancel() override final - { + virtual void cancel() override final { + _cancel(false); + } + + void _cancel(bool implicit) { auto context = chan->context; decltype (event) junk; - context->tcp_loop.call([this, &junk](){ + context->tcp_loop.call([this, &junk, implicit](){ + if(implicit && state!=Done) { + log_info_printf(io, "Server %s channel %s monitor implied cancel\n", + chan->conn ? chan->conn->peerName.c_str() : "", + chan->name.c_str()); + } log_info_printf(io, "Server %s channel %s monitor cancel\n", chan->conn ? chan->conn->peerName.c_str() : "", chan->name.c_str());