summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2004-04-17 23:56:50 +0000
committerBernard Normier <bernard@zeroc.com>2004-04-17 23:56:50 +0000
commit7ccd312b97da3a37737c6546649aa59b2cd69a7f (patch)
treebc05a00abc446fcf664214584126b65c83782802
parentImplemented IceUtil.Cache properly (diff)
downloadice-7ccd312b97da3a37737c6546649aa59b2cd69a7f.tar.bz2
ice-7ccd312b97da3a37737c6546649aa59b2cd69a7f.tar.xz
ice-7ccd312b97da3a37737c6546649aa59b2cd69a7f.zip
Added back createObject and destroyObject
-rw-r--r--cpp/slice/Freeze/Evictor.ice49
-rw-r--r--cpp/src/Freeze/EvictorI.cpp121
-rw-r--r--cpp/src/Freeze/EvictorI.h4
-rw-r--r--java/src/Freeze/EvictorI.java142
4 files changed, 312 insertions, 4 deletions
diff --git a/cpp/slice/Freeze/Evictor.ice b/cpp/slice/Freeze/Evictor.ice
index 4ae71e2f077..b74ce9811f4 100644
--- a/cpp/slice/Freeze/Evictor.ice
+++ b/cpp/slice/Freeze/Evictor.ice
@@ -335,6 +335,55 @@ local interface Evictor extends Ice::ServantLocator
*
**/
EvictorIterator getIterator(string facet, int batchSize);
+
+
+ /**
+ *
+ * Add or update a servant. The state of the servant passed to
+ * this operation will be saved in the evictor's persistent store.
+ *
+ * This operation is deprecated and will be removed in a future release.
+ * It is recommended to use add instead.
+ *
+ * @param id The identity of the &Ice; object that is implemented by
+ * the servant.
+ *
+ * @param servant The servant to add.
+ *
+ * @throws DatabaseException Raised if a database failure occurred.
+ *
+ * @throws EvictorDeactivatedException Raised if the evictor has
+ * been deactivated.
+ *
+ * @see add
+ * @see destroyObject
+ *
+ **/
+ void createObject(Ice::Identity id, Object servant);
+
+
+ /**
+ *
+ * Permanently destroy an &Ice; object. Like remove, except
+ * destroyObject does not raise any exception when the object does
+ * not exist.
+ *
+ * This operation is deprecated and will be removed in a future release.
+ * It is recommended to use remove instead.
+ *
+ * @param id The identity of the &Ice; object.
+ *
+ * @throws DatabaseException Raised if a database failure occurred.
+ *
+ * @throws EvictorDeactivatedException Raised if the evictor has
+ * been deactivated.
+ *
+ * @see remove
+ * @see createObject
+ *
+ **/
+ void destroyObject(Ice::Identity id);
+
};
};
diff --git a/cpp/src/Freeze/EvictorI.cpp b/cpp/src/Freeze/EvictorI.cpp
index 511d7c48453..c81525ef805 100644
--- a/cpp/src/Freeze/EvictorI.cpp
+++ b/cpp/src/Freeze/EvictorI.cpp
@@ -419,7 +419,107 @@ Freeze::EvictorI::addFacet(const ObjectPtr& servant, const Identity& ident, cons
// TODO: there is currently no way to create an ObjectPrx
// with a facet!
//
- return _adapter->createProxy(ident);
+ return 0;
+}
+
+//
+// Deprecated
+//
+void
+Freeze::EvictorI::createObject(const Identity& ident, const ObjectPtr& servant)
+{
+ ObjectStore* store = findStore("");
+ assert(store != 0);
+
+ for(;;)
+ {
+ //
+ // Create a new entry
+ //
+
+ EvictorElementPtr element = new EvictorElement(*store);
+ element->status = EvictorElement::dead;
+ pair<EvictorElementPtr, bool> ir = store->insert(ident, element);
+
+ if(ir.second == false)
+ {
+ element = ir.first;
+ }
+
+ {
+ Lock sync(*this);
+
+ if(_deactivated)
+ {
+ throw EvictorDeactivatedException(__FILE__, __LINE__);
+ }
+
+ if(element->stale)
+ {
+ //
+ // Try again
+ //
+ continue;
+ }
+ fixEvictPosition(element);
+
+ IceUtil::Mutex::Lock lock(element->mutex);
+
+ switch(element->status)
+ {
+ case EvictorElement::clean:
+ {
+ element->status = EvictorElement::modified;
+ element->rec.servant = servant;
+ addToModifiedQueue(element);
+ break;
+ }
+ case EvictorElement::created:
+ case EvictorElement::modified:
+ {
+ element->rec.servant = servant;
+ break;
+ }
+ case EvictorElement::destroyed:
+ {
+ element->status = EvictorElement::modified;
+ element->rec.servant = servant;
+
+ //
+ // No need to push it on the modified queue, as a destroyed object
+ // is either already on the queue or about to be saved. When saved,
+ // it becomes dead.
+ //
+ break;
+ }
+ case EvictorElement::dead:
+ {
+ element->status = EvictorElement::created;
+ ObjectRecord& rec = element->rec;
+
+ rec.servant = servant;
+ rec.stats.creationTime = IceUtil::Time::now().toMilliSeconds();
+ rec.stats.lastSaveTime = 0;
+ rec.stats.avgSaveTime = 0;
+
+ addToModifiedQueue(element);
+ break;
+ }
+ default:
+ {
+ assert(0);
+ break;
+ }
+ }
+ }
+ break; // for(;;)
+ }
+
+ if(_trace >= 1)
+ {
+ Trace out(_communicator->getLogger(), "Freeze.Evictor");
+ out << "added object \"" << ident << "\"";
+ }
}
void
@@ -527,6 +627,25 @@ Freeze::EvictorI::removeFacet(const Identity& ident, const string& facet)
}
}
+//
+// Deprecated
+//
+void
+Freeze::EvictorI::destroyObject(const Identity& ident)
+{
+ try
+ {
+ remove(ident);
+ }
+ catch(NotRegisteredException&)
+ {
+ //
+ // Ignored
+ //
+ }
+}
+
+
EvictorIteratorPtr
Freeze::EvictorI::getIterator(const string& facet, Int batchSize)
{
diff --git a/cpp/src/Freeze/EvictorI.h b/cpp/src/Freeze/EvictorI.h
index 836d76e2b5b..91dc4b60675 100644
--- a/cpp/src/Freeze/EvictorI.h
+++ b/cpp/src/Freeze/EvictorI.h
@@ -47,10 +47,12 @@ public:
virtual Ice::ObjectPrx add(const Ice::ObjectPtr&, const Ice::Identity&);
virtual Ice::ObjectPrx addFacet(const Ice::ObjectPtr&, const Ice::Identity&, const std::string&);
+ virtual void createObject(const Ice::Identity&, const Ice::ObjectPtr&);
virtual void remove(const Ice::Identity&);
virtual void removeFacet(const Ice::Identity&, const std::string&);
-
+ virtual void destroyObject(const Ice::Identity&);
+
virtual bool hasObject(const Ice::Identity&);
virtual bool hasFacet(const Ice::Identity&, const std::string&);
diff --git a/java/src/Freeze/EvictorI.java b/java/src/Freeze/EvictorI.java
index 8c017857243..c12791ce961 100644
--- a/java/src/Freeze/EvictorI.java
+++ b/java/src/Freeze/EvictorI.java
@@ -389,8 +389,127 @@ class EvictorI extends Ice.LocalObjectImpl implements Evictor, Runnable
// TODO: there is currently no way to create an ObjectPrx
// with a facet!
//
- return _adapter.createProxy(ident);
+ return null;
}
+
+
+ //
+ // Deprecated
+ //
+ public void
+ createObject(Ice.Identity ident, Ice.Object servant)
+ {
+ //
+ // Need to clone in case the given ident changes.
+ //
+ try
+ {
+ ident = (Ice.Identity) ident.clone();
+ }
+ catch(CloneNotSupportedException ex)
+ {
+ assert false;
+ }
+
+ ObjectStore store = findStore("");
+ assert store != null;
+
+ for(;;)
+ {
+ //
+ // Create a new entry
+ //
+
+ EvictorElement element = new EvictorElement(ident, store);
+ element.status = EvictorElement.dead;
+ element.rec = new ObjectRecord();
+ element.rec.stats = new Statistics();
+
+ Object o = store.cache().putIfAbsent(ident, element);
+
+ if(o != null)
+ {
+ element = (EvictorElement) o;
+ }
+
+ synchronized(this)
+ {
+ if(_deactivated)
+ {
+ throw new EvictorDeactivatedException();
+ }
+
+ if(element.stale)
+ {
+ //
+ // Try again
+ //
+ continue;
+ }
+ fixEvictPosition(element);
+
+ synchronized(element)
+ {
+ switch(element.status)
+ {
+ case EvictorElement.clean:
+ {
+ element.status = EvictorElement.modified;
+ element.rec.servant = servant;
+ addToModifiedQueue(element);
+ break;
+ }
+ case EvictorElement.created:
+ case EvictorElement.modified:
+ {
+ element.rec.servant = servant;
+ break;
+ }
+ case EvictorElement.destroyed:
+ {
+ element.status = EvictorElement.modified;
+ element.rec.servant = servant;
+
+ //
+ // No need to push it on the modified queue, as a destroyed object
+ // is either already on the queue or about to be saved. When saved,
+ // it becomes dead.
+ //
+ break;
+ }
+ case EvictorElement.dead:
+ {
+ element.status = EvictorElement.created;
+ ObjectRecord rec = element.rec;
+
+ rec.servant = servant;
+ rec.stats.creationTime = System.currentTimeMillis();
+ rec.stats.lastSaveTime = 0;
+ rec.stats.avgSaveTime = 0;
+
+ addToModifiedQueue(element);
+ break;
+ }
+ default:
+ {
+ assert false;
+ break;
+ }
+ }
+ }
+ }
+ break; // for(;;)
+ }
+
+ if(_trace >= 1)
+ {
+ String objString = "object \"" + Ice.Util.identityToString(ident) + "\"";
+ _communicator.getLogger().trace(
+ "Freeze.Evictor",
+ "added or updated " + objString + " in the database");
+ }
+ }
+
public void
remove(Ice.Identity ident)
@@ -515,7 +634,26 @@ class EvictorI extends Ice.LocalObjectImpl implements Evictor, Runnable
}
}
-
+
+
+ //
+ // Deprecated
+ //
+ public void
+ destroyObject(Ice.Identity ident)
+ {
+ try
+ {
+ remove(ident);
+ }
+ catch(Ice.NotRegisteredException e)
+ {
+ //
+ // Ignored
+ //
+ }
+ }
+
public EvictorIterator
getIterator(String facet, int batchSize)
{