Re: [Web-SIG] Closing long-running WSGI requests (possible?)

2009-04-13 Thread Manlio Perillo
Chimezie Ogbuji ha scritto:
> Hello.  I have a problem with a WSGI-based SPARQL server that I have been
> unable to resolve for some time.  I was told this is the best place to ask
> :).  I'm building a SPARQL [1] server that is deployed as  WSGI/Paste
> server.  SPARQL queries are handled by the server and evaluated against a
> MySQL database using mysql-python/MySQLdb to manage the connection.
> 
> My goal is to be able to allow clients to close the connection in order to
> kill queries that have been dispatched (in order to 'abort' them).
> Unfortunately, when the client kills the connection, the application is not
> signaled in any way.  So, the result is that (for long-running queries), the
> MySQL query continues to run even after the connection is closed (by
> clicking cancel in the browser for instance).
> 
> [...]

What you want to do is not possible.

A more viable solution is to use JavaScript.
Add a custom "abort button" on the web page so that a function is
associate to the "click" event.

Also, you should associate a function to the "unload" event (where you
can check if there are active queries).

In the JavaScript function you can issue an XMLHTTPRequest, using an
unique identifier.

Note that if you use PostgreSQL, you can use:
http://www.postgresql.org/docs/8.3/interactive/protocol-flow.html#AEN73870

When you create a connection to PostgreSQL, the server will send you the
backend process id an unique key.

You can use this data to send a cancellation request.
All you need to do is to pass the process id and the unique key to the
client (with some encryption so that the client can use the data only once).

Unfortunately, libpq does not offer a flexible interface to this feature.
The PGCancel structure is opaque, so you need some hacking.



Manlio Perillo
___
Web-SIG mailing list
Web-SIG@python.org
Web SIG: http://www.python.org/sigs/web-sig
Unsubscribe: 
http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com


Re: [Web-SIG] Closing long-running WSGI requests (possible?)

2009-04-13 Thread Graham Dumpleton
No, cannot really be done. This has been discussed a couple of times
on the mod_wsgi list. One such discussion is at:

  http://groups.google.com/group/modwsgi/browse_frm/thread/8ebd9aca9d317ac9

In general the same issues apply to all WSGI implementations.

Graham

2009/4/14 Chimezie Ogbuji :
> Hello.  I have a problem with a WSGI-based SPARQL server that I have been
> unable to resolve for some time.  I was told this is the best place to ask
> :).  I'm building a SPARQL [1] server that is deployed as  WSGI/Paste
> server.  SPARQL queries are handled by the server and evaluated against a
> MySQL database using mysql-python/MySQLdb to manage the connection.
>
> My goal is to be able to allow clients to close the connection in order to
> kill queries that have been dispatched (in order to 'abort' them).
> Unfortunately, when the client kills the connection, the application is not
> signaled in any way.  So, the result is that (for long-running queries), the
> MySQL query continues to run even after the connection is closed (by
> clicking cancel in the browser for instance).
>
> I would expect that when the connection is closed at the client side, this
> should trigger a chain reaction of garbage collection (deletion of the
> application object, and all the objects attributed to it including the DB
> connection, etc.) that bottoms out in the db connection closing and MySQLdb
> killing the query as a side effect of calling __del__ on the cursor and
> database connection.  However, this is not what is happening and it appears
> that the once the result is served back to the client, the server and the
> client are completely 'disconnected' for that particular request.
>
> Am I going about his the wrong way? Does WSGI simply not have anything to
> say about such a situation ? If the problem isn't
> WSGI, is there another WSGI implementation that is known to behave as
> expected (i.e., closing the connection dispatches the deletion of the
> objects involved in the request handling)?
>
> I was told to look into keep-alive, but the specification doesn't seem to
> suggest that this would help me as it has more to do with re-using
> connections for subsequent requests rather than specifying that the server
> maintains a connection between the request and the objects involved in
> handling the request at the server.
>
> Any help would be greatly appreciated.
>
> Thanks
>
> [1] http://www.w3.org/TR/rdf-sparql-query/
>
>
> ===
>
> P Please consider the environment before printing this e-mail
>
> Cleveland Clinic is ranked one of the top hospitals
> in America by U.S. News & World Report (2008).
> Visit us online at http://www.clevelandclinic.org for
> a complete listing of our services, staff and
> locations.
>
>
> Confidentiality Note:  This message is intended for use
> only by the individual or entity to which it is addressed
> and may contain information that is privileged,
> confidential, and exempt from disclosure under applicable
> law.  If the reader of this message is not the intended
> recipient or the employee or agent responsible for
> delivering the message to the intended recipient, you are
> hereby notified that any dissemination, distribution or
> copying of this communication is strictly prohibited.  If
> you have received this communication in error,  please
> contact the sender immediately and destroy the material in
> its entirety, whether electronic or hard copy.  Thank you.
>
> ___
> Web-SIG mailing list
> Web-SIG@python.org
> Web SIG: http://www.python.org/sigs/web-sig
> Unsubscribe: 
> http://mail.python.org/mailman/options/web-sig/graham.dumpleton%40gmail.com
>
___
Web-SIG mailing list
Web-SIG@python.org
Web SIG: http://www.python.org/sigs/web-sig
Unsubscribe: 
http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com


Re: [Web-SIG] Closing long-running WSGI requests (possible?)

2009-04-13 Thread Aaron Watters

I agree with Ionel

I personally wouldn't rely on "kill wsgi request".
I'd run the update in a subprocess and kill the subprocess
using a signal when the user requests (on unix, of course).
I'd also check a log written by the subprocess to see
whether it completed or not.

If you "kill the wsgi request" you have the problem
of not being quite sure whether the kill arrived in time,
among other possible difficulties, some mentioned by Ionel.

  -- Aaron Watters
 http://aaron.oirt.rutgers.edu/myapp/docs/W0500.quickstart

(apologies to Christian, who got this twice, I forgot to "reply all")


--- On Mon, 4/13/09, Ionel Maries Cristian  wrote:

> From: Ionel Maries Cristian 
> Subject: Re: [Web-SIG] Closing long-running WSGI requests (possible?)
> To: "Christian Wyglendowski" 
> Cc: "Chimezie Ogbuji" , web-sig@python.org
> Date: Monday, April 13, 2009, 12:01 PM
> That implies one would have extremely
> reliable tcp connections, and clients
> graciously shutdown the connection and the server is
> notified of that.
> 
> Most of the time that doesn't happen and the solution
> is to continuously send 
> 
> keepalive packets (some small string or whatever) - I'm
> assuming you run
> a batch a set of queries and you can interleave yielding
> some data while
> you run that batch.
> 
> For example if your client disconnects and the servers
> tries to send some data
> 
> it would fail - and trigger closing the app iterable.
> 
> In contrast a server that just runs some backend processing
> without moving 
> any data around doesn't have any way to know if the
> connection is still valid.
> 
> 
> Then again, even if the client properly shutdown the
> connection the server
> won't do anything about it if it doesn't try to do
> anything with the socket due
> to the synchronous nature (I'm assuming) of the whole
> server/app.
> 
> 
> -- ionel
> 
> 
> 
> 
> On Mon, Apr 13, 2009 at 17:53,
> Christian Wyglendowski 
> wrote:
> 
> On Mon, Apr 13, 2009 at 10:40 AM, Chimezie
> Ogbuji 
> wrote:
> 
> > Hello.  I have a problem with a WSGI-based SPARQL
> server that I have been
> 
> > unable to resolve for some time.  I was told this is
> the best place to ask
> 
> > :).  I'm building a SPARQL [1] server that is
> deployed as  WSGI/Paste
> 
> > server.  SPARQL queries are handled by the server and
> evaluated against a
> 
> > MySQL database using mysql-python/MySQLdb to manage
> the connection.
> 
> >
> 
> > My goal is to be able to allow clients to close the
> connection in order to
> 
> > kill queries that have been dispatched (in order to
> 'abort' them).
> 
> 
> 
> This should be doable from what I understand.  From
> PEP 333:
> 
> 
> 
> "If the iterable returned by the application has a
> close() method, the
> 
> server or gateway must call that method upon completion of
> the current
> 
> request, whether the request was completed normally, or
> terminated
> 
> early due to an error. (This is to support resource release
> by the
> 
> application. This protocol is intended to complement PEP
> 325's
> 
> generator support, and other common iterables with close()
> methods."
> 
> [1]
> 
> 
> 
> So it sounds like you could add a close method on whatever
> iterable
> 
> that your application returns and have it do the required
> resource
> 
> release there.
> 
> 
> 
> HTH,
> 
> 
> 
> Christian
> 
> http://www.dowski.com
> 
> 
> 
> [1] http://www.python.org/dev/peps/pep-0333/#specification-details
> 
> ___
> 
> Web-SIG mailing list
> 
> Web-SIG@python.org
> 
> Web SIG: http://www.python.org/sigs/web-sig
> 
> Unsubscribe: 
> http://mail.python.org/mailman/options/web-sig/ionel.mc%40gmail.com
> 
> 
> 
> 
> -Inline Attachment Follows-
> 
> ___
> Web-SIG mailing list
> Web-SIG@python.org
> Web SIG: http://www.python.org/sigs/web-sig
> Unsubscribe: 
> http://mail.python.org/mailman/options/web-sig/arw1961%40yahoo.com
> 
___
Web-SIG mailing list
Web-SIG@python.org
Web SIG: http://www.python.org/sigs/web-sig
Unsubscribe: 
http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com


Re: [Web-SIG] Closing long-running WSGI requests (possible?)

2009-04-13 Thread Ionel Maries Cristian
That implies one would have extremely reliable tcp connections, and clients
graciously shutdown the connection and the server is notified of that.

Most of the time that doesn't happen and the solution is to continuously
send
keepalive packets (some small string or whatever) - I'm assuming you run
a batch a set of queries and you can interleave yielding some data while
you run that batch.

For example if your client disconnects and the servers tries to send some
data
it would fail - and trigger closing the app iterable.

In contrast a server that just runs some backend processing without moving
any data around doesn't have any way to know if the connection is still
valid.

Then again, even if the client properly shutdown the connection the server
won't do anything about it if it doesn't try to do anything with the socket
due
to the synchronous nature (I'm assuming) of the whole server/app.

-- ionel



On Mon, Apr 13, 2009 at 17:53, Christian Wyglendowski
wrote:

> On Mon, Apr 13, 2009 at 10:40 AM, Chimezie Ogbuji  wrote:
> > Hello.  I have a problem with a WSGI-based SPARQL server that I have been
> > unable to resolve for some time.  I was told this is the best place to
> ask
> > :).  I'm building a SPARQL [1] server that is deployed as  WSGI/Paste
> > server.  SPARQL queries are handled by the server and evaluated against a
> > MySQL database using mysql-python/MySQLdb to manage the connection.
> >
> > My goal is to be able to allow clients to close the connection in order
> to
> > kill queries that have been dispatched (in order to 'abort' them).
>
> This should be doable from what I understand.  From PEP 333:
>
> "If the iterable returned by the application has a close() method, the
> server or gateway must call that method upon completion of the current
> request, whether the request was completed normally, or terminated
> early due to an error. (This is to support resource release by the
> application. This protocol is intended to complement PEP 325's
> generator support, and other common iterables with close() methods."
> [1]
>
> So it sounds like you could add a close method on whatever iterable
> that your application returns and have it do the required resource
> release there.
>
> HTH,
>
> Christian
> http://www.dowski.com
>
> [1] http://www.python.org/dev/peps/pep-0333/#specification-details
> ___
> Web-SIG mailing list
> Web-SIG@python.org
> Web SIG: http://www.python.org/sigs/web-sig
> Unsubscribe:
> http://mail.python.org/mailman/options/web-sig/ionel.mc%40gmail.com
>
___
Web-SIG mailing list
Web-SIG@python.org
Web SIG: http://www.python.org/sigs/web-sig
Unsubscribe: 
http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com


Re: [Web-SIG] Closing long-running WSGI requests (possible?)

2009-04-13 Thread Christian Wyglendowski
On Mon, Apr 13, 2009 at 10:40 AM, Chimezie Ogbuji  wrote:
> Hello.  I have a problem with a WSGI-based SPARQL server that I have been
> unable to resolve for some time.  I was told this is the best place to ask
> :).  I'm building a SPARQL [1] server that is deployed as  WSGI/Paste
> server.  SPARQL queries are handled by the server and evaluated against a
> MySQL database using mysql-python/MySQLdb to manage the connection.
>
> My goal is to be able to allow clients to close the connection in order to
> kill queries that have been dispatched (in order to 'abort' them).

This should be doable from what I understand.  From PEP 333:

"If the iterable returned by the application has a close() method, the
server or gateway must call that method upon completion of the current
request, whether the request was completed normally, or terminated
early due to an error. (This is to support resource release by the
application. This protocol is intended to complement PEP 325's
generator support, and other common iterables with close() methods."
[1]

So it sounds like you could add a close method on whatever iterable
that your application returns and have it do the required resource
release there.

HTH,

Christian
http://www.dowski.com

[1] http://www.python.org/dev/peps/pep-0333/#specification-details
___
Web-SIG mailing list
Web-SIG@python.org
Web SIG: http://www.python.org/sigs/web-sig
Unsubscribe: 
http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com