Archived
This forum has been archived. Please start a new discussion on GitHub.
ice_ping MarshalException from refreshSession in python
filip84
in Help Center
Hello,
while playing around with python demos from the book I came across a strange behaviour. Every time I try to get a session going between client and server an exception is raised:
and this is what the client sent:
However, this does not occur unless I provide my own SessionManager implementation, which looks like this:
(I've removed everything in session class just to be sure it wasn't causing this error)
Basically, it's Glacier2/callback example from the demos, with added things like session manager registering in Server.run():
and session ,manager configuration in glacier's config:
Client.py remained unchanged, since it already has session creating code in it.
I've tried variuos ways to circumvent this error including cutting out the callback management code altogether, providing a slice for me own session class extending Glacier2:Session and variuos configuration options of endpoint on the client etc. Nothing seemsy to work.
What really interests me about this error is what would glacier's router send ice_ping as normal instead of idempotent operation?
I've read Chat example's c++ source a dozen times and I can't find anything wrong with my code... even (un)checkedCast() on the session in client doesn't helped.
But maybe I am doing something wrong?
versions etc:
also tested on winxp 32 bit with 3.4.1 binaries downloaded from the site and python 2.6.4
I hope I've provided all the information needed and despite me being a "Personal" user, someone with helpful advice will ariive
Best Regards
Filip
while playing around with python demos from the book I came across a strange behaviour. Every time I try to get a session going between client and server an exception is raised:
[ 2011-01-14 16:29:49.656448 Server.py: Protocol: received request message type = 0 (request) compression status = 0 (not compressed; do not compress response, if any) message size = 74 request id = 3 identity = 2F0A6DC7-6942-4E49-99B8-7FAD33A673CC facet = operation = ice_ping mode = 0 (normal) context = ] 2011-01-14 16:29:49.656677 Server.py: warning: dispatch exception: Object.cpp:352: Ice::MarshalException: protocol error: error during marshaling or unmarshaling: unexpected operation mode. expected = ::Ice::Idempotent received = ::Ice::Normal identity: 2F0A6DC7-6942-4E49-99B8-7FAD33A673CC facet: operation: ice_ping
and this is what the client sent:
[ 2011-01-14 16:29:49.656030 Client.py: Protocol: sending asynchronous request message type = 0 (request) compression status = 0 (not compressed; do not compress response, if any) message size = 62 request id = 3 identity = DemoGlacier2/router facet = operation = refreshSession mode = 0 (normal) context = ]
However, this does not occur unless I provide my own SessionManager implementation, which looks like this:
class SessionManager(Glacier2.SessionManager): def create(self, userId, controlPrx, current): s = Session() return Glacier2.SessionPrx.uncheckedCast(current.adapter.addWithUUID(s)) class Session(Glacier2.Session): pass
(I've removed everything in session class just to be sure it wasn't causing this error)
Basically, it's Glacier2/callback example from the demos, with added things like session manager registering in Server.run():
class Server(Ice.Application)
def run(self, args):
[...]
sessManager = SessionManager()
adapter.add(sessManager, self.communicator().stringToIdentity('Callback.SessionManager'))
and session ,manager configuration in glacier's config:
Glacier2.SessionManager=Callback.SessionManager:tcp -h 127.0.0.1 -p 10000
Client.py remained unchanged, since it already has session creating code in it.
I've tried variuos ways to circumvent this error including cutting out the callback management code altogether, providing a slice for me own session class extending Glacier2:Session and variuos configuration options of endpoint on the client etc. Nothing seemsy to work.
What really interests me about this error is what would glacier's router send ice_ping as normal instead of idempotent operation?
I've read Chat example's c++ source a dozen times and I can't find anything wrong with my code... even (un)checkedCast() on the session in client doesn't helped.
But maybe I am doing something wrong?
versions etc:
Ice 3.4.1 i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664) MacOS 10.6.5 Python 2.6.6 (r266:84292, Jan 6 2011, 12:59:15) [GCC 4.2.1 (Apple Inc. build 5664)]
also tested on winxp 32 bit with 3.4.1 binaries downloaded from the site and python 2.6.4
I hope I've provided all the information needed and despite me being a "Personal" user, someone with helpful advice will ariive
Best Regards
Filip
0
Comments
-
I've tested ChatDemoGUI-Java to see how it uses refreshSession:
-- 1/14/11 18:55:32:533 Protocol: sending asynchronous request message type = 0 (request) compression status = 0 (not compressed; do not compress response, if any) message size = 58 request id = 9 identity = Glacier2/router facet = operation = refreshSession mode = 0 (normal) context =
so, "normal" mode seems to be ok here, but the router's name is different.
I've changed mine just to be 100% sure, but it doesn't help:[ 2011-01-14 19:00:43.246609 Client.py: Protocol: sending asynchronous request message type = 0 (request) compression status = 0 (not compressed; do not compress response, if any) message size = 58 request id = 4 identity = Glacier2/router facet = operation = refreshSession mode = 0 (normal) context = ] ---- SERVER: [ 2011-01-14 19:00:43.246958 Server.py: Protocol: received request message type = 0 (request) compression status = 0 (not compressed; do not compress response, if any) message size = 74 request id = 3 identity = B0F0E606-A748-4D86-85B3-1B5AE4E091A9 facet = operation = ice_ping mode = 0 (normal) context = ] 2011-01-14 19:00:43.257774 Server.py: warning: dispatch exception: Object.cpp:352: Ice::MarshalException: protocol error: error during marshaling or unmarshaling: unexpected operation mode. expected = ::Ice::Idempotent received = ::Ice::Normal identity: B0F0E606-A748-4D86-85B3-1B5AE4E091A9 facet: operation: ice_ping
Since I can't get c++ examples to build I'll modify python callback example to to see how it uses ice_ping and how server reacts to it.0 -
Hi Filip,
Welcome to the forum.
It looks like you've uncovered a bug. Actually, it's caused by a combination of issues.
If you're willing to rebuild the Ice for Python extension, I can describe how to temporarily work around the issue. We'll include a permanent fix in the next Ice release.
Regards,
Mark0 -
Well, that's just great

I always seem to come across issues never heard of before...
I have already started to edit out all calls to refreshSession in Glacier2.py, putting ice_ping() (which works fine on it's own) in it's place. I would rather use the patch though, since I have no idea what other functions may be affected by those issues you've mentioned...
Thanks for warm welcome and speedy response
0 -
This exception only occurs when a C++ or C# client makes an asynchronous invocation of one of the built-in operations (ice_ping, etc.) on a Python servant. Strange enough for you?

In your scenario, the bug is triggered by calling refreshSession on the router because the implementation of refreshSession invokes ice_ping asynchronously on the Python session manager.
To work around it, open py/modules/IcePy/Operation.cpp and comment out line 3671:
// __checkMode(op->mode, current.mode);
Disabling this call to __checkMode is harmless.
Regards,
Mark0 -
It's never a good idea to highjack an old discussion. The old problem - in 2011 - was related to operation modes and was fixed a long time ago.
I suggest you start a new discussion and describe your problem. From the screenshot above, it looks like a bug in the Python implementation of one of your Ice operations. Can you show the corresponding Slice definition and Python code?
Cheers,
Bernard0
This discussion has been closed.

