summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Glacier2/Blobject.cpp111
-rw-r--r--cpp/src/Glacier2/Blobject.h4
-rw-r--r--cpp/src/Glacier2/ClientBlobject.cpp2
-rw-r--r--cpp/src/Glacier2/Instance.cpp9
-rw-r--r--cpp/src/Glacier2/Instance.h8
-rw-r--r--cpp/src/Glacier2/RequestQueue.cpp53
-rw-r--r--cpp/src/Glacier2/RequestQueue.h11
-rw-r--r--cpp/src/Glacier2/ServerBlobject.cpp5
-rw-r--r--cpp/src/Glacier2/ServerBlobject.h4
-rw-r--r--cpp/src/Glacier2/SessionRouterI.cpp2
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()