To add on this.. Glpyh's suggestion was to not call `request.close()` if notifyFinish() deferred has been fired. But I am not sure how do I check if that deffered is available or not.
On Mon, Aug 5, 2019 at 2:26 PM Waqar Khan <wk80...@gmail.com> wrote: > Hi Jean, > Yeah, actually that is the example that I looked into and implemented my > code. > > The issue I have is.. still some instances of interrupted responses are > not trapped. > Copying pasting my minimal implementation for your convinence > > def print_json_response(resp, request): > request.write(json.dumps(resp)) > request.close() > class FooResource(resource.Resource): > def render_GET(request): > future = asyncio.ensure_future(self.fetch_response(request)) > // some async await functions > d = Deferred.fromFuture(future) > d.addCallback(print_json_response, request) // this is > actually where the error is triggered. > d.addErrback(lambda failure: > failure.trap(defer.CancelledError)) > finished_errback = request.notifyFinish() > finished_errback.addErrback(self.handle_cancel, d) // simple > logs and cancels d by d.cancel() > return NOT_DONE_YET > > async def fetch_response(self, request): > future = {} > try: > future = await some other async def.. which returns future > except asyncio.CancelledError as e: > print("Error..", e) > return future > def handle_cancel(failure, d): > d.cancel() > print(failure.getTraceback()) > > > > > > On Mon, Aug 5, 2019 at 2:21 PM Jean-Paul Calderone < > exar...@twistedmatrix.com> wrote: > >> On Mon, Aug 5, 2019 at 2:15 PM Waqar Khan <wk80...@gmail.com> wrote: >> >>> False alarm. Seems like there are some sneaky conditions when I get the >>> error message. >>> Like before, I use to get notifyFinish error everytime. Now, it seems >>> that 6/10 times things are "clean" but then 4/10 times there are >>> notifyFinish errors. >>> Wondering on your suggestion. How do I ensure whether the notifyFinish >>> error deferred has been fired or not. >>> Could I have like a vanilla "HelloWorld" example? >>> Thanks >>> >>> >> You can find an example of this here - >> https://twistedmatrix.com/documents/current/web/howto/web-in-60/interrupted.html >> >> Jean-Paul >> >> >>> On Mon, Aug 5, 2019 at 2:24 AM Waqar Khan <wk80...@gmail.com> wrote: >>> >>>> Hi Glyph, >>>> I am not sure I understand. >>>> >>>> Is there a method/variable in request which keeps a track whether >>>> notifyFinish has been fired.. >>>> So, I can do something like. >>>> >>>> if not request.hasFiredNotifyFinish: >>>> request.finish() >>>> ?? >>>> >>>> >>>> I have sort of able to get around this issue.. though I can't put a >>>> finger on what actually worked. >>>> Here is what I did.. First change to 19.7rc01 version.. and just fix >>>> the channel issue. >>>> >>>> Next self.fetch_response(request).. This is an async def.. So what I >>>> did was.. >>>> >>>> async def fetch_response(request): >>>> future = {} >>>> try: >>>> future = await some other async def.. which returns future >>>> except asyncio.CancelledError as e: >>>> print("Error..", e) >>>> return future >>>> >>>> I basically ended up doing this everywhere where there is async/await. >>>> Next, I added this: >>>> d.addErrback(lambda failure: failure.trap(asyncio.CancelledError)) >>>> >>>> >>>> So.. now.. I don't see the notifyFinish error anymore. And I am bit >>>> terrified not to touch anything.. :-D >>>> >>>> But, I want to try out your suggestion as that seems like a more solid >>>> way to handle the issue. But I am not sure I quite understand, how do I >>>> figure out whether notifyFinish has been called before calling finish? >>>> >>>> >>>> On Mon, Aug 5, 2019 at 1:56 AM Glyph <gl...@twistedmatrix.com> wrote: >>>> >>>>> >>>>> >>>>> On Aug 4, 2019, at 9:04 PM, Waqar Khan <wk80...@gmail.com> wrote: >>>>> >>>>> Ah yes.. That is true.. >>>>> >>>>> If I comment out request.finish() (Here is the doc which I tried to >>>>> followed: >>>>> https://twistedmatrix.com/documents/13.0.0/web/howto/web-in-60/interrupted.html >>>>> ) >>>>> Then actually.. when I try to test out the code... (via curl or like >>>>> doing requests.get .. to the URI).. >>>>> it is just stuck.. >>>>> >>>>> >>>>> Yep! This makes sense; if you don't call `.finish()` *at all* then >>>>> your code will never tell the client that it's done. >>>>> >>>>> But if you call `.finish()` *after notifyFinish() has fired* then you >>>>> get that error. >>>>> >>>>> If you change your code to only call `.finish()` if the deferred >>>>> returned by notifyFinish() has not fired or failed yet, do you get the >>>>> error? It's possible that you still do, in which case, there's a bug in >>>>> Twisted that needs to be fixed. >>>>> >>>>> I do want to convey my thanks for the help. Really appreciate it. >>>>> >>>>> >>>>> Thanks for using Twisted :) >>>>> -g >>>>> >>>>> _______________________________________________ >>>>> Twisted-Python mailing list >>>>> Twisted-Python@twistedmatrix.com >>>>> https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python >>>>> >>>> _______________________________________________ >>> Twisted-Python mailing list >>> Twisted-Python@twistedmatrix.com >>> https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python >>> >> _______________________________________________ >> Twisted-Python mailing list >> Twisted-Python@twistedmatrix.com >> https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python >> >
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python