summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/Database.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2005-10-06 15:15:02 +0000
committerBenoit Foucher <benoit@zeroc.com>2005-10-06 15:15:02 +0000
commit0520bfc67149d75fbf2dffbeac27c43164f16e14 (patch)
tree962c18a611b2c530984ab89dc882061e0a335c20 /cpp/src/IceGrid/Database.cpp
parentIceGrid.ObjectNotExist -> IceGrid.ObjectNotregistered (diff)
downloadice-0520bfc67149d75fbf2dffbeac27c43164f16e14.tar.bz2
ice-0520bfc67149d75fbf2dffbeac27c43164f16e14.tar.xz
ice-0520bfc67149d75fbf2dffbeac27c43164f16e14.zip
Added support for default templates.
Added support for default parameters. Added support for findObjectByTypeOnLeastLoadedNode Added default templates descriptor (config/templates.xml)
Diffstat (limited to 'cpp/src/IceGrid/Database.cpp')
-rw-r--r--cpp/src/IceGrid/Database.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp
index fa65046637c..3523a17614c 100644
--- a/cpp/src/IceGrid/Database.cpp
+++ b/cpp/src/IceGrid/Database.cpp
@@ -112,6 +112,14 @@ private:
const AdapterPtr _adapter;
};
+struct ObjectLoadCI : binary_function<pair<Ice::ObjectPrx, float>&, pair<Ice::ObjectPrx, float>&, bool>
+{
+ bool operator()(const pair<Ice::ObjectPrx, float>& lhs, const pair<Ice::ObjectPrx, float>& rhs)
+ {
+ return lhs.second < rhs.second;
+ }
+};
+
}
Database::Database(const Ice::ObjectAdapterPtr& adapter,
@@ -843,6 +851,32 @@ Database::getObjectByType(const string& type)
return objs[rand() % objs.size()];
}
+Ice::ObjectPrx
+Database::getObjectByTypeOnLeastLoadedNode(const string& type, LoadSample sample)
+{
+ Ice::ObjectProxySeq objs = getObjectsWithType(type);
+ random_shuffle(objs.begin(), objs.end());
+ vector<pair<Ice::ObjectPrx, float> > objectsWithLoad;
+ objectsWithLoad.reserve(objs.size());
+ for(Ice::ObjectProxySeq::const_iterator p = objs.begin(); p != objs.end(); ++p)
+ {
+ float load = 1.0f;
+ if(!(*p)->ice_getAdapterId().empty())
+ {
+ try
+ {
+ load = _adapterCache.get((*p)->ice_getAdapterId())->getLeastLoadedNodeLoad(sample);
+ }
+ catch(const AdapterNotExistException&)
+ {
+ }
+ }
+ objectsWithLoad.push_back(make_pair(*p, load));
+ }
+ return min_element(objectsWithLoad.begin(), objectsWithLoad.end(), ObjectLoadCI())->first;
+}
+
+
Ice::ObjectProxySeq
Database::getObjectsWithType(const string& type)
{