diff options
author | Bernard Normier <bernard@zeroc.com> | 2007-05-30 13:18:35 +0000 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2007-05-30 13:18:35 +0000 |
commit | cd8abbb04a79b0d93f34742c49b06607e4e989f7 (patch) | |
tree | fabe04903dac6bd3ecf2ac6f3248ab5c22300fa7 | |
parent | fix problem with possible use of uninitialized local variable (diff) | |
download | ice-cd8abbb04a79b0d93f34742c49b06607e4e989f7.tar.bz2 ice-cd8abbb04a79b0d93f34742c49b06607e4e989f7.tar.xz ice-cd8abbb04a79b0d93f34742c49b06607e4e989f7.zip |
Removed transactional evictor context
36 files changed, 653 insertions, 404 deletions
diff --git a/cpp/CHANGES b/cpp/CHANGES index b5a26b6cffa..c9f57723b1a 100644 --- a/cpp/CHANGES +++ b/cpp/CHANGES @@ -1,6 +1,10 @@ Changes since version 3.2.X (binary incompabible) ------------------------------------------------- +- Freeze evictor update: + - the existing evictor was renamed BackgroundSaveEvictor + - added new TransactionalEvictor + - Fixed a bug in the encoding of user exceptions with a class attribute and returned by AMD dispatched invocations. An extra byte was encoded at the end. This fix doesn't affect on the wire diff --git a/cpp/slice/Freeze/BackgroundSaveEvictor.ice b/cpp/slice/Freeze/BackgroundSaveEvictor.ice index 089f01d0f7f..70c78a32102 100644 --- a/cpp/slice/Freeze/BackgroundSaveEvictor.ice +++ b/cpp/slice/Freeze/BackgroundSaveEvictor.ice @@ -15,6 +15,13 @@ module Freeze { +/** + * + * A background-save evictor is an evictor that saves updates + * asynchronously in a background thread. + * + **/ + local interface BackgroundSaveEvictor extends Evictor { /** diff --git a/cpp/slice/Freeze/Transaction.ice b/cpp/slice/Freeze/Transaction.ice index 9e1f1e3f552..027c6c8a7e1 100755 --- a/cpp/slice/Freeze/Transaction.ice +++ b/cpp/slice/Freeze/Transaction.ice @@ -13,6 +13,9 @@ module Freeze { +local interface Connection; + + /** * * A transaction. If you want to use a transaction concurrently @@ -26,6 +29,8 @@ local interface Transaction * * Commit this transaction. * + * @throws DatabaseException Raised if a database failure occurred. + * **/ void commit(); @@ -33,8 +38,17 @@ local interface Transaction * * Roll back this transaction. * + * @throws DatabaseException Raised if a database failure occurred. + * **/ void rollback(); + + /** + * + * Get the connection associated with this Transaction + * + **/ + ["cpp:const"] Connection getConnection(); }; diff --git a/cpp/slice/Freeze/TransactionalEvictor.ice b/cpp/slice/Freeze/TransactionalEvictor.ice index 107c855cdee..3ac0b27539a 100644 --- a/cpp/slice/Freeze/TransactionalEvictor.ice +++ b/cpp/slice/Freeze/TransactionalEvictor.ice @@ -15,18 +15,35 @@ module Freeze { -local interface TransactionalEvictorContext -{ - void rollbackOnly(); - ["cpp:const"] bool isRollbackOnly(); - - void complete(); -}; - +local interface Transaction; + +/** + * + * A transactional evictor is an evictor that performs every single read-write + * operation within its own transaction. + * + **/ local interface TransactionalEvictor extends Evictor { - TransactionalEvictorContext getCurrentContext(); - TransactionalEvictorContext createCurrentContext(); + + /** + * + * Get the transaction associated with the calling thread. + * + * @return This transaction associated with the calling thread. + * + **/ + ["cpp:const"] Transaction getCurrentTransaction(); + + + /** + * + * Associate a transaction with the calling thread. + * + * @param tx The transaction to associate with the calling thread. + * + **/ + void setCurrentTransaction(Transaction tx); }; }; diff --git a/cpp/src/Freeze/.depend b/cpp/src/Freeze/.depend index 2805f3e9cac..5141803cb2e 100644 --- a/cpp/src/Freeze/.depend +++ b/cpp/src/Freeze/.depend @@ -15,11 +15,11 @@ Index$(OBJEXT): Index.cpp ../../include/Freeze/Index.h ../../include/Ice/Ice.h . MapI$(OBJEXT): MapI.cpp ../Freeze/MapI.h ../../include/Freeze/Map.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Freeze/DB.h ../../include/Freeze/Exception.h ../../include/Freeze/Connection.h ../../include/Freeze/Transaction.h ../Freeze/SharedDb.h ../Freeze/ConnectionI.h ../../include/Freeze/Initialize.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/Index.h ../Freeze/TransactionI.h ../Freeze/SharedDbEnv.h ../Freeze/Util.h ../../include/Freeze/Catalog.h ../../include/Freeze/CatalogData.h ObjectStore$(OBJEXT): ObjectStore.cpp ../Freeze/ObjectStore.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Freeze/DB.h ../../include/Freeze/EvictorStorage.h ../../include/Freeze/Index.h ../Freeze/TransactionI.h ../../include/Freeze/Transaction.h ../../include/IceUtil/Cache.h ../../include/IceUtil/CountDownLatch.h ../Freeze/EvictorI.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/AbstractMutex.h ../../include/IceUtil/Algorithm.h ../../include/IceUtil/ArgVector.h ../../include/IceUtil/Base64.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/MD5.h ../../include/IceUtil/Options.h ../../include/IceUtil/OutputUtil.h ../../include/IceUtil/RWRecMutex.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Random.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/UUID.h ../../include/Freeze/Freeze.h ../../include/Freeze/Initialize.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/BackgroundSaveEvictor.h ../../include/Freeze/Evictor.h ../../include/Freeze/Exception.h ../../include/Freeze/TransactionalEvictor.h ../../include/Freeze/Map.h ../../include/Freeze/Connection.h ../../include/Freeze/TransactionHolder.h ../Freeze/EvictorIteratorI.h ../Freeze/SharedDbEnv.h ../../include/IceUtil/DisableWarnings.h ../Freeze/BackgroundSaveEvictorI.h ../Freeze/Util.h ../../include/Freeze/Catalog.h ../../include/Freeze/CatalogData.h ../Freeze/IndexI.h PingObject$(OBJEXT): PingObject.cpp ../Freeze/PingObject.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/ObjectFactory.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h -SharedDbEnv$(OBJEXT): SharedDbEnv.cpp ../Freeze/SharedDbEnv.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Freeze/Exception.h ../Freeze/Util.h ../../include/Freeze/DB.h ../Freeze/SharedDb.h ../Freeze/ConnectionI.h ../../include/Freeze/Connection.h ../../include/Freeze/Transaction.h ../../include/Freeze/Initialize.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/Index.h ../Freeze/TransactionI.h ../../include/Freeze/Map.h ../Freeze/TransactionalEvictorContextI.h ../../include/Freeze/TransactionalEvictor.h ../../include/Freeze/Evictor.h ../../include/Freeze/EvictorStorage.h ../Freeze/EvictorI.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/AbstractMutex.h ../../include/IceUtil/Algorithm.h ../../include/IceUtil/ArgVector.h ../../include/IceUtil/Base64.h ../../include/IceUtil/Cache.h ../../include/IceUtil/CountDownLatch.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/MD5.h ../../include/IceUtil/Options.h ../../include/IceUtil/OutputUtil.h ../../include/IceUtil/RWRecMutex.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Random.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/UUID.h ../../include/Freeze/Freeze.h ../../include/Freeze/BackgroundSaveEvictor.h ../../include/Freeze/TransactionHolder.h ../Freeze/ObjectStore.h ../Freeze/EvictorIteratorI.h ../../include/IceUtil/DisableWarnings.h +SharedDbEnv$(OBJEXT): SharedDbEnv.cpp ../Freeze/SharedDbEnv.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Freeze/Exception.h ../Freeze/Util.h ../../include/Freeze/DB.h ../Freeze/SharedDb.h ../Freeze/ConnectionI.h ../../include/Freeze/Connection.h ../../include/Freeze/Transaction.h ../../include/Freeze/Initialize.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/Index.h ../Freeze/TransactionI.h ../../include/Freeze/Map.h ../Freeze/TransactionalEvictorContext.h ../../include/Freeze/TransactionalEvictor.h ../../include/Freeze/Evictor.h ../../include/Freeze/EvictorStorage.h ../Freeze/EvictorI.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/AbstractMutex.h ../../include/IceUtil/Algorithm.h ../../include/IceUtil/ArgVector.h ../../include/IceUtil/Base64.h ../../include/IceUtil/Cache.h ../../include/IceUtil/CountDownLatch.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/MD5.h ../../include/IceUtil/Options.h ../../include/IceUtil/OutputUtil.h ../../include/IceUtil/RWRecMutex.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Random.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/UUID.h ../../include/Freeze/Freeze.h ../../include/Freeze/BackgroundSaveEvictor.h ../../include/Freeze/TransactionHolder.h ../Freeze/ObjectStore.h ../Freeze/EvictorIteratorI.h ../../include/IceUtil/DisableWarnings.h SharedDb$(OBJEXT): SharedDb.cpp ../Freeze/SharedDb.h ../../include/IceUtil/Config.h ../Freeze/ConnectionI.h ../../include/Freeze/Connection.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Freeze/Transaction.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/CommunicatorF.h ../../include/Freeze/Initialize.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/Index.h ../../include/Freeze/DB.h ../Freeze/TransactionI.h ../Freeze/SharedDbEnv.h ../../include/Freeze/Map.h ../../include/Freeze/Exception.h ../Freeze/Util.h ../../include/Freeze/Catalog.h ../../include/Freeze/CatalogData.h TransactionalEvictor$(OBJEXT): TransactionalEvictor.cpp ../../include/Freeze/TransactionalEvictor.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Freeze/Evictor.h ../../include/Ice/ServantLocator.h ../../include/Freeze/Exception.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h -TransactionalEvictorI$(OBJEXT): TransactionalEvictorI.cpp ../Freeze/TransactionalEvictorI.h ../Freeze/EvictorI.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/Config.h ../../include/IceUtil/AbstractMutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Algorithm.h ../../include/IceUtil/ArgVector.h ../../include/IceUtil/Base64.h ../../include/IceUtil/Cache.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/CountDownLatch.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/Functional.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/MD5.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Options.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Shared.h ../../include/IceUtil/OutputUtil.h ../../include/IceUtil/RWRecMutex.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Random.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/UUID.h ../../include/IceUtil/Unicode.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Freeze/Freeze.h ../../include/Freeze/Initialize.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/Index.h ../../include/Freeze/DB.h ../../include/Freeze/Transaction.h ../../include/Freeze/BackgroundSaveEvictor.h ../../include/Freeze/Evictor.h ../../include/Freeze/Exception.h ../../include/Freeze/TransactionalEvictor.h ../../include/Freeze/Map.h ../../include/Freeze/Connection.h ../../include/Freeze/TransactionHolder.h ../Freeze/ObjectStore.h ../../include/Freeze/EvictorStorage.h ../Freeze/TransactionI.h ../Freeze/EvictorIteratorI.h ../Freeze/SharedDbEnv.h ../../include/IceUtil/DisableWarnings.h ../Freeze/Util.h ../Freeze/TransactionalEvictorContextI.h -TransactionalEvictorContextI$(OBJEXT): TransactionalEvictorContextI.cpp ../Freeze/TransactionalEvictorContextI.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Freeze/TransactionalEvictor.h ../../include/Freeze/Evictor.h ../../include/Freeze/Exception.h ../../include/Freeze/EvictorStorage.h ../Freeze/EvictorI.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/AbstractMutex.h ../../include/IceUtil/Algorithm.h ../../include/IceUtil/ArgVector.h ../../include/IceUtil/Base64.h ../../include/IceUtil/Cache.h ../../include/IceUtil/CountDownLatch.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/MD5.h ../../include/IceUtil/Options.h ../../include/IceUtil/OutputUtil.h ../../include/IceUtil/RWRecMutex.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Random.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/UUID.h ../../include/Freeze/Freeze.h ../../include/Freeze/Initialize.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/Index.h ../../include/Freeze/DB.h ../../include/Freeze/Transaction.h ../../include/Freeze/BackgroundSaveEvictor.h ../../include/Freeze/Map.h ../../include/Freeze/Connection.h ../../include/Freeze/TransactionHolder.h ../Freeze/ObjectStore.h ../Freeze/TransactionI.h ../Freeze/EvictorIteratorI.h ../Freeze/SharedDbEnv.h ../../include/IceUtil/DisableWarnings.h ../Freeze/TransactionalEvictorI.h ../Freeze/Util.h ../Freeze/ConnectionI.h +TransactionalEvictorI$(OBJEXT): TransactionalEvictorI.cpp ../Freeze/TransactionalEvictorI.h ../Freeze/EvictorI.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/Config.h ../../include/IceUtil/AbstractMutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Algorithm.h ../../include/IceUtil/ArgVector.h ../../include/IceUtil/Base64.h ../../include/IceUtil/Cache.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/CountDownLatch.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/Functional.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/MD5.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Options.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Shared.h ../../include/IceUtil/OutputUtil.h ../../include/IceUtil/RWRecMutex.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Random.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/UUID.h ../../include/IceUtil/Unicode.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Freeze/Freeze.h ../../include/Freeze/Initialize.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/Index.h ../../include/Freeze/DB.h ../../include/Freeze/Transaction.h ../../include/Freeze/BackgroundSaveEvictor.h ../../include/Freeze/Evictor.h ../../include/Freeze/Exception.h ../../include/Freeze/TransactionalEvictor.h ../../include/Freeze/Map.h ../../include/Freeze/Connection.h ../../include/Freeze/TransactionHolder.h ../Freeze/ObjectStore.h ../../include/Freeze/EvictorStorage.h ../Freeze/TransactionI.h ../Freeze/EvictorIteratorI.h ../Freeze/SharedDbEnv.h ../../include/IceUtil/DisableWarnings.h ../Freeze/Util.h ../Freeze/TransactionalEvictorContext.h +TransactionalEvictorContext$(OBJEXT): TransactionalEvictorContext.cpp ../Freeze/TransactionalEvictorContext.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Freeze/TransactionalEvictor.h ../../include/Freeze/Evictor.h ../../include/Freeze/Exception.h ../../include/Freeze/EvictorStorage.h ../Freeze/EvictorI.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/AbstractMutex.h ../../include/IceUtil/Algorithm.h ../../include/IceUtil/ArgVector.h ../../include/IceUtil/Base64.h ../../include/IceUtil/Cache.h ../../include/IceUtil/CountDownLatch.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/MD5.h ../../include/IceUtil/Options.h ../../include/IceUtil/OutputUtil.h ../../include/IceUtil/RWRecMutex.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Random.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/UUID.h ../../include/Freeze/Freeze.h ../../include/Freeze/Initialize.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/Index.h ../../include/Freeze/DB.h ../../include/Freeze/Transaction.h ../../include/Freeze/BackgroundSaveEvictor.h ../../include/Freeze/Map.h ../../include/Freeze/Connection.h ../../include/Freeze/TransactionHolder.h ../Freeze/ObjectStore.h ../Freeze/TransactionI.h ../Freeze/EvictorIteratorI.h ../Freeze/SharedDbEnv.h ../../include/IceUtil/DisableWarnings.h ../Freeze/TransactionalEvictorI.h ../Freeze/Util.h ../Freeze/ConnectionI.h TransactionHolder$(OBJEXT): TransactionHolder.cpp ../../include/Freeze/TransactionHolder.h ../../include/Freeze/Connection.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Freeze/Transaction.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/CommunicatorF.h TransactionI$(OBJEXT): TransactionI.cpp ../Freeze/TransactionI.h ../../include/Freeze/Transaction.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../Freeze/ConnectionI.h ../../include/Freeze/Connection.h ../../include/Ice/CommunicatorF.h ../../include/Freeze/Initialize.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/Index.h ../../include/Freeze/DB.h ../Freeze/SharedDbEnv.h ../../include/Freeze/Exception.h Transaction$(OBJEXT): Transaction.cpp ../../include/Freeze/Transaction.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h diff --git a/cpp/src/Freeze/BackgroundSaveEvictorI.cpp b/cpp/src/Freeze/BackgroundSaveEvictorI.cpp index dd228d80cd7..b047ae4ed47 100644 --- a/cpp/src/Freeze/BackgroundSaveEvictorI.cpp +++ b/cpp/src/Freeze/BackgroundSaveEvictorI.cpp @@ -1229,7 +1229,7 @@ Freeze::BackgroundSaveEvictorI::run() } } -DbTxn* +Freeze::TransactionIPtr Freeze::BackgroundSaveEvictorI::beforeQuery() { saveNow(); diff --git a/cpp/src/Freeze/BackgroundSaveEvictorI.h b/cpp/src/Freeze/BackgroundSaveEvictorI.h index 83498be90c7..72fb895dd43 100644 --- a/cpp/src/Freeze/BackgroundSaveEvictorI.h +++ b/cpp/src/Freeze/BackgroundSaveEvictorI.h @@ -151,7 +151,7 @@ public: virtual ~BackgroundSaveEvictorI(); - virtual DbTxn* beforeQuery(); + virtual TransactionIPtr beforeQuery(); // // Thread diff --git a/cpp/src/Freeze/EvictorI.cpp b/cpp/src/Freeze/EvictorI.cpp index d050d2f2c74..dd2560ddfb2 100644 --- a/cpp/src/Freeze/EvictorI.cpp +++ b/cpp/src/Freeze/EvictorI.cpp @@ -33,15 +33,15 @@ string Freeze::EvictorIBase::indexPrefix = "$index:"; // DeactivateController // -Freeze::DeactivateController::Guard::Guard(DeactivateController& controller) : - _controller(controller) +Freeze::DeactivateController::Guard::Guard(const DeactivateController& controller) : + _controller(const_cast<DeactivateController&>(controller)) { Lock sync(controller); if(controller._deactivated || _controller._deactivating) { throw EvictorDeactivatedException(__FILE__, __LINE__); } - controller._guardCount++; + _controller._guardCount++; } Freeze::DeactivateController::Guard::~Guard() diff --git a/cpp/src/Freeze/EvictorI.h b/cpp/src/Freeze/EvictorI.h index c27b51af34d..6cc8c9320f8 100644 --- a/cpp/src/Freeze/EvictorI.h +++ b/cpp/src/Freeze/EvictorI.h @@ -44,7 +44,7 @@ public: class Guard { public: - Guard(DeactivateController&); + Guard(const DeactivateController&); ~Guard(); private: @@ -81,7 +81,7 @@ class EvictorIBase : public virtual Evictor, public IceUtil::Monitor<IceUtil::Mu { public: - virtual DbTxn* beforeQuery() = 0; + virtual TransactionIPtr beforeQuery() = 0; virtual void setSize(Ice::Int); virtual Ice::Int getSize(); @@ -165,7 +165,7 @@ public: { DeactivateController::Guard deactivateGuard(_deactivateController); - DbTxn* tx = beforeQuery(); + TransactionIPtr tx = beforeQuery(); return new EvictorIteratorI(findStore(facet, false), tx, batchSize); } diff --git a/cpp/src/Freeze/EvictorIteratorI.cpp b/cpp/src/Freeze/EvictorIteratorI.cpp index 10e459a788c..401b17750fd 100644 --- a/cpp/src/Freeze/EvictorIteratorI.cpp +++ b/cpp/src/Freeze/EvictorIteratorI.cpp @@ -17,13 +17,13 @@ using namespace Freeze; using namespace Ice; -Freeze::EvictorIteratorI::EvictorIteratorI(ObjectStoreBase* store, DbTxn* tx, Int batchSize) : +Freeze::EvictorIteratorI::EvictorIteratorI(ObjectStoreBase* store, const TransactionIPtr& tx, Int batchSize) : _store(store), _batchSize(static_cast<size_t>(batchSize)), _key(1024), _more(store != 0), _initialized(false), - _tx(tx) + _tx(tx == 0 ? 0 : tx->dbTxn()) { _batchIterator = _batch.end(); } diff --git a/cpp/src/Freeze/EvictorIteratorI.h b/cpp/src/Freeze/EvictorIteratorI.h index b69b5dc3d8f..41fed5db623 100644 --- a/cpp/src/Freeze/EvictorIteratorI.h +++ b/cpp/src/Freeze/EvictorIteratorI.h @@ -17,13 +17,17 @@ namespace Freeze { +class TransactionI; +typedef IceUtil::Handle<TransactionI> TransactionIPtr; + + class ObjectStoreBase; class EvictorIteratorI : public EvictorIterator { public: - EvictorIteratorI(ObjectStoreBase*, DbTxn*, Ice::Int); + EvictorIteratorI(ObjectStoreBase*, const TransactionIPtr&, Ice::Int); virtual bool hasNext(); virtual Ice::Identity next(); diff --git a/cpp/src/Freeze/IndexI.cpp b/cpp/src/Freeze/IndexI.cpp index 5679e93fa02..11ea57a6db4 100644 --- a/cpp/src/Freeze/IndexI.cpp +++ b/cpp/src/Freeze/IndexI.cpp @@ -57,8 +57,9 @@ Freeze::IndexI::untypedFindFirst(const Key& bytes, Int firstN) const Ice::CommunicatorPtr communicator = _store->communicator(); - DbTxn* tx = _store->evictor()->beforeQuery(); - + TransactionIPtr transaction = _store->evictor()->beforeQuery(); + DbTxn* tx = transaction == 0 ? 0 : transaction->dbTxn(); + vector<Identity> identities; try @@ -203,12 +204,13 @@ Freeze::IndexI::untypedCount(const Key& bytes) const // (ref Oracle SR 5925672.992) // dbKey.set_flags(DB_DBT_USERMEM | DB_DBT_PARTIAL); - Dbt dbValue; dbValue.set_flags(DB_DBT_USERMEM | DB_DBT_PARTIAL); - DbTxn* tx = _store->evictor()->beforeQuery(); + TransactionIPtr transaction = _store->evictor()->beforeQuery(); + DbTxn* tx = transaction == 0 ? 0 : transaction->dbTxn(); + Int result = 0; try diff --git a/cpp/src/Freeze/Makefile b/cpp/src/Freeze/Makefile index 5383d96591d..5034fd1d397 100644 --- a/cpp/src/Freeze/Makefile +++ b/cpp/src/Freeze/Makefile @@ -37,7 +37,7 @@ OBJS = BackgroundSaveEvictor.o \ SharedDb.o \ TransactionalEvictor.o \ TransactionalEvictorI.o \ - TransactionalEvictorContextI.o \ + TransactionalEvictorContext.o \ TransactionHolder.o \ TransactionI.o \ Transaction.o \ diff --git a/cpp/src/Freeze/Makefile.mak b/cpp/src/Freeze/Makefile.mak index 4b0b90fb1b6..2789c26b911 100644 --- a/cpp/src/Freeze/Makefile.mak +++ b/cpp/src/Freeze/Makefile.mak @@ -37,7 +37,7 @@ OBJS = BackgroundSaveEvictor.obj \ SharedDb.obj \ TransactionalEvictor.obj \ TransactionalEvictorI.obj \ - TransactionalEvictorContextI.obj \ + TransactionalEvictorContext.obj \ TransactionHolder.obj \ TransactionI.obj \ Transaction.obj \ diff --git a/cpp/src/Freeze/ObjectStore.cpp b/cpp/src/Freeze/ObjectStore.cpp index 77556081f22..f472cba7614 100644 --- a/cpp/src/Freeze/ObjectStore.cpp +++ b/cpp/src/Freeze/ObjectStore.cpp @@ -160,8 +160,18 @@ Freeze::ObjectStoreBase::~ObjectStoreBase() } bool -Freeze::ObjectStoreBase::dbHasObject(const Identity& ident, DbTxn* tx) const +Freeze::ObjectStoreBase::dbHasObject(const Identity& ident, const TransactionIPtr& transaction) const { + DbTxn* tx = 0; + if(transaction != 0) + { + tx = transaction->dbTxn(); + if(tx == 0) + { + throw DatabaseException(__FILE__, __LINE__, "inactive transaction"); + } + } + Key key; marshal(ident, key, _communicator); Dbt dbKey; @@ -305,13 +315,18 @@ Freeze::ObjectStoreBase::unmarshal(ObjectRecord& v, const Value& bytes, const Co } bool -Freeze::ObjectStoreBase::load(const Identity& ident, const TransactionIPtr& tx, ObjectRecord& rec) +Freeze::ObjectStoreBase::load(const Identity& ident, const TransactionIPtr& transaction, ObjectRecord& rec) { - DbTxn* txn = tx->dbTxn(); + if(transaction == 0) + { + throw DatabaseException(__FILE__, __LINE__, "no active transaction"); + } + + DbTxn* txn = transaction->dbTxn(); if(txn == 0) { - throw DatabaseException(__FILE__, __LINE__, "invalid TransactionalEvictorContext"); + throw DatabaseException(__FILE__, __LINE__, "inactive transaction"); } Key key; @@ -364,13 +379,18 @@ Freeze::ObjectStoreBase::load(const Identity& ident, const TransactionIPtr& tx, } void -Freeze::ObjectStoreBase::update(const Identity& ident, const ObjectRecord& rec, const TransactionIPtr& tx) +Freeze::ObjectStoreBase::update(const Identity& ident, const ObjectRecord& rec, const TransactionIPtr& transaction) { - DbTxn* txn = tx->dbTxn(); + if(transaction == 0) + { + throw DatabaseException(__FILE__, __LINE__, "no active transaction"); + } + + DbTxn* txn = transaction->dbTxn(); if(txn == 0) { - throw DatabaseException(__FILE__, __LINE__, "invalid TransactionalEvictorContext"); + throw DatabaseException(__FILE__, __LINE__, "inactive transaction"); } Key key; @@ -406,8 +426,18 @@ Freeze::ObjectStoreBase::update(const Identity& ident, const ObjectRecord& rec, } bool -Freeze::ObjectStoreBase::insert(const Identity& ident, const ObjectRecord& rec, DbTxn* tx) +Freeze::ObjectStoreBase::insert(const Identity& ident, const ObjectRecord& rec, const TransactionIPtr& transaction) { + DbTxn* tx = 0; + if(transaction != 0) + { + tx = transaction->dbTxn(); + if(tx == 0) + { + throw DatabaseException(__FILE__, __LINE__, "inactive transaction"); + } + } + Key key; marshal(ident, key, _communicator); @@ -454,8 +484,18 @@ Freeze::ObjectStoreBase::insert(const Identity& ident, const ObjectRecord& rec, } bool -Freeze::ObjectStoreBase::remove(const Identity& ident, DbTxn* tx) +Freeze::ObjectStoreBase::remove(const Identity& ident, const TransactionIPtr& transaction) { + DbTxn* tx = 0; + if(transaction != 0) + { + tx = transaction->dbTxn(); + if(tx == 0) + { + throw DatabaseException(__FILE__, __LINE__, "inactive transaction"); + } + } + Key key; marshal(ident, key, _communicator); diff --git a/cpp/src/Freeze/ObjectStore.h b/cpp/src/Freeze/ObjectStore.h index 23a5ab8f734..72c1e4b068c 100644 --- a/cpp/src/Freeze/ObjectStore.h +++ b/cpp/src/Freeze/ObjectStore.h @@ -40,7 +40,7 @@ public: const Ice::ObjectPtr& sampleServant() const; - bool dbHasObject(const Ice::Identity&, DbTxn*) const; + bool dbHasObject(const Ice::Identity&, const TransactionIPtr&) const; void save(Key& key, Value& value, Ice::Byte status, DbTxn* tx); static void marshal(const Ice::Identity&, Key&, const Ice::CommunicatorPtr&); @@ -51,8 +51,8 @@ public: bool load(const Ice::Identity&, const TransactionIPtr&, ObjectRecord&); void update(const Ice::Identity&, const ObjectRecord&, const TransactionIPtr&); - bool insert(const Ice::Identity&, const ObjectRecord&, DbTxn*); - bool remove(const Ice::Identity&, DbTxn*); + bool insert(const Ice::Identity&, const ObjectRecord&, const TransactionIPtr&); + bool remove(const Ice::Identity&, const TransactionIPtr&); EvictorIBase* evictor() const; diff --git a/cpp/src/Freeze/SharedDbEnv.cpp b/cpp/src/Freeze/SharedDbEnv.cpp index ecf6bc09d04..de30521dfbe 100644 --- a/cpp/src/Freeze/SharedDbEnv.cpp +++ b/cpp/src/Freeze/SharedDbEnv.cpp @@ -11,7 +11,7 @@ #include <Freeze/Exception.h> #include <Freeze/Util.h> #include <Freeze/SharedDb.h> -#include <Freeze/TransactionalEvictorContextI.h> +#include <Freeze/TransactionalEvictorContext.h> #include <IceUtil/IceUtil.h> @@ -218,38 +218,33 @@ void Freeze::SharedDbEnv::__decRef() } -Freeze::TransactionalEvictorContextIPtr -Freeze::SharedDbEnv::getOrCreateCurrent(bool& created) -{ - created = false; - - Freeze::TransactionalEvictorContextIPtr ctx = getCurrent(); - if(ctx == 0) - { - ctx = new TransactionalEvictorContextI(this); +Freeze::TransactionalEvictorContextPtr +Freeze::SharedDbEnv::createCurrent() +{ + assert(getCurrent() == 0); + + Freeze::TransactionalEvictorContextPtr ctx = new TransactionalEvictorContext(this); #ifdef _WIN32 - if(TlsSetValue(_tsdKey, ctx.get()) == 0) - { - IceUtil::ThreadSyscallException(__FILE__, __LINE__, GetLastError()); - } + if(TlsSetValue(_tsdKey, ctx.get()) == 0) + { + IceUtil::ThreadSyscallException(__FILE__, __LINE__, GetLastError()); + } #else - if(int err = pthread_setspecific(_tsdKey, ctx.get())) - { - throw IceUtil::ThreadSyscallException(__FILE__, __LINE__, err); - } -#endif - created = true; - - // - // Give one refcount to this thread! - // - ctx->__incRef(); + if(int err = pthread_setspecific(_tsdKey, ctx.get())) + { + throw IceUtil::ThreadSyscallException(__FILE__, __LINE__, err); } +#endif + + // + // Give one refcount to this thread! + // + ctx->__incRef(); return ctx; } -Freeze::TransactionalEvictorContextIPtr +Freeze::TransactionalEvictorContextPtr Freeze::SharedDbEnv::getCurrent() { #ifdef _WIN32 @@ -260,7 +255,7 @@ Freeze::SharedDbEnv::getCurrent() if(val != 0) { - return static_cast<Freeze::TransactionalEvictorContextI*>(val); + return static_cast<TransactionalEvictorContext*>(val); } else { @@ -269,9 +264,42 @@ Freeze::SharedDbEnv::getCurrent() } void -Freeze::SharedDbEnv::clearCurrent(const Freeze::TransactionalEvictorContextIPtr& oldCtx) +Freeze::SharedDbEnv::setCurrentTransaction(const Freeze::TransactionPtr& tx) { - if(getCurrent() == oldCtx) + Freeze::TransactionalEvictorContextPtr ctx = getCurrent(); + + if(ctx != 0) + { + // + // Release thread's refcount + // + ctx->__decRef(); + } + + if(tx != 0) + { + if(ctx == 0 || ctx->transaction().get() != tx.get()) + { + ctx = new TransactionalEvictorContext(TransactionIPtr::dynamicCast(tx)); + +#ifdef _WIN32 + if(TlsSetValue(_tsdKey, ctx.get()) == 0) + { + IceUtil::ThreadSyscallException(__FILE__, __LINE__, GetLastError()); + } +#else + if(int err = pthread_setspecific(_tsdKey, ctx.get())) + { + throw IceUtil::ThreadSyscallException(__FILE__, __LINE__, err); + } +#endif + // + // Give one refcount to this thread + // + ctx->__incRef(); + } + } + else if(ctx != 0) { #ifdef _WIN32 if(TlsSetValue(_tsdKey, 0) == 0) @@ -284,11 +312,6 @@ Freeze::SharedDbEnv::clearCurrent(const Freeze::TransactionalEvictorContextIPtr& throw IceUtil::ThreadSyscallException(__FILE__, __LINE__, err); } #endif - - // - // Release thread's refcount - // - oldCtx->__decRef(); } } diff --git a/cpp/src/Freeze/SharedDbEnv.h b/cpp/src/Freeze/SharedDbEnv.h index 20ea19191c7..072d03e5d86 100644 --- a/cpp/src/Freeze/SharedDbEnv.h +++ b/cpp/src/Freeze/SharedDbEnv.h @@ -27,8 +27,11 @@ typedef IceUtil::Handle<SharedDbEnv> SharedDbEnvPtr; class SharedDb; typedef IceUtil::Handle<SharedDb> SharedDbPtr; -class TransactionalEvictorContextI; -typedef IceUtil::Handle<TransactionalEvictorContextI> TransactionalEvictorContextIPtr; +class Transaction; +typedef IceInternal::Handle<Transaction> TransactionPtr; + +class TransactionalEvictorContext; +typedef IceUtil::Handle<TransactionalEvictorContext> TransactionalEvictorContextPtr; class SharedDbEnv { @@ -44,10 +47,10 @@ public: // // EvictorContext factory/manager // - TransactionalEvictorContextIPtr getOrCreateCurrent(bool&); - TransactionalEvictorContextIPtr getCurrent(); - void clearCurrent(const TransactionalEvictorContextIPtr&); - + TransactionalEvictorContextPtr createCurrent(); + TransactionalEvictorContextPtr getCurrent(); + void setCurrentTransaction(const TransactionPtr& tx); + DbEnv* getEnv() const; const std::string& getEnvName() const; const Ice::CommunicatorPtr& getCommunicator() const; diff --git a/cpp/src/Freeze/TransactionI.cpp b/cpp/src/Freeze/TransactionI.cpp index c9920c7bfc0..94c56dc134b 100644 --- a/cpp/src/Freeze/TransactionI.cpp +++ b/cpp/src/Freeze/TransactionI.cpp @@ -25,9 +25,13 @@ Freeze::getTxn(const Freeze::TransactionPtr& tx) void Freeze::TransactionI::commit() { - assert(_txn != 0); - + if(_txn == 0) + { + throw DatabaseException(__FILE__, __LINE__, "inactive transaction"); + } + long txnId = 0; + try { _connection->closeAllIterators(); @@ -41,19 +45,20 @@ Freeze::TransactionI::commit() if(_txTrace >= 1) { - Trace out(_connection->communicator()->getLogger(), "Freeze.Map"); + Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction"); out << "committed transaction " << hex << txnId << dec; } } catch(const ::DbDeadlockException& dx) { + if(_txTrace >= 1) { - Trace out(_connection->communicator()->getLogger(), "Freeze.Map"); + Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction"); out << "failed to commit transaction " << hex << txnId << dec << ": " << dx.what(); } - cleanup(); + postCompletion(false, true); DeadlockException ex(__FILE__, __LINE__); ex.message = dx.what(); throw ex; @@ -62,16 +67,16 @@ Freeze::TransactionI::commit() { if(_txTrace >= 1) { - Trace out(_connection->communicator()->getLogger(), "Freeze.Map"); + Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction"); out << "failed to commit transaction " << hex << txnId << dec << ": " << dx.what(); } - cleanup(); + postCompletion(false, false); DatabaseException ex(__FILE__, __LINE__); ex.message = dx.what(); throw ex; } - cleanup(); + postCompletion(true, false); } void @@ -93,7 +98,7 @@ Freeze::TransactionI::rollback() if(_txTrace >= 1) { - Trace out(_connection->communicator()->getLogger(), "Freeze.Map"); + Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction"); out << "rolled back transaction " << hex << txnId << dec; } } @@ -101,30 +106,39 @@ Freeze::TransactionI::rollback() { if(_txTrace >= 1) { - Trace out(_connection->communicator()->getLogger(), "Freeze.Map"); + Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction"); out << "failed to rollback transaction " << hex << txnId << dec << ": " << dx.what(); } - cleanup(); - DeadlockException ex(__FILE__, __LINE__); - ex.message = dx.what(); - throw ex; + postCompletion(false, true); + throw DeadlockException(__FILE__, __LINE__, dx.what()); } catch(const ::DbException& dx) { if(_txTrace >= 1) { - Trace out(_connection->communicator()->getLogger(), "Freeze.Map"); + Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction"); out << "failed to rollback transaction " << hex << txnId << dec << ": " << dx.what(); } - cleanup(); - DatabaseException ex(__FILE__, __LINE__); - ex.message = dx.what(); - throw ex; + postCompletion(false, false); + throw DatabaseException(__FILE__, __LINE__, dx.what()); } - cleanup(); + postCompletion(true, false); +} + +Freeze::ConnectionPtr +Freeze::TransactionI::getConnection() const +{ + return _connection; } + +void +Freeze::TransactionI::setPostCompletionCallback(const Freeze::PostCompletionCallbackPtr& cb) +{ + _postCompletionCallback = cb; +} + Freeze::TransactionI::TransactionI(ConnectionI* connection) : _connection(connection), @@ -138,7 +152,7 @@ Freeze::TransactionI::TransactionI(ConnectionI* connection) : if(_txTrace >= 1) { long txnId = (_txn->id() & 0x7FFFFFFF) + 0x80000000L; - Trace out(_connection->communicator()->getLogger(), "Freeze.Map"); + Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction"); out << "started transaction " << hex << txnId << dec; } } @@ -146,7 +160,7 @@ Freeze::TransactionI::TransactionI(ConnectionI* connection) : { if(_txTrace >= 1) { - Trace out(_connection->communicator()->getLogger(), "Freeze.Map"); + Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction"); out << "failed to start transaction: " << dx.what(); } @@ -165,9 +179,14 @@ Freeze::TransactionI::~TransactionI() } void -Freeze::TransactionI::cleanup() +Freeze::TransactionI::postCompletion(bool committed, bool deadlock) { _connection->clearTransaction(); _connection = 0; _txn = 0; + + if(_postCompletionCallback != 0) + { + _postCompletionCallback->postCompletion(committed, deadlock); + } } diff --git a/cpp/src/Freeze/TransactionI.h b/cpp/src/Freeze/TransactionI.h index 04c44dc68c3..7a7922d1297 100644 --- a/cpp/src/Freeze/TransactionI.h +++ b/cpp/src/Freeze/TransactionI.h @@ -19,16 +19,27 @@ namespace Freeze class ConnectionI; typedef IceUtil::Handle<ConnectionI> ConnectionIPtr; +class PostCompletionCallback : public virtual IceUtil::Shared +{ +public: + + virtual void postCompletion(bool, bool) = 0; +}; +typedef IceUtil::Handle<PostCompletionCallback> PostCompletionCallbackPtr; + + class TransactionI : public Transaction { public: - virtual void - commit(); + virtual void commit(); - virtual void - rollback(); + virtual void rollback(); + + virtual ConnectionPtr getConnection() const; + void setPostCompletionCallback(const PostCompletionCallbackPtr&); + TransactionI(ConnectionI*); ~TransactionI(); @@ -38,14 +49,20 @@ public: return _txn; } + const ConnectionIPtr& + getConnectionI() const + { + return _connection; + } + private: - void - cleanup(); + void postCompletion(bool, bool); ConnectionIPtr _connection; Ice::Int _txTrace; DbTxn* _txn; + PostCompletionCallbackPtr _postCompletionCallback; }; typedef IceUtil::Handle<TransactionI> TransactionIPtr; diff --git a/cpp/src/Freeze/TransactionalEvictorContextI.cpp b/cpp/src/Freeze/TransactionalEvictorContext.cpp index 891f6cb7630..4c40321a8a1 100644 --- a/cpp/src/Freeze/TransactionalEvictorContextI.cpp +++ b/cpp/src/Freeze/TransactionalEvictorContext.cpp @@ -7,7 +7,7 @@ // // ********************************************************************** -#include <Freeze/TransactionalEvictorContextI.h> +#include <Freeze/TransactionalEvictorContext.h> #include <Freeze/TransactionalEvictorI.h> #include <Freeze/Initialize.h> #include <Freeze/Util.h> @@ -20,75 +20,69 @@ using namespace Freeze; using namespace Ice; -Freeze::TransactionalEvictorContextI::TransactionalEvictorContextI(const SharedDbEnvPtr& dbEnv) : +Freeze::TransactionalEvictorContext::TransactionalEvictorContext(const SharedDbEnvPtr& dbEnv) : _tx((new ConnectionI(dbEnv))->beginTransactionI()), - _rollbackOnly(false), - _dbEnv(dbEnv), _deadlockExceptionDetected(false) -{ +{ + _tx->setPostCompletionCallback(this); } -Freeze::TransactionalEvictorContextI::~TransactionalEvictorContextI() +Freeze::TransactionalEvictorContext::TransactionalEvictorContext(const TransactionIPtr& tx) : + _tx(tx), + _deadlockExceptionDetected(false) +{ + _tx->setPostCompletionCallback(this); +} + + +Freeze::TransactionalEvictorContext::~TransactionalEvictorContext() { for_each(_invalidateList.begin(), _invalidateList.end(), ToInvalidate::destroy); } -void -Freeze::TransactionalEvictorContextI::rollbackOnly() +void +Freeze::TransactionalEvictorContext::commit() { - _rollbackOnly = true; + if(_tx != 0) + { + _tx->commit(); + } } -bool -Freeze::TransactionalEvictorContextI::isRollbackOnly() const +void +Freeze::TransactionalEvictorContext::rollback() { - return _rollbackOnly; + if(_tx != 0) + { + _tx->rollback(); + } } + void -Freeze::TransactionalEvictorContextI::complete() +Freeze::TransactionalEvictorContext::postCompletion(bool committed, bool deadlock) { try { - if(_rollbackOnly) + if(committed) { - _tx->rollback(); - } - else - { - if(!_stack.empty()) - { - Warning out(_dbEnv->getCommunicator()->getLogger()); - out << "Committing TransactionalEvictorContext on DbEnv '" << - _dbEnv->getEnvName() << "' with " << _stack.size() << " unsaved objects."; - } - - _tx->commit(); - // - // Finally, remove updated & removed objects from cache + // remove updated & removed objects from cache // - for_each(_invalidateList.begin(), _invalidateList.end(), ToInvalidate::invalidate); _invalidateList.clear(); - } - } - catch(const DeadlockException&) - { - deadlockException(); - finalize(); - throw; + } + finalize(deadlock); } catch(...) { - finalize(); + finalize(deadlock); throw; } - finalize(); } -Freeze::TransactionalEvictorContextI::ServantHolder* -Freeze::TransactionalEvictorContextI::findServantHolder(const Identity& ident, ObjectStore<TransactionalEvictorElement>* store) const +Freeze::TransactionalEvictorContext::ServantHolder* +Freeze::TransactionalEvictorContext::findServantHolder(const Identity& ident, ObjectStore<TransactionalEvictorElement>* store) const { for(Stack::const_iterator p = _stack.begin(); p != _stack.end(); ++p) { @@ -102,20 +96,22 @@ Freeze::TransactionalEvictorContextI::findServantHolder(const Identity& ident, O } void -Freeze::TransactionalEvictorContextI::finalize() +Freeze::TransactionalEvictorContext::finalize(bool deadlock) { - if(_dbEnv != 0) + Lock sync(*this); + if(_tx != 0) { - _dbEnv->clearCurrent(this); - - Lock sync(*this); - _dbEnv = 0; + if(deadlock) + { + _deadlockExceptionDetected = true; + } + _tx = 0; notifyAll(); } } void -Freeze::TransactionalEvictorContextI::checkDeadlockException() +Freeze::TransactionalEvictorContext::checkDeadlockException() { if(_deadlockException.get() != 0) { @@ -124,7 +120,7 @@ Freeze::TransactionalEvictorContextI::checkDeadlockException() } bool -Freeze::TransactionalEvictorContextI::response(bool) +Freeze::TransactionalEvictorContext::response(bool) { if(_owner == IceUtil::ThreadControl()) { @@ -133,7 +129,7 @@ Freeze::TransactionalEvictorContextI::response(bool) else { Lock sync(*this); - while(_deadlockExceptionDetected == false && _dbEnv != 0) + while(_deadlockExceptionDetected == false && _tx != 0) { wait(); } @@ -142,7 +138,7 @@ Freeze::TransactionalEvictorContextI::response(bool) } bool -Freeze::TransactionalEvictorContextI::exception(const std::exception& ex) +Freeze::TransactionalEvictorContext::exception(const std::exception& ex) { const DeadlockException* dx = dynamic_cast<const DeadlockException*>(&ex); @@ -155,16 +151,16 @@ Freeze::TransactionalEvictorContextI::exception(const std::exception& ex) } bool -Freeze::TransactionalEvictorContextI::exception() +Freeze::TransactionalEvictorContext::exception() { return true; } Ice::ObjectPtr -Freeze::TransactionalEvictorContextI::servantRemoved(const Identity& ident, +Freeze::TransactionalEvictorContext::servantRemoved(const Identity& ident, ObjectStore<TransactionalEvictorElement>* store) { - if(!_rollbackOnly) + if(_tx != 0) { // // Lookup servant holder on stack @@ -186,13 +182,14 @@ Freeze::TransactionalEvictorContextI::servantRemoved(const Identity& ident, } void -Freeze::TransactionalEvictorContextI::deadlockException() +Freeze::TransactionalEvictorContext::deadlockException() { - _rollbackOnly = true; - - Lock sync(*this); - _deadlockExceptionDetected = true; - notifyAll(); + { + Lock sync(*this); + _deadlockExceptionDetected = true; + notifyAll(); + } + rollback(); } @@ -200,7 +197,7 @@ Freeze::TransactionalEvictorContextI::deadlockException() // ServantHolder // -Freeze::TransactionalEvictorContextI::ServantHolder::ServantHolder(const TransactionalEvictorContextIPtr& ctx, +Freeze::TransactionalEvictorContext::ServantHolder::ServantHolder(const TransactionalEvictorContextPtr& ctx, const Current& current, ObjectStore<TransactionalEvictorElement>* store, bool useNonmutating) : @@ -240,11 +237,11 @@ Freeze::TransactionalEvictorContextI::ServantHolder::ServantHolder(const Transac } -Freeze::TransactionalEvictorContextI::ServantHolder::~ServantHolder() +Freeze::TransactionalEvictorContext::ServantHolder::~ServantHolder() { if(_ownServant) { - if(!_ctx->isRollbackOnly()) + if(_ctx->_tx != 0) { if(!_readOnly && !_removed) { @@ -262,7 +259,7 @@ Freeze::TransactionalEvictorContextI::ServantHolder::~ServantHolder() } void -Freeze::TransactionalEvictorContextI::ServantHolder::removed() +Freeze::TransactionalEvictorContext::ServantHolder::removed() { _removed = true; } @@ -275,8 +272,8 @@ Freeze::TransactionalEvictorContextI::ServantHolder::removed() // When constructed in the servant holder destructor, it's protected by the dispatch() // deactivate controller guard // -Freeze::TransactionalEvictorContextI::ToInvalidate::ToInvalidate(const Identity& ident, - ObjectStore<TransactionalEvictorElement>* store) : +Freeze::TransactionalEvictorContext::ToInvalidate::ToInvalidate(const Identity& ident, + ObjectStore<TransactionalEvictorElement>* store) : _ident(ident), _store(store), _evictor(store->evictor()), @@ -285,14 +282,14 @@ Freeze::TransactionalEvictorContextI::ToInvalidate::ToInvalidate(const Identity& } void -Freeze::TransactionalEvictorContextI::ToInvalidate::invalidate(ToInvalidate* obj) +Freeze::TransactionalEvictorContext::ToInvalidate::invalidate(ToInvalidate* obj) { dynamic_cast<TransactionalEvictorI*>(obj->_store->evictor())->evict(obj->_ident, obj->_store); delete obj; } void -Freeze::TransactionalEvictorContextI::ToInvalidate::destroy(ToInvalidate* obj) +Freeze::TransactionalEvictorContext::ToInvalidate::destroy(ToInvalidate* obj) { delete obj; } diff --git a/cpp/src/Freeze/TransactionalEvictorContextI.h b/cpp/src/Freeze/TransactionalEvictorContext.h index 3686c21ffac..96c29c58fc4 100644 --- a/cpp/src/Freeze/TransactionalEvictorContextI.h +++ b/cpp/src/Freeze/TransactionalEvictorContext.h @@ -7,8 +7,8 @@ // // ********************************************************************** -#ifndef FREEZE_TRANSACTIONAL_EVICTOR_CONTEXT_I_H -#define FREEZE_TRANSACTIONAL_EVICTOR_CONTEXT_I_H +#ifndef FREEZE_TRANSACTIONAL_EVICTOR_CONTEXT_H +#define FREEZE_TRANSACTIONAL_EVICTOR_CONTEXT_H #include <Ice/Ice.h> #include <Freeze/TransactionalEvictor.h> @@ -23,8 +23,8 @@ template<class T> class ObjectStore; class TransactionalEvictorElement; -class TransactionalEvictorContextI : public TransactionalEvictorContext, public Ice::DispatchInterceptorAsyncCallback, - public IceUtil::Monitor<IceUtil::Mutex> +class TransactionalEvictorContext : public Ice::DispatchInterceptorAsyncCallback, public PostCompletionCallback, + public IceUtil::Monitor<IceUtil::Mutex> { public: @@ -32,7 +32,7 @@ public: { public: - ServantHolder(const TransactionalEvictorContextIPtr&, const Ice::Current&, ObjectStore<TransactionalEvictorElement>*, bool); + ServantHolder(const TransactionalEvictorContextPtr&, const Ice::Current&, ObjectStore<TransactionalEvictorElement>*, bool); ~ServantHolder(); void removed(); @@ -53,7 +53,7 @@ public: bool _ownServant; bool _removed; - const TransactionalEvictorContextIPtr& _ctx; + const TransactionalEvictorContextPtr& _ctx; const Ice::Current& _current; ObjectStore<TransactionalEvictorElement>* _store; ObjectRecord _rec; @@ -78,12 +78,12 @@ public: }; - TransactionalEvictorContextI(const SharedDbEnvPtr&); - virtual ~TransactionalEvictorContextI(); - - virtual void rollbackOnly(); - virtual bool isRollbackOnly() const; - virtual void complete(); + TransactionalEvictorContext(const SharedDbEnvPtr&); + TransactionalEvictorContext(const TransactionIPtr&); + + virtual ~TransactionalEvictorContext(); + + virtual void postCompletion(bool, bool); virtual bool response(bool); virtual bool exception(const std::exception&); @@ -95,6 +95,9 @@ public: void checkDeadlockException(); + void commit(); + void rollback(); + const TransactionIPtr& transaction() const { return _tx; @@ -106,7 +109,7 @@ private: ServantHolder* findServantHolder(const Ice::Identity&, ObjectStore<TransactionalEvictorElement>*) const; - void finalize(); + void finalize(bool); // // Stack of ServantHolder* @@ -126,8 +129,6 @@ private: std::auto_ptr<DeadlockException> _deadlockException; - SharedDbEnvPtr _dbEnv; - // // Protected by this // @@ -135,7 +136,7 @@ private: }; -typedef IceUtil::Handle<TransactionalEvictorContextI> TransactionalEvictorContextIPtr; +typedef IceUtil::Handle<TransactionalEvictorContext> TransactionalEvictorContextPtr; } diff --git a/cpp/src/Freeze/TransactionalEvictorI.cpp b/cpp/src/Freeze/TransactionalEvictorI.cpp index a28ee8a718e..74b9214c291 100644 --- a/cpp/src/Freeze/TransactionalEvictorI.cpp +++ b/cpp/src/Freeze/TransactionalEvictorI.cpp @@ -10,7 +10,7 @@ #include <Freeze/TransactionalEvictorI.h> #include <Freeze/Initialize.h> #include <Freeze/Util.h> -#include <Freeze/TransactionalEvictorContextI.h> +#include <Freeze/TransactionalEvictorContext.h> #include <IceUtil/IceUtil.h> @@ -91,25 +91,18 @@ Freeze::TransactionalEvictorI::TransactionalEvictorI(const ObjectAdapterPtr& ada } -TransactionalEvictorContextPtr -Freeze::TransactionalEvictorI::getCurrentContext() +TransactionPtr +Freeze::TransactionalEvictorI::getCurrentTransaction() const { DeactivateController::Guard deactivateGuard(_deactivateController); - return _dbEnv->getCurrent(); + return _dbEnv->getCurrent()->transaction(); } -TransactionalEvictorContextPtr -Freeze::TransactionalEvictorI::createCurrentContext() +void +Freeze::TransactionalEvictorI::setCurrentTransaction(const TransactionPtr& tx) { DeactivateController::Guard deactivateGuard(_deactivateController); - - bool created = false; - TransactionalEvictorContextPtr ctx = _dbEnv->getOrCreateCurrent(created); - if(!created) - { - throw DatabaseException(__FILE__, __LINE__, "createCurrentContext: there is already a current context"); - } - return ctx; + _dbEnv->setCurrentTransaction(tx); } @@ -134,7 +127,7 @@ Freeze::TransactionalEvictorI::addFacet(const ObjectPtr& servant, const Identity + facet + "'"); } - DbTxn* tx = beforeQuery(); + TransactionIPtr tx = beforeQuery(); updateStats(rec.stats, currentTime); @@ -170,14 +163,14 @@ Freeze::TransactionalEvictorI::removeFacet(const Identity& ident, const string& if(store != 0) { - TransactionalEvictorContextIPtr ctx = _dbEnv->getCurrent(); - DbTxn* tx = 0; + TransactionalEvictorContextPtr ctx = _dbEnv->getCurrent(); + TransactionIPtr tx = 0; if(ctx != 0) { - tx = ctx->transaction()->dbTxn(); + tx = ctx->transaction(); if(tx == 0) { - throw DatabaseException(__FILE__, __LINE__, "invalid TransactionalEvictorContext"); + throw DatabaseException(__FILE__, __LINE__, "inactive transaction"); } } @@ -239,7 +232,7 @@ Freeze::TransactionalEvictorI::hasFacet(const Identity& ident, const string& fac return false; } - DbTxn* tx = beforeQuery(); + TransactionIPtr tx = beforeQuery(); if(tx == 0) { @@ -271,7 +264,7 @@ Freeze::TransactionalEvictorI::hasAnotherFacet(const Identity& ident, const stri storeMapCopy = _storeMap; } - DbTxn* tx = beforeQuery(); + TransactionIPtr tx = beforeQuery(); for(StoreMap::iterator p = storeMapCopy.begin(); p != storeMapCopy.end(); ++p) { @@ -319,34 +312,29 @@ Freeze::TransactionalEvictorI::dispatch(Ice::Request& request) { public: - CtxHolder(const TransactionalEvictorContextIPtr& ctx) : - _ctx(ctx) + CtxHolder(const TransactionalEvictorContextPtr& ctx, const SharedDbEnvPtr& dbEnv) : + _ctx(ctx), + _dbEnv(dbEnv) { } ~CtxHolder() { - bool isRollbackOnly = _ctx->isRollbackOnly(); - try { - _ctx->complete(); + _ctx->commit(); } catch(...) { - if(!isRollbackOnly) - { - throw; - } - // - // Otherwise ignored, we could be unwinding the stack - // + _dbEnv->setCurrentTransaction(0); + throw; } + _dbEnv->setCurrentTransaction(0); } private: - TransactionalEvictorContextIPtr _ctx; - + TransactionalEvictorContextPtr _ctx; + const SharedDbEnvPtr& _dbEnv; }; @@ -363,7 +351,7 @@ Freeze::TransactionalEvictorI::dispatch(Ice::Request& request) // // Is there an existing context? // - TransactionalEvictorContextIPtr ctx = _dbEnv->getCurrent(); + TransactionalEvictorContextPtr ctx = _dbEnv->getCurrent(); if(ctx != 0) { @@ -372,7 +360,7 @@ Freeze::TransactionalEvictorI::dispatch(Ice::Request& request) // // If yes, use this context; there is no retrying // - TransactionalEvictorContextI::ServantHolder servantHolder(ctx, current, store, _useNonmutating); + TransactionalEvictorContext::ServantHolder servantHolder(ctx, current, store, _useNonmutating); if(servantHolder.servant() == 0) { @@ -385,7 +373,7 @@ Freeze::TransactionalEvictorI::dispatch(Ice::Request& request) if(dispatchStatus == DispatchUserException && _rollbackOnUserException) { - ctx->rollbackOnly(); + ctx->rollback(); } if(dispatchStatus == DispatchAsync) @@ -400,14 +388,14 @@ Freeze::TransactionalEvictorI::dispatch(Ice::Request& request) catch(...) { // - // Important: this rollbackOnly() ensures that servant holder destructor won't perform + // Important: this rollback() ensures that servant holder destructor won't perform // any database operation, and hence will not throw. // - ctx->rollbackOnly(); + ctx->rollback(); throw; } // - // servantHolder destructor runs here and may throw (if !rollback only) + // servantHolder destructor runs here and may throw (if tx was not rolled back) // } catch(const DeadlockException&) @@ -417,7 +405,7 @@ Freeze::TransactionalEvictorI::dispatch(Ice::Request& request) } catch(...) { - ctx->rollbackOnly(); + ctx->rollback(); throw; } } @@ -494,14 +482,12 @@ Freeze::TransactionalEvictorI::dispatch(Ice::Request& request) { try { - bool created = false; - ctx = _dbEnv->getOrCreateCurrent(created); - CtxHolder ctxHolder(ctx); - assert(created); + ctx = _dbEnv->createCurrent(); + CtxHolder ctxHolder(ctx, _dbEnv); try { - TransactionalEvictorContextI::ServantHolder servantHolder(ctx, current, store, _useNonmutating); + TransactionalEvictorContext::ServantHolder servantHolder(ctx, current, store, _useNonmutating); if(servantHolder.servant() == 0) { @@ -513,7 +499,7 @@ Freeze::TransactionalEvictorI::dispatch(Ice::Request& request) DispatchStatus dispatchStatus = servantHolder.servant()->ice_dispatch(request, ctx); if(dispatchStatus == DispatchUserException && _rollbackOnUserException) { - ctx->rollbackOnly(); + ctx->rollback(); } if(dispatchStatus == DispatchAsync) { @@ -528,14 +514,14 @@ Freeze::TransactionalEvictorI::dispatch(Ice::Request& request) catch(...) { // - // Important: this rollbackOnly() ensures that servant holder destructor won't perform + // Important: this rollback() ensures that servant holder destructor won't perform // any database operation, and hence will not throw. // - ctx->rollbackOnly(); + ctx->rollback(); throw; } // - // servant holder destructor runs here and may throw (if !rollback only) + // servant holder destructor runs here and may throw (if !rolled back) // } catch(const DeadlockException&) @@ -545,12 +531,12 @@ Freeze::TransactionalEvictorI::dispatch(Ice::Request& request) } catch(...) { - ctx->rollbackOnly(); + ctx->rollback(); throw; } // - // complete occurs here! + // commit occurs here! // } catch(const DeadlockException&) @@ -600,17 +586,17 @@ Freeze::TransactionalEvictorI::~TransactionalEvictorI() // } -DbTxn* +Freeze::TransactionIPtr Freeze::TransactionalEvictorI::beforeQuery() { - TransactionalEvictorContextIPtr ctx = _dbEnv->getCurrent(); - DbTxn* tx = 0; + TransactionalEvictorContextPtr ctx = _dbEnv->getCurrent(); + TransactionIPtr tx = 0; if(ctx != 0) { - tx = ctx->transaction()->dbTxn(); + tx = ctx->transaction(); if(tx == 0) { - throw DatabaseException(__FILE__, __LINE__,"invalid TransactionalEvictorContext"); + throw DatabaseException(__FILE__, __LINE__,"inactive transaction"); } } diff --git a/cpp/src/Freeze/TransactionalEvictorI.h b/cpp/src/Freeze/TransactionalEvictorI.h index 73c2530d637..a55700a98bf 100644 --- a/cpp/src/Freeze/TransactionalEvictorI.h +++ b/cpp/src/Freeze/TransactionalEvictorI.h @@ -75,8 +75,8 @@ public: virtual ~TransactionalEvictorI(); - virtual TransactionalEvictorContextPtr getCurrentContext(); - virtual TransactionalEvictorContextPtr createCurrentContext(); + virtual TransactionPtr getCurrentTransaction() const; + virtual void setCurrentTransaction(const TransactionPtr&); virtual Ice::ObjectPrx addFacet(const Ice::ObjectPtr&, const Ice::Identity&, const std::string&); virtual Ice::ObjectPtr removeFacet(const Ice::Identity&, const std::string&); @@ -86,7 +86,7 @@ public: virtual void finished(const Ice::Current&, const Ice::ObjectPtr&, const Ice::LocalObjectPtr&); virtual void deactivate(const std::string&); - virtual DbTxn* beforeQuery(); + virtual TransactionIPtr beforeQuery(); Ice::DispatchStatus dispatch(Ice::Request&); diff --git a/java/CHANGES b/java/CHANGES index 1d30c87ef58..030c332e546 100644 --- a/java/CHANGES +++ b/java/CHANGES @@ -1,6 +1,10 @@ Changes since version 3.2.X (binary incompabible) ------------------------------------------------- +- Freeze evictor update: + - the existing evictor was renamed BackgroundSaveEvictor + - added new TransactionalEvictor + - Added support for udp multicast. See manual for more information. - If a proxy contains a host which is multihomed, the client will now diff --git a/java/src/Freeze/BackgroundSaveEvictorI.java b/java/src/Freeze/BackgroundSaveEvictorI.java index 488adabadca..ca740cfa1b7 100644 --- a/java/src/Freeze/BackgroundSaveEvictorI.java +++ b/java/src/Freeze/BackgroundSaveEvictorI.java @@ -1366,7 +1366,7 @@ class BackgroundSaveEvictorI extends EvictorI implements BackgroundSaveEvictor, } } - protected com.sleepycat.db.Transaction + protected TransactionI beforeQuery() { saveNow(); diff --git a/java/src/Freeze/ConnectionI.java b/java/src/Freeze/ConnectionI.java index 053d32fd353..517cc831da8 100755 --- a/java/src/Freeze/ConnectionI.java +++ b/java/src/Freeze/ConnectionI.java @@ -88,7 +88,7 @@ class ConnectionI extends Ice.LocalObjectImpl implements Connection } - if(_dbEnv != null && _ownDbEnv) + if(_dbEnv != null) { try { @@ -117,7 +117,6 @@ class ConnectionI extends Ice.LocalObjectImpl implements Connection ConnectionI(Ice.Communicator communicator, String envName, com.sleepycat.db.Environment dbEnv) { this(SharedDbEnv.get(communicator, envName, dbEnv)); - _ownDbEnv = true; } @@ -213,7 +212,6 @@ class ConnectionI extends Ice.LocalObjectImpl implements Connection private Ice.Communicator _communicator; private SharedDbEnv _dbEnv; - private boolean _ownDbEnv = false; private String _envName; private TransactionI _transaction; private LinkedList _mapList = new Freeze.LinkedList(); diff --git a/java/src/Freeze/EvictorI.java b/java/src/Freeze/EvictorI.java index 21d6d633036..0d029e81477 100644 --- a/java/src/Freeze/EvictorI.java +++ b/java/src/Freeze/EvictorI.java @@ -256,7 +256,7 @@ abstract class EvictorI extends Ice.LocalObjectImpl implements Evictor { facet = ""; } - com.sleepycat.db.Transaction tx = beforeQuery(); + TransactionI tx = beforeQuery(); return new EvictorIteratorI(findStore(facet, false), tx, batchSize); } finally @@ -414,7 +414,7 @@ abstract class EvictorI extends Ice.LocalObjectImpl implements Evictor this(adapter, envName, null, filename, facetTypes, initializer, indices, createDb); } - abstract com.sleepycat.db.Transaction beforeQuery(); + abstract TransactionI beforeQuery(); static void updateStats(Statistics stats, long time) diff --git a/java/src/Freeze/EvictorIteratorI.java b/java/src/Freeze/EvictorIteratorI.java index 437f527f0f7..c96a1fdd7ce 100644 --- a/java/src/Freeze/EvictorIteratorI.java +++ b/java/src/Freeze/EvictorIteratorI.java @@ -38,12 +38,12 @@ class EvictorIteratorI extends Ice.LocalObjectImpl implements EvictorIterator } } - EvictorIteratorI(ObjectStore store, com.sleepycat.db.Transaction tx, int batchSize) + EvictorIteratorI(ObjectStore store, TransactionI tx, int batchSize) { _store = store; _more = (store != null); _batchSize = batchSize; - _tx = tx; + _tx = tx == null ? null : tx.dbTxn(); assert batchSize > 0; diff --git a/java/src/Freeze/Index.java b/java/src/Freeze/Index.java index 42e72107baf..153640b4133 100644 --- a/java/src/Freeze/Index.java +++ b/java/src/Freeze/Index.java @@ -86,8 +86,9 @@ public abstract class Index implements com.sleepycat.db.SecondaryKeyCreator Ice.Communicator communicator = _store.communicator(); - com.sleepycat.db.Transaction tx = _store.evictor().beforeQuery(); - + TransactionI transaction = _store.evictor().beforeQuery(); + com.sleepycat.db.Transaction tx = transaction == null ? null : transaction.dbTxn(); + java.util.List identities; for(;;) @@ -229,7 +230,8 @@ public abstract class Index implements com.sleepycat.db.SecondaryKeyCreator // dlen is 0, so we should not retrieve any value // value.setPartial(true); - com.sleepycat.db.Transaction tx = _store.evictor().beforeQuery(); + TransactionI transaction = _store.evictor().beforeQuery(); + com.sleepycat.db.Transaction tx = transaction == null ? null : transaction.dbTxn(); for(;;) { diff --git a/java/src/Freeze/ObjectStore.java b/java/src/Freeze/ObjectStore.java index c2425c5bba5..41421446a19 100644 --- a/java/src/Freeze/ObjectStore.java +++ b/java/src/Freeze/ObjectStore.java @@ -153,8 +153,20 @@ class ObjectStore implements IceUtil.Store } boolean - dbHasObject(Ice.Identity ident, com.sleepycat.db.Transaction tx) + dbHasObject(Ice.Identity ident, TransactionI transaction) { + com.sleepycat.db.Transaction tx = null; + + if(transaction != null) + { + tx = transaction.dbTxn(); + if(tx == null) + { + throw new DatabaseException(_evictor.errorPrefix() + "inactive transaction"); + } + } + + byte[] key = marshalKey(ident, _communicator); com.sleepycat.db.DatabaseEntry dbKey = new com.sleepycat.db.DatabaseEntry(key); @@ -421,10 +433,14 @@ class ObjectStore implements IceUtil.Store ObjectRecord load(Ice.Identity ident, TransactionI transaction) { + if(transaction == null) + { + throw new DatabaseException(_evictor.errorPrefix() + "no active transaction"); + } com.sleepycat.db.Transaction tx = transaction.dbTxn(); if(tx == null) { - throw new DatabaseException(_evictor.errorPrefix() + "invalid TransactionalEvictorContext"); + throw new DatabaseException(_evictor.errorPrefix() + "inactive transaction"); } byte[] key = marshalKey(ident, _communicator); @@ -476,10 +492,14 @@ class ObjectStore implements IceUtil.Store void update(Ice.Identity ident, ObjectRecord objectRecord, TransactionI transaction) { + if(transaction == null) + { + throw new DatabaseException(_evictor.errorPrefix() + "no active transaction"); + } com.sleepycat.db.Transaction tx = transaction.dbTxn(); if(tx == null) { - throw new DatabaseException(_evictor.errorPrefix() + "invalid TransactionalEvictorContext"); + throw new DatabaseException(_evictor.errorPrefix() + "inactive transaction"); } if(_sampleServant != null && !objectRecord.servant.ice_id().equals(_sampleServant.ice_id())) @@ -524,8 +544,19 @@ class ObjectStore implements IceUtil.Store } boolean - insert(Ice.Identity ident, ObjectRecord objectRecord, com.sleepycat.db.Transaction tx) + insert(Ice.Identity ident, ObjectRecord objectRecord, TransactionI transaction) { + com.sleepycat.db.Transaction tx = null; + + if(transaction != null) + { + tx = transaction.dbTxn(); + if(tx == null) + { + throw new DatabaseException(_evictor.errorPrefix() + "invalid transaction"); + } + } + com.sleepycat.db.DatabaseEntry dbKey = new com.sleepycat.db.DatabaseEntry(marshalKey(ident, _communicator)); com.sleepycat.db.DatabaseEntry dbValue = new com.sleepycat.db.DatabaseEntry(marshalValue(objectRecord, _communicator)); @@ -573,8 +604,19 @@ class ObjectStore implements IceUtil.Store } boolean - remove(Ice.Identity ident, com.sleepycat.db.Transaction tx) + remove(Ice.Identity ident, TransactionI transaction) { + com.sleepycat.db.Transaction tx = null; + + if(transaction != null) + { + tx = transaction.dbTxn(); + if(tx == null) + { + throw new DatabaseException(_evictor.errorPrefix() + "invalid transaction"); + } + } + com.sleepycat.db.DatabaseEntry dbKey = new com.sleepycat.db.DatabaseEntry(marshalKey(ident, _communicator)); for(;;) diff --git a/java/src/Freeze/PostCompletionCallback.java b/java/src/Freeze/PostCompletionCallback.java new file mode 100644 index 00000000000..a8f52d28d1b --- /dev/null +++ b/java/src/Freeze/PostCompletionCallback.java @@ -0,0 +1,15 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +package Freeze; + +interface PostCompletionCallback +{ + void postCompletion(boolean committed, boolean deadlock); +} diff --git a/java/src/Freeze/SharedDbEnv.java b/java/src/Freeze/SharedDbEnv.java index 11233f95536..35940fc9425 100644 --- a/java/src/Freeze/SharedDbEnv.java +++ b/java/src/Freeze/SharedDbEnv.java @@ -205,49 +205,49 @@ class SharedDbEnv implements com.sleepycat.db.ErrorHandler, Runnable // - // Get/create an evictor context associated with the calling thread + // Create an evictor context associated with the calling thread // - synchronized TransactionalEvictorContextI - getOrCreateCurrent(Ice.BooleanHolder created) + synchronized TransactionalEvictorContext + createCurrent() { - if(created != null) - { - created.value = false; - } - Object k = Thread.currentThread(); - TransactionalEvictorContextI ctx = (TransactionalEvictorContextI)_ctxMap.get(k); - if(ctx == null) - { - ctx = new TransactionalEvictorContextI(this); - - if(created != null) - { - created.value = true; - } - _ctxMap.put(k, ctx); - } + TransactionalEvictorContext ctx = (TransactionalEvictorContext)_ctxMap.get(k); + assert ctx == null; + + ctx = new TransactionalEvictorContext(this); + _refCount++; // owned by the underlying ConnectionI + _ctxMap.put(k, ctx); + return ctx; } - synchronized TransactionalEvictorContextI + synchronized TransactionalEvictorContext getCurrent() { Object k = Thread.currentThread(); - return (TransactionalEvictorContextI)_ctxMap.get(k); + return (TransactionalEvictorContext)_ctxMap.get(k); } - // - // Clear evictor context associated with the calling thread - // synchronized void - clearCurrent(TransactionalEvictorContextI oldCtx) + setCurrentTransaction(Transaction tx) { - Object removedCtx = _ctxMap.remove(Thread.currentThread()); - assert removedCtx == oldCtx; - } + Object k = Thread.currentThread(); + if(tx != null) + { + TransactionalEvictorContext ctx = (TransactionalEvictorContext)_ctxMap.get(k); + if(ctx == null || !tx.equals(ctx.transaction())) + { + ctx = new TransactionalEvictorContext((TransactionI)tx); + _ctxMap.put(k, ctx); + } + } + else + { + _ctxMap.put(k, null); + } + } private SharedDbEnv(MapKey key, com.sleepycat.db.Environment dbEnv) diff --git a/java/src/Freeze/TransactionI.java b/java/src/Freeze/TransactionI.java index 7d4f7715661..3c97a843426 100755 --- a/java/src/Freeze/TransactionI.java +++ b/java/src/Freeze/TransactionI.java @@ -14,7 +14,14 @@ class TransactionI extends Ice.LocalObjectImpl implements Transaction public void commit() { + if(_txn == null) + { + throw new DatabaseException(_errorPrefix + "inactive transaction"); + } + String txnId = null; + boolean committed = false; + boolean deadlock = false; try { @@ -26,18 +33,21 @@ class TransactionI extends Ice.LocalObjectImpl implements Transaction } _txn.commit(); + committed = true; if(_txTrace >= 1) { - _connection.communicator().getLogger().trace("Freeze.Map", _errorPrefix + "committed transaction " + + _connection.communicator().getLogger().trace("Freeze.Transaction", _errorPrefix + "committed transaction " + txnId); } } catch(com.sleepycat.db.DeadlockException e) { + deadlock = true; + if(_txTrace >= 1) { - _connection.communicator().getLogger().trace("Freeze.Map", _errorPrefix + + _connection.communicator().getLogger().trace("Freeze.Transaction", _errorPrefix + "failed to commit transaction " + txnId + ": " + e.getMessage()); } @@ -51,7 +61,7 @@ class TransactionI extends Ice.LocalObjectImpl implements Transaction { if(_txTrace >= 1) { - _connection.communicator().getLogger().trace("Freeze.Map", _errorPrefix + + _connection.communicator().getLogger().trace("Freeze.Transaction", _errorPrefix + "failed to commit transaction " + txnId + ": " + e.getMessage()); } @@ -64,15 +74,26 @@ class TransactionI extends Ice.LocalObjectImpl implements Transaction finally { _connection.clearTransaction(); + if(_ownConnection) + { + _connection.close(); + } _connection = null; _txn = null; + postCompletion(committed, deadlock); } } public void rollback() { + if(_txn == null) + { + throw new DatabaseException(_errorPrefix + "inactive transaction"); + } + String txnId = null; + boolean deadlock = false; try { @@ -87,7 +108,7 @@ class TransactionI extends Ice.LocalObjectImpl implements Transaction if(_txTrace >= 1) { - _connection.communicator().getLogger().trace("Freeze.Map", _errorPrefix + "rolled back transaction " + + _connection.communicator().getLogger().trace("Freeze.Transaction", _errorPrefix + "rolled back transaction " + txnId); } } @@ -95,11 +116,13 @@ class TransactionI extends Ice.LocalObjectImpl implements Transaction { if(_txTrace >= 1) { - _connection.communicator().getLogger().trace("Freeze.Map", _errorPrefix + + _connection.communicator().getLogger().trace("Freeze.Transaction", _errorPrefix + "failed to rollback transaction " + txnId + ": " + e.getMessage()); } + deadlock = true; + DeadlockException ex = new DeadlockException(); ex.initCause(e); ex.message = _errorPrefix + "DbTxn.abort: " + e.getMessage(); @@ -109,7 +132,7 @@ class TransactionI extends Ice.LocalObjectImpl implements Transaction { if(_txTrace >= 1) { - _connection.communicator().getLogger().trace("Freeze.Map", _errorPrefix + + _connection.communicator().getLogger().trace("Freeze.Transaction", _errorPrefix + "failed to rollback transaction " + txnId + ": " + e.getMessage()); } @@ -122,11 +145,22 @@ class TransactionI extends Ice.LocalObjectImpl implements Transaction finally { _connection.clearTransaction(); + if(_ownConnection) + { + _connection.close(); + } _connection = null; _txn = null; + postCompletion(false, deadlock); } } + public Connection + getConnection() + { + return _connection; + } + TransactionI(ConnectionI connection) { _connection = connection; @@ -141,7 +175,7 @@ class TransactionI extends Ice.LocalObjectImpl implements Transaction { String txnId = Long.toHexString((_txn.getId() & 0x7FFFFFFF) + 0x80000000L); - _connection.communicator().getLogger().trace("Freeze.Map", _errorPrefix + "started transaction " + + _connection.communicator().getLogger().trace("Freeze.Transaction", _errorPrefix + "started transaction " + txnId); } } @@ -149,7 +183,7 @@ class TransactionI extends Ice.LocalObjectImpl implements Transaction { if(_txTrace >= 1) { - _connection.communicator().getLogger().trace("Freeze.Map", _errorPrefix + + _connection.communicator().getLogger().trace("Freeze.Transaction", _errorPrefix + "failed to start transaction: " + e.getMessage()); } @@ -160,15 +194,46 @@ class TransactionI extends Ice.LocalObjectImpl implements Transaction } } + void + setPostCompletionCallback(PostCompletionCallback cb) + { + _postCompletionCallback = cb; + } + + void + adoptConnection() + { + _ownConnection = true; + } + + ConnectionI + getConnectionI() + { + return _connection; + } + com.sleepycat.db.Transaction dbTxn() { return _txn; } + + private void + postCompletion(boolean committed, boolean deadlock) + { + if(_postCompletionCallback != null) + { + _postCompletionCallback.postCompletion(committed, deadlock); + } + } + private ConnectionI _connection; private int _txTrace; private com.sleepycat.db.Transaction _txn; + private PostCompletionCallback _postCompletionCallback; + private String _errorPrefix; + private boolean _ownConnection = false; } diff --git a/java/src/Freeze/TransactionalEvictorContextI.java b/java/src/Freeze/TransactionalEvictorContext.java index 91e96fcdf3b..4d5578a2f1e 100644 --- a/java/src/Freeze/TransactionalEvictorContextI.java +++ b/java/src/Freeze/TransactionalEvictorContext.java @@ -14,43 +14,17 @@ package Freeze; // and a number of servants loaded using this transaction. // -class TransactionalEvictorContextI extends Ice.LocalObjectImpl - implements TransactionalEvictorContext, Ice.DispatchInterceptorAsyncCallback +class TransactionalEvictorContext implements Ice.DispatchInterceptorAsyncCallback, PostCompletionCallback { public void - rollbackOnly() - { - _rollbackOnly = true; - } - - public boolean - isRollbackOnly() - { - return _rollbackOnly; - } - - public void - complete() - { + postCompletion(boolean committed, boolean deadlock) + { try { - if(_rollbackOnly) - { - _tx.rollback(); - } - else + if(committed) { - if(!_stack.empty()) - { - _dbEnv.getCommunicator().getLogger().warning - ("Committing TransactionalEvictorContext on DbEnv '" + _dbEnv.getEnvName() + "' with " - + _stack.size() + " unsaved objects."); - } - - _tx.commit(); - // - // Finally, remove updated & removed objects from cache + // Remove updated & removed objects from cache // java.util.Iterator p = _invalidateList.iterator(); while(p.hasNext()) @@ -58,22 +32,20 @@ class TransactionalEvictorContextI extends Ice.LocalObjectImpl ToInvalidate ti = (ToInvalidate)p.next(); ti.invalidate(); } + _invalidateList.clear(); } } - catch(DeadlockException ex) - { - deadlockException(); - throw ex; - } finally { synchronized(this) { - if(_dbEnv != null) + if(_tx != null) { - _dbEnv.clearCurrent(this); - _dbEnv = null; - + if(deadlock) + { + _deadlockExceptionDetected = true; + } + _tx = null; notifyAll(); } } @@ -95,7 +67,7 @@ class TransactionalEvictorContextI extends Ice.LocalObjectImpl { return false; } - if(_dbEnv == null) + if(_tx == null) { return true; } @@ -163,7 +135,7 @@ class TransactionalEvictorContextI extends Ice.LocalObjectImpl { if(_ownServant) { - if(!_rollbackOnly) + if(_tx != null) { if(!_readOnly && !_removed) { @@ -215,14 +187,43 @@ class TransactionalEvictorContextI extends Ice.LocalObjectImpl }; - TransactionalEvictorContextI(SharedDbEnv dbEnv) + TransactionalEvictorContext(SharedDbEnv dbEnv) + { + _tx = (TransactionI)(new ConnectionI(dbEnv).beginTransaction()); + _owner = Thread.currentThread(); + _tx.adoptConnection(); + + _tx.setPostCompletionCallback(this); + } + + TransactionalEvictorContext(TransactionI tx) { - _dbEnv = dbEnv; - _tx = (TransactionI)(new ConnectionI(_dbEnv).beginTransaction()); + _tx = tx; _owner = Thread.currentThread(); + + _tx.setPostCompletionCallback(this); + } + + void + rollback() + { + if(_tx != null) + { + _tx.rollback(); + } } void + commit() + { + if(_tx != null) + { + _tx.commit(); + } + } + + + void checkDeadlockException() { if(_deadlockException != null) @@ -247,18 +248,19 @@ class TransactionalEvictorContextI extends Ice.LocalObjectImpl void deadlockException() { - _rollbackOnly = true; synchronized(this) { _deadlockExceptionDetected = true; notifyAll(); } + + rollback(); } Ice.Object servantRemoved(Ice.Identity ident, ObjectStore store) { - if(!_rollbackOnly) + if(_tx != null) { // // Lookup servant holder on stack @@ -282,10 +284,10 @@ class TransactionalEvictorContextI extends Ice.LocalObjectImpl protected void finalize() { - if(_dbEnv != null) + if(_tx != null) { - _dbEnv.getCommunicator().getLogger().warning - ("Finalizing incomplete TransactionalEvictorContext on DbEnv '" + _dbEnv.getEnvName() + "'"); + _tx.getConnectionI().communicator().getLogger().warning + ("Finalizing incomplete TransactionalEvictorContext on DbEnv '" + _tx.getConnectionI().dbEnv().getEnvName() + "'"); } } @@ -333,15 +335,11 @@ class TransactionalEvictorContextI extends Ice.LocalObjectImpl // private final java.util.List _invalidateList = new java.util.LinkedList(); - private final TransactionI _tx; + private TransactionI _tx; private final Thread _owner; - private boolean _rollbackOnly = false; - private DeadlockException _deadlockException; - private SharedDbEnv _dbEnv; - // // Protected by this // diff --git a/java/src/Freeze/TransactionalEvictorI.java b/java/src/Freeze/TransactionalEvictorI.java index 62696eb061c..143071eac1f 100644 --- a/java/src/Freeze/TransactionalEvictorI.java +++ b/java/src/Freeze/TransactionalEvictorI.java @@ -11,13 +11,13 @@ package Freeze; class TransactionalEvictorI extends EvictorI implements TransactionalEvictor { - public TransactionalEvictorContext - getCurrentContext() + public Transaction + getCurrentTransaction() { _deactivateController.lock(); try { - return _dbEnv.getCurrent(); + return _dbEnv.getCurrent().transaction(); } finally { @@ -25,21 +25,13 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor } } - public TransactionalEvictorContext - createCurrentContext() + public void + setCurrentTransaction(Transaction tx) { _deactivateController.lock(); try { - Ice.BooleanHolder created = new Ice.BooleanHolder(); - TransactionalEvictorContext ctx = _dbEnv.getOrCreateCurrent(created); - - if(created.value == false) - { - throw new DatabaseException(_errorPrefix + - "createCurrentContext: there is already a current context"); - } - return ctx; + _dbEnv.setCurrentTransaction(tx); } finally { @@ -73,7 +65,7 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor throw ex; } - com.sleepycat.db.Transaction tx = beforeQuery(); + TransactionI tx = beforeQuery(); updateStats(rec.stats, currentTime); @@ -120,14 +112,14 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor ObjectStore store = findStore(facet, false); if(store != null) { - TransactionalEvictorContextI ctx = _dbEnv.getCurrent(); - com.sleepycat.db.Transaction tx = null; + TransactionalEvictorContext ctx = _dbEnv.getCurrent(); + TransactionI tx = null; if(ctx != null) { - tx = ctx.transaction().dbTxn(); + tx = ctx.transaction(); if(tx == null) { - throw new DatabaseException(_errorPrefix + "invalid TransactionalEvictorContext"); + throw new DatabaseException(_errorPrefix + "inactive transaction"); } } @@ -202,7 +194,7 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor return false; } - com.sleepycat.db.Transaction tx = beforeQuery(); + TransactionI tx = beforeQuery(); if(tx == null) { @@ -282,7 +274,7 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor // // Is there an existing context? // - TransactionalEvictorContextI ctx = _dbEnv.getCurrent(); + TransactionalEvictorContext ctx = _dbEnv.getCurrent(); if(ctx != null) { @@ -291,7 +283,7 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor // // If yes, use this context; there is no retrying // - TransactionalEvictorContextI.ServantHolder sh = ctx.createServantHolder(current, store, _useNonmutating); + TransactionalEvictorContext.ServantHolder sh = ctx.createServantHolder(current, store, _useNonmutating); if(sh.servant() == null) { @@ -304,7 +296,7 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor if(dispatchStatus == Ice.DispatchStatus.DispatchUserException && _rollbackOnUserException) { - ctx.rollbackOnly(); + ctx.rollback(); } if(dispatchStatus == Ice.DispatchStatus.DispatchAsync) { @@ -314,7 +306,7 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor } catch(RuntimeException ex) { - ctx.rollbackOnly(); + ctx.rollback(); throw ex; } finally @@ -329,7 +321,7 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor } catch(RuntimeException ex) { - ctx.rollbackOnly(); + ctx.rollback(); throw ex; } } @@ -404,13 +396,13 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor do { - ctx = _dbEnv.getOrCreateCurrent(null); + ctx = _dbEnv.createCurrent(); try { try { - TransactionalEvictorContextI.ServantHolder sh = ctx.createServantHolder(current, store, _useNonmutating); + TransactionalEvictorContext.ServantHolder sh = ctx.createServantHolder(current, store, _useNonmutating); if(sh.servant() == null) { @@ -422,7 +414,7 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor Ice.DispatchStatus dispatchStatus = sh.servant().ice_dispatch(request, ctx); if(dispatchStatus == Ice.DispatchStatus.DispatchUserException && _rollbackOnUserException) { - ctx.rollbackOnly(); + ctx.rollback(); } if(dispatchStatus == Ice.DispatchStatus.DispatchAsync) { @@ -432,12 +424,13 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor } catch(RuntimeException ex) { - ctx.rollbackOnly(); + ctx.rollback(); throw ex; } finally { sh.release(); + ctx.commit(); } } catch(DeadlockException ex) @@ -445,21 +438,19 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor ctx.deadlockException(); throw ex; } - catch(RuntimeException ex) - { - ctx.rollbackOnly(); - throw ex; - } finally { - ctx.complete(); + ctx.rollback(); } } catch(DeadlockException ex) { tryAgain = true; } - + finally + { + _dbEnv.setCurrentTransaction(null); + } } while(tryAgain); } } @@ -513,7 +504,7 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor storeMapCopy = new java.util.HashMap(_storeMap); } - com.sleepycat.db.Transaction tx = beforeQuery(); + TransactionI tx = beforeQuery(); java.util.Iterator p = storeMapCopy.entrySet().iterator(); while(p.hasNext()) @@ -562,17 +553,17 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor } } - protected com.sleepycat.db.Transaction + protected TransactionI beforeQuery() { - TransactionalEvictorContextI ctx = _dbEnv.getCurrent(); - com.sleepycat.db.Transaction tx = null; + TransactionalEvictorContext ctx = _dbEnv.getCurrent(); + TransactionI tx = null; if(ctx != null) { - tx = ctx.transaction().dbTxn(); + tx = ctx.transaction(); if(tx == null) { - throw new DatabaseException(_errorPrefix + "invalid TransactionalEvictorContext"); + throw new DatabaseException(_errorPrefix + "inactive transaction"); } } |