diff options
-rw-r--r-- | cpp/slice/Freeze/Evictor.ice | 49 | ||||
-rw-r--r-- | cpp/src/Freeze/EvictorI.cpp | 121 | ||||
-rw-r--r-- | cpp/src/Freeze/EvictorI.h | 4 | ||||
-rw-r--r-- | java/src/Freeze/EvictorI.java | 142 |
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) { |