diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Glacier2/Blobject.cpp | 111 | ||||
-rw-r--r-- | cpp/src/Glacier2/Blobject.h | 4 | ||||
-rw-r--r-- | cpp/src/Glacier2/ClientBlobject.cpp | 2 | ||||
-rw-r--r-- | cpp/src/Glacier2/Instance.cpp | 9 | ||||
-rw-r--r-- | cpp/src/Glacier2/Instance.h | 8 | ||||
-rw-r--r-- | cpp/src/Glacier2/RequestQueue.cpp | 53 | ||||
-rw-r--r-- | cpp/src/Glacier2/RequestQueue.h | 11 | ||||
-rw-r--r-- | cpp/src/Glacier2/ServerBlobject.cpp | 5 | ||||
-rw-r--r-- | cpp/src/Glacier2/ServerBlobject.h | 4 | ||||
-rw-r--r-- | cpp/src/Glacier2/SessionRouterI.cpp | 2 |
10 files changed, 160 insertions, 49 deletions
diff --git a/cpp/src/Glacier2/Blobject.cpp b/cpp/src/Glacier2/Blobject.cpp index e20b82326aa..10d2849604a 100644 --- a/cpp/src/Glacier2/Blobject.cpp +++ b/cpp/src/Glacier2/Blobject.cpp @@ -8,6 +8,7 @@ // ********************************************************************** #include <Glacier2/Blobject.h> +#include <Glacier2/SessionRouterI.h> using namespace std; using namespace Ice; @@ -29,8 +30,12 @@ class AMI_Array_Object_ice_invokeTwowayI : public AMI_Array_Object_ice_invoke { public: - AMI_Array_Object_ice_invokeTwowayI(const AMD_Array_Object_ice_invokePtr& amdCB) : - _amdCB(amdCB) + AMI_Array_Object_ice_invokeTwowayI(const AMD_Array_Object_ice_invokePtr& amdCB, + const InstancePtr& instance, + const ConnectionPtr& connection) : + _amdCB(amdCB), + _instance(instance), + _connection(connection) { } @@ -43,20 +48,50 @@ public: virtual void ice_exception(const Exception& ex) { + // + // If the connection has been lost, destroy the session. + // + if(_connection) + { + try + { + ex.ice_throw(); + } + catch(const Ice::ConnectionLostException&) + { + try + { + _instance->sessionRouter()->destroySession(_connection); + } + catch(const Exception&) + { + } + } + catch(const Exception&) + { + } + } + _amdCB->ice_exception(ex); } private: const AMD_Array_Object_ice_invokePtr _amdCB; + const InstancePtr _instance; + const ConnectionPtr _connection; }; class AMI_Array_Object_ice_invokeOnewayI : public AMI_Array_Object_ice_invoke, public Ice::AMISentCallback { public: - AMI_Array_Object_ice_invokeOnewayI(const AMD_Array_Object_ice_invokePtr& amdCB) : - _amdCB(amdCB) + AMI_Array_Object_ice_invokeOnewayI(const AMD_Array_Object_ice_invokePtr& amdCB, + const InstancePtr& instance, + const ConnectionPtr& connection) : + _amdCB(amdCB), + _instance(instance), + _connection(connection) { } @@ -75,44 +110,65 @@ public: virtual void ice_exception(const Exception& ex) { + // + // If the connection has been lost, destroy the session. + // + if(_connection) + { + try + { + ex.ice_throw(); + } + catch(const Ice::ConnectionLostException&) + { + try + { + _instance->sessionRouter()->destroySession(_connection); + } + catch(const Exception&) + { + } + } + catch(const Exception&) + { + } + } + _amdCB->ice_exception(ex); } private: const AMD_Array_Object_ice_invokePtr _amdCB; + const InstancePtr _instance; + const ConnectionPtr _connection; }; } -Glacier2::Blobject::Blobject(const InstancePtr& instance, bool reverse, const Ice::Context& sslContext) : +Glacier2::Blobject::Blobject(const InstancePtr& instance, const ConnectionPtr& reverseConnection, + const Ice::Context& sslContext) : _instance(instance), - _reverse(reverse), - _forwardContext(_reverse ? + _reverseConnection(reverseConnection), + _forwardContext(_reverseConnection ? _instance->properties()->getPropertyAsInt(serverForwardContext) > 0 : _instance->properties()->getPropertyAsInt(clientForwardContext) > 0), - _alwaysBatch(_reverse ? + _alwaysBatch(_reverseConnection ? _instance->properties()->getPropertyAsInt(serverAlwaysBatch) > 0 : _instance->properties()->getPropertyAsInt(clientAlwaysBatch) > 0), - _requestTraceLevel(_reverse ? + _requestTraceLevel(_reverseConnection ? _instance->properties()->getPropertyAsInt(serverTraceRequest) : _instance->properties()->getPropertyAsInt(clientTraceRequest)), - _overrideTraceLevel(reverse ? + _overrideTraceLevel(reverseConnection ? _instance->properties()->getPropertyAsInt(serverTraceOverride) : _instance->properties()->getPropertyAsInt(clientTraceOverride)), _sslContext(sslContext) { - RequestQueueThreadPtr t = _reverse ? _instance->serverRequestQueueThread() : _instance->clientRequestQueueThread(); + RequestQueueThreadPtr t = _reverseConnection ? _instance->serverRequestQueueThread() : + _instance->clientRequestQueueThread(); if(t) { - if(reverse) - { - const_cast<RequestQueuePtr&>(_requestQueue) = new RequestQueue(t); - } - else - { - const_cast<RequestQueuePtr&>(_requestQueue) = new RequestQueue(t); - } + const_cast<RequestQueuePtr&>(_requestQueue) = new RequestQueue(t, _instance); } } @@ -246,7 +302,7 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt if(_requestTraceLevel >= 1) { Trace out(_instance->logger(), "Glacier2"); - if(_reverse) + if(_reverseConnection) { out << "reverse "; } @@ -259,7 +315,7 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt { out << " (not buffered)"; } - if(_reverse) + if(_reverseConnection) { out << "\nidentity = " << _instance->communicator()->identityToString(proxy->ice_getIdentity()); } @@ -291,8 +347,8 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt bool override; try { - override = - _requestQueue->addRequest(new Request(proxy, inParams, current, _forwardContext, _sslContext, amdCB)); + override = _requestQueue->addRequest( + new Request(proxy, inParams, current, _forwardContext, _sslContext, amdCB, _reverseConnection)); } catch(const ObjectNotExistException& ex) { @@ -303,12 +359,12 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt if(override && _overrideTraceLevel >= 1) { Trace out(_instance->logger(), "Glacier2"); - if(_reverse) + if(_reverseConnection) { out << "reverse "; } out << "routing override"; - if(_reverse) + if(_reverseConnection) { out << "\nidentity = " << _instance->communicator()->identityToString(proxy->ice_getIdentity()); } @@ -343,11 +399,12 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt Ice::AMISentCallback* sentCB = 0; if(proxy->ice_isTwoway()) { - amiCB = new AMI_Array_Object_ice_invokeTwowayI(amdCB); + amiCB = new AMI_Array_Object_ice_invokeTwowayI(amdCB, _instance, _reverseConnection); } else { - AMI_Array_Object_ice_invokeOnewayI* cb = new AMI_Array_Object_ice_invokeOnewayI(amdCB); + AMI_Array_Object_ice_invokeOnewayI* cb = + new AMI_Array_Object_ice_invokeOnewayI(amdCB, _instance, _reverseConnection); amiCB = cb; sentCB = cb; } diff --git a/cpp/src/Glacier2/Blobject.h b/cpp/src/Glacier2/Blobject.h index d4f9d1c5b47..17866dd79f5 100644 --- a/cpp/src/Glacier2/Blobject.h +++ b/cpp/src/Glacier2/Blobject.h @@ -21,7 +21,7 @@ class Blobject : public Ice::BlobjectArrayAsync { public: - Blobject(const InstancePtr&, bool, const Ice::Context&); + Blobject(const InstancePtr&, const Ice::ConnectionPtr&, const Ice::Context&); virtual ~Blobject(); protected: @@ -30,10 +30,10 @@ protected: const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&); const InstancePtr _instance; + const Ice::ConnectionPtr _reverseConnection; private: - const bool _reverse; const bool _forwardContext; const bool _alwaysBatch; const int _requestTraceLevel; diff --git a/cpp/src/Glacier2/ClientBlobject.cpp b/cpp/src/Glacier2/ClientBlobject.cpp index 39887bcd0d4..5b7a14828cf 100644 --- a/cpp/src/Glacier2/ClientBlobject.cpp +++ b/cpp/src/Glacier2/ClientBlobject.cpp @@ -20,7 +20,7 @@ Glacier2::ClientBlobject::ClientBlobject(const InstancePtr& instance, const FilterManagerPtr& filters, const Ice::Context& sslContext): - Glacier2::Blobject(instance, false, sslContext), + Glacier2::Blobject(instance, 0, sslContext), _routingTable(new RoutingTable(_instance->communicator(), _instance->proxyVerifier())), _filters(filters), _rejectTraceLevel(_instance->properties()->getPropertyAsInt("Glacier2.Client.Trace.Reject")) diff --git a/cpp/src/Glacier2/Instance.cpp b/cpp/src/Glacier2/Instance.cpp index e2c59f0224d..f0363b64bfa 100644 --- a/cpp/src/Glacier2/Instance.cpp +++ b/cpp/src/Glacier2/Instance.cpp @@ -7,6 +7,7 @@ // // ********************************************************************** +#include <Glacier2/SessionRouterI.h> #include <Glacier2/Instance.h> using namespace std; @@ -58,4 +59,12 @@ Glacier2::Instance::destroy() { _serverRequestQueueThread->destroy(); } + + const_cast<SessionRouterIPtr&>(_sessionRouter) = 0; +} + +void +Glacier2::Instance::setSessionRouter(const SessionRouterIPtr& sessionRouter) +{ + const_cast<SessionRouterIPtr&>(_sessionRouter) = sessionRouter; } diff --git a/cpp/src/Glacier2/Instance.h b/cpp/src/Glacier2/Instance.h index b7b05ffc2cf..77410ff0c58 100644 --- a/cpp/src/Glacier2/Instance.h +++ b/cpp/src/Glacier2/Instance.h @@ -21,6 +21,9 @@ namespace Glacier2 { +class SessionRouterI; +typedef IceUtil::Handle<SessionRouterI> SessionRouterIPtr; + class Instance : public IceUtil::Shared { public: @@ -41,11 +44,15 @@ public: const RequestQueueThreadPtr& clientRequestQueueThread() const { return _clientRequestQueueThread; } const RequestQueueThreadPtr& serverRequestQueueThread() const { return _serverRequestQueueThread; } const ProxyVerifierPtr& proxyVerifier() const { return _proxyVerifier; } + const SessionRouterIPtr& sessionRouter() const { return _sessionRouter; } void destroy(); private: + friend class SessionRouterI; + void setSessionRouter(const SessionRouterIPtr&); + const Ice::CommunicatorPtr _communicator; const Ice::PropertiesPtr _properties; const Ice::LoggerPtr _logger; @@ -54,6 +61,7 @@ private: const RequestQueueThreadPtr _clientRequestQueueThread; const RequestQueueThreadPtr _serverRequestQueueThread; const ProxyVerifierPtr _proxyVerifier; + const SessionRouterIPtr _sessionRouter; }; typedef IceUtil::Handle<Instance> InstancePtr; diff --git a/cpp/src/Glacier2/RequestQueue.cpp b/cpp/src/Glacier2/RequestQueue.cpp index f1c7667f596..16eb5b6c9d2 100644 --- a/cpp/src/Glacier2/RequestQueue.cpp +++ b/cpp/src/Glacier2/RequestQueue.cpp @@ -8,6 +8,7 @@ // ********************************************************************** #include <Glacier2/RequestQueue.h> +#include <Glacier2/SessionRouterI.h> #include <set> using namespace std; @@ -24,7 +25,12 @@ class AMI_Array_Object_ice_invokeI : public AMI_Array_Object_ice_invoke { public: - AMI_Array_Object_ice_invokeI(const AMD_Array_Object_ice_invokePtr& amdCB) : _amdCB(amdCB) + AMI_Array_Object_ice_invokeI(const AMD_Array_Object_ice_invokePtr& amdCB, + const InstancePtr& instance, + const ConnectionPtr& connection) : + _amdCB(amdCB), + _instance(instance), + _connection(connection) { } @@ -40,6 +46,30 @@ public: virtual void ice_exception(const Exception& ex) { + // + // If the connection has been lost, destroy the session. + // + if(_connection) + { + try + { + ex.ice_throw(); + } + catch(const Ice::ConnectionLostException&) + { + try + { + _instance->sessionRouter()->destroySession(_connection); + } + catch(const Exception&) + { + } + } + catch(const Exception&) + { + } + } + if(_amdCB) { _amdCB->ice_exception(ex); @@ -49,19 +79,22 @@ public: private: const AMD_Array_Object_ice_invokePtr _amdCB; + const InstancePtr _instance; + const ConnectionPtr _connection; }; } Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*, const Byte*>& inParams, const Current& current, bool forwardContext, const Ice::Context& sslContext, - const AMD_Array_Object_ice_invokePtr& amdCB) : + const AMD_Array_Object_ice_invokePtr& amdCB, const ConnectionPtr& connection) : _proxy(proxy), _inParams(inParams.first, inParams.second), _current(current), _forwardContext(forwardContext), _sslContext(sslContext), - _amdCB(amdCB) + _amdCB(amdCB), + _connection(connection) { // // If this is not a twoway call, we can finish the AMD call right @@ -81,7 +114,7 @@ Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*, bool -Glacier2::Request::invoke() +Glacier2::Request::invoke(const InstancePtr& instance) { pair<const Byte*, const Byte*> inPair; if(_inParams.size() == 0) @@ -128,11 +161,11 @@ Glacier2::Request::invoke() AMI_Array_Object_ice_invokePtr amiCB; if(_proxy->ice_isTwoway()) { - amiCB = new AMI_Array_Object_ice_invokeI(_amdCB); + amiCB = new AMI_Array_Object_ice_invokeI(_amdCB, instance, _connection); } else { - amiCB = new AMI_Array_Object_ice_invokeI(0); + amiCB = new AMI_Array_Object_ice_invokeI(0, instance, _connection); } if(_forwardContext) @@ -194,8 +227,10 @@ Glacier2::Request::override(const RequestPtr& other) const return _override == other->_override; } -Glacier2::RequestQueue::RequestQueue(const RequestQueueThreadPtr& requestQueueThread) : - _requestQueueThread(requestQueueThread) +Glacier2::RequestQueue::RequestQueue(const RequestQueueThreadPtr& requestQueueThread, + const InstancePtr& instance) : + _requestQueueThread(requestQueueThread), + _instance(instance) { } @@ -238,7 +273,7 @@ Glacier2::RequestQueue::flushRequests(set<Ice::ObjectPrx>& batchProxies) { try { - if((*p)->invoke()) // If batch invocation, add the proxy to the batch proxy set. + if((*p)->invoke(_instance)) // If batch invocation, add the proxy to the batch proxy set. { batchProxies.insert((*p)->getProxy()); } diff --git a/cpp/src/Glacier2/RequestQueue.h b/cpp/src/Glacier2/RequestQueue.h index e91aa46e48b..3578511c5aa 100644 --- a/cpp/src/Glacier2/RequestQueue.h +++ b/cpp/src/Glacier2/RequestQueue.h @@ -17,6 +17,9 @@ namespace Glacier2 { +class Instance; +typedef IceUtil::Handle<Instance> InstancePtr; + class Request; typedef IceUtil::Handle<Request> RequestPtr; @@ -28,9 +31,9 @@ class Request : public IceUtil::Shared public: Request(const Ice::ObjectPrx&, const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&, bool, - const Ice::Context&, const Ice::AMD_Array_Object_ice_invokePtr&); + const Ice::Context&, const Ice::AMD_Array_Object_ice_invokePtr&, const Ice::ConnectionPtr&); - bool invoke(); + bool invoke(const InstancePtr&); bool override(const RequestPtr&) const; const Ice::ObjectPrx& getProxy() const { return _proxy; } bool hasOverride() const { return !_override.empty(); } @@ -44,13 +47,14 @@ private: const Ice::Context _sslContext; const std::string _override; const Ice::AMD_Array_Object_ice_invokePtr _amdCB; + const Ice::ConnectionPtr _connection; }; class RequestQueue : public IceUtil::Mutex, public IceUtil::Shared { public: - RequestQueue(const RequestQueueThreadPtr&); + RequestQueue(const RequestQueueThreadPtr&, const InstancePtr&); bool addRequest(const RequestPtr&); void flushRequests(std::set<Ice::ObjectPrx>&); @@ -58,6 +62,7 @@ public: private: const RequestQueueThreadPtr _requestQueueThread; + const InstancePtr _instance; std::vector<RequestPtr> _requests; }; typedef IceUtil::Handle<RequestQueue> RequestQueuePtr; diff --git a/cpp/src/Glacier2/ServerBlobject.cpp b/cpp/src/Glacier2/ServerBlobject.cpp index f528f25ecc9..628373163ce 100644 --- a/cpp/src/Glacier2/ServerBlobject.cpp +++ b/cpp/src/Glacier2/ServerBlobject.cpp @@ -14,8 +14,7 @@ using namespace Ice; using namespace Glacier2; Glacier2::ServerBlobject::ServerBlobject(const InstancePtr& instance, const ConnectionPtr& connection) : - Glacier2::Blobject(instance, true, Ice::Context()), - _connection(connection) + Glacier2::Blobject(instance, connection, Ice::Context()) { } @@ -28,7 +27,7 @@ Glacier2::ServerBlobject::ice_invoke_async(const Ice::AMD_Array_Object_ice_invok const std::pair<const Byte*, const Byte*>& inParams, const Current& current) { - ObjectPrx proxy = _connection->createProxy(current.id); + ObjectPrx proxy = _reverseConnection->createProxy(current.id); assert(proxy); invoke(proxy, amdCB, inParams, current); diff --git a/cpp/src/Glacier2/ServerBlobject.h b/cpp/src/Glacier2/ServerBlobject.h index e4a7868315c..5b94461a299 100644 --- a/cpp/src/Glacier2/ServerBlobject.h +++ b/cpp/src/Glacier2/ServerBlobject.h @@ -27,10 +27,6 @@ public: virtual void ice_invoke_async(const Ice::AMD_Array_Object_ice_invokePtr&, const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&); - -private: - - const Ice::ConnectionPtr _connection; }; } diff --git a/cpp/src/Glacier2/SessionRouterI.cpp b/cpp/src/Glacier2/SessionRouterI.cpp index 68587d74a8c..8ab1ada68df 100644 --- a/cpp/src/Glacier2/SessionRouterI.cpp +++ b/cpp/src/Glacier2/SessionRouterI.cpp @@ -677,6 +677,8 @@ Glacier2::SessionRouterI::SessionRouterI(const InstancePtr& instance, { _sessionThread->start(); } + + _instance->setSessionRouter(this); } Glacier2::SessionRouterI::~SessionRouterI() |