diff options
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/src/Freeze/BackgroundSaveEvictorI.cpp | 30 | ||||
-rw-r--r-- | cpp/src/Freeze/ObjectStore.cpp | 21 | ||||
-rw-r--r-- | cpp/src/Freeze/TransactionalEvictorContext.cpp | 7 | ||||
-rw-r--r-- | cpp/src/Freeze/TransactionalEvictorI.cpp | 16 | ||||
-rwxr-xr-x | cpp/src/FreezeScript/DumpDB.cpp | 19 | ||||
-rwxr-xr-x | cpp/src/FreezeScript/transformdb.cpp | 60 | ||||
-rw-r--r-- | cpp/test/FreezeScript/evictor/check.xml | 11 | ||||
-rw-r--r-- | cpp/test/FreezeScript/evictor/transform.xml | 8 |
8 files changed, 151 insertions, 21 deletions
diff --git a/cpp/src/Freeze/BackgroundSaveEvictorI.cpp b/cpp/src/Freeze/BackgroundSaveEvictorI.cpp index 1d8fa7acce4..f71a286b2d9 100644 --- a/cpp/src/Freeze/BackgroundSaveEvictorI.cpp +++ b/cpp/src/Freeze/BackgroundSaveEvictorI.cpp @@ -301,10 +301,12 @@ Freeze::BackgroundSaveEvictorI::addFacet(const ObjectPtr& servant, const Identit ObjectRecord& rec = element->rec; rec.servant = servant; - rec.stats.creationTime = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); - rec.stats.lastSaveTime = 0; - rec.stats.avgSaveTime = 0; - + if(_encoding == Ice::Encoding_1_0) + { + rec.stats.creationTime = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); + rec.stats.lastSaveTime = 0; + rec.stats.avgSaveTime = 0; + } addToModifiedQueue(element); break; } @@ -932,7 +934,11 @@ Freeze::BackgroundSaveEvictorI::run() deque<StreamedObject> streamedObjectQueue; - Long streamStart = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); + Long streamStart = 0; + if(_encoding == Ice::Encoding_1_0 || _trace >= 1) + { + streamStart = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); + } // // Stream each element @@ -1114,7 +1120,12 @@ Freeze::BackgroundSaveEvictorI::run() txSize = streamedObjectQueue.size(); } - Long saveStart = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); + Long saveStart = 0; + if(_encoding == Ice::Encoding_1_0 || _trace >= 1) + { + saveStart = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); + } + try { DbTxn* tx = 0; @@ -1399,7 +1410,10 @@ Freeze::BackgroundSaveEvictorI::stream(const BackgroundSaveEvictorElementPtr& el if(element->status != destroyed) { - EvictorIBase::updateStats(element->rec.stats, streamStart); + if(_encoding == Ice::Encoding_1_0) + { + EvictorIBase::updateStats(element->rec.stats, streamStart); + } ObjectStoreBase::marshal(element->rec, obj.value, _communicator, _encoding); } } @@ -1422,6 +1436,8 @@ Freeze::BackgroundSaveEvictorElement::BackgroundSaveEvictorElement(ObjectStore<B stale(true), status(clean) { + const Statistics cleanStats = { 0 }; + rec.stats = cleanStats; } Freeze::BackgroundSaveEvictorElement::~BackgroundSaveEvictorElement() diff --git a/cpp/src/Freeze/ObjectStore.cpp b/cpp/src/Freeze/ObjectStore.cpp index 744381ed984..899840b62a8 100644 --- a/cpp/src/Freeze/ObjectStore.cpp +++ b/cpp/src/Freeze/ObjectStore.cpp @@ -353,7 +353,15 @@ Freeze::ObjectStoreBase::marshal(const ObjectRecord& v, IceInternal::InstancePtr instance = IceInternal::getInstance(communicator); IceInternal::BasicStream stream(instance.get(), encoding, true); stream.startWriteEncaps(); - v.__write(&stream); + if(encoding == Ice::Encoding_1_0) + { + v.__write(&stream); + } + else + { + stream.write(v.servant); + } + stream.writePendingObjects(); stream.endWriteEncaps(); vector<Byte>(stream.b.begin(), stream.b.end()).swap(bytes); @@ -372,7 +380,16 @@ Freeze::ObjectStoreBase::unmarshal(ObjectRecord& v, memcpy(&stream.b[0], &bytes[0], bytes.size()); stream.i = stream.b.begin(); stream.startReadEncaps(); - v.__read(&stream); + + if(encoding == Ice::Encoding_1_0) + { + v.__read(&stream); + } + else + { + stream.read(v.servant); + } + stream.readPendingObjects(); stream.endReadEncaps(); } diff --git a/cpp/src/Freeze/TransactionalEvictorContext.cpp b/cpp/src/Freeze/TransactionalEvictorContext.cpp index b0dacafe261..e7c12e6a6b0 100644 --- a/cpp/src/Freeze/TransactionalEvictorContext.cpp +++ b/cpp/src/Freeze/TransactionalEvictorContext.cpp @@ -275,8 +275,11 @@ Freeze::TransactionalEvictorContext::ServantHolder::~ServantHolder() { if(!_body.readOnly && !_body.removed) { - EvictorIBase::updateStats(_body.rec.stats, - IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds()); + if(_body.store->encoding() == Ice::Encoding_1_0) + { + EvictorIBase::updateStats(_body.rec.stats, + IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds()); + } _body.store->update(_body.current->id, _body.rec, ctx->_tx); } diff --git a/cpp/src/Freeze/TransactionalEvictorI.cpp b/cpp/src/Freeze/TransactionalEvictorI.cpp index 5d984a5cf4f..40ec9191450 100644 --- a/cpp/src/Freeze/TransactionalEvictorI.cpp +++ b/cpp/src/Freeze/TransactionalEvictorI.cpp @@ -139,12 +139,15 @@ Freeze::TransactionalEvictorI::addFacet(const ObjectPtr& servant, const Identity checkIdentity(ident); DeactivateController::Guard deactivateGuard(_deactivateController); - Ice::Long currentTime = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); + Ice::Long currentTime = 0; + + if(_encoding == Ice::Encoding_1_0) + { + currentTime = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); + } Statistics stats = { currentTime }; - ObjectRecord rec; - rec.servant = servant; - rec.stats = stats; + ObjectRecord rec = { servant, stats }; ObjectStore<TransactionalEvictorElement>* store = findStore(facet, _createDb); @@ -156,7 +159,10 @@ Freeze::TransactionalEvictorI::addFacet(const ObjectPtr& servant, const Identity TransactionIPtr tx = beforeQuery(); - updateStats(rec.stats, currentTime); + if(_encoding == Ice::Encoding_1_0) + { + updateStats(rec.stats, currentTime); + } if(!store->insert(ident, rec, tx)) { diff --git a/cpp/src/FreezeScript/DumpDB.cpp b/cpp/src/FreezeScript/DumpDB.cpp index 5472b1d50a8..955cbcf66af 100755 --- a/cpp/src/FreezeScript/DumpDB.cpp +++ b/cpp/src/FreezeScript/DumpDB.cpp @@ -106,6 +106,7 @@ usage(const string& n) "--select EXPR Dump a record only if EXPR is true.\n" "-c, --catalog Display information about the databases in an\n" " environment, or about a particular database.\n" + "--encoding VERSION Sets the encoding version for the database environment.\n" ; } @@ -158,6 +159,7 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator opts.addOpt("", "value", IceUtilInternal::Options::NeedArg); opts.addOpt("", "select", IceUtilInternal::Options::NeedArg); opts.addOpt("c", "catalog"); + opts.addOpt("", "encoding", IceUtilInternal::Options::NeedArg); vector<string> args; try @@ -171,6 +173,8 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator return EXIT_FAILURE; } + Ice::EncodingVersion encoding = Ice::currentEncoding; + // // Freeze creates a lock file by default to prevent multiple processes from opening // the same database environment simultaneously. In the case of a read-only program @@ -189,6 +193,9 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator { props->setProperty(prefix + ".LockFile", "0"); } + + encoding = Ice::stringToEncodingVersion( + props->getPropertyWithDefault(prefix + ".Encoding", Ice::encodingVersionToString(encoding))); } if(opts.isSet("h")) @@ -314,6 +321,16 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator { selectExpr = opts.optArg("select"); } + if(opts.isSet("encoding")) + { + encoding = Ice::stringToEncodingVersion(opts.optArg("encoding")); + } + + if(!IceInternal::isSupported(encoding, Ice::currentEncoding)) + { + cerr << appName << ": " << "unsupported encoding" << endl; + return EXIT_FAILURE; + } if(outputFile.empty() && args.size() != 2) { @@ -357,7 +374,7 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator if(inputFile.empty()) { const string evictorKeyTypeName = "::Ice::Identity"; - const string evictorValueTypeName = "::Freeze::ObjectRecord"; + const string evictorValueTypeName = (encoding == Ice::Encoding_1_0) ? "::Freeze::ObjectRecord" : "Object"; if((!keyTypeName.empty() && valueTypeName.empty()) || (keyTypeName.empty() && !valueTypeName.empty())) { diff --git a/cpp/src/FreezeScript/transformdb.cpp b/cpp/src/FreezeScript/transformdb.cpp index 6a6bd5fe7f5..b9f6e9774ef 100755 --- a/cpp/src/FreezeScript/transformdb.cpp +++ b/cpp/src/FreezeScript/transformdb.cpp @@ -83,6 +83,10 @@ usage(const std::string& n) "-p Purge objects whose types no longer exist.\n" "-c Use catastrophic recovery on the old database environment.\n" "-w Suppress duplicate warnings during migration.\n" + "--encoding VER[,VER] Specifies the Ice encoding version for the database\n" + " environments. If the encoding version remains the same,\n" + " only one needs to be specified. Otherwise, the versions\n" + " are specified as old-version,new-version.\n" "-f FILE Execute the transformation descriptors in the file FILE.\n" ; } @@ -232,6 +236,8 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator string valueTypeNames; string dbEnvName, dbName, dbEnvNameNew; bool allDb = false; + Ice::EncodingVersion oldEncoding = Ice::currentEncoding; + Ice::EncodingVersion newEncoding = Ice::currentEncoding; IceUtilInternal::Options opts; opts.addOpt("h", "help"); @@ -245,6 +251,7 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator opts.addOpt("p"); opts.addOpt("c"); opts.addOpt("w"); + opts.addOpt("", "encoding", IceUtilInternal::Options::NeedArg); opts.addOpt("f", "", IceUtilInternal::Options::NeedArg); opts.addOpt("", "include-old", IceUtilInternal::Options::NeedArg, "", IceUtilInternal::Options::Repeat); opts.addOpt("", "include-new", IceUtilInternal::Options::NeedArg, "", IceUtilInternal::Options::Repeat); @@ -308,6 +315,7 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator purgeObjects = opts.isSet("p"); catastrophicRecover = opts.isSet("c"); suppress = opts.isSet("w"); + if(opts.isSet("f")) { inputFile = opts.optArg("f"); @@ -432,6 +440,38 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator { props->setProperty(prefix + ".LockFile", "0"); } + + oldEncoding = Ice::stringToEncodingVersion( + props->getPropertyWithDefault(prefix + ".Encoding", Ice::encodingVersionToString(oldEncoding))); + } + + if(opts.isSet("encoding")) + { + string encodingList = opts.optArg("encoding"); + string::size_type pos = encodingList.find(","); + + if(pos == 0 || pos == encodingList.size()) + { + cerr << appName << ": " << "unsupported encoding" << endl; + return EXIT_FAILURE; + } + if(pos == string::npos) + { + oldEncoding = Ice::stringToEncodingVersion(encodingList); + newEncoding = oldEncoding; + } + else + { + oldEncoding = Ice::stringToEncodingVersion(encodingList.substr(0, pos)); + newEncoding = Ice::stringToEncodingVersion(encodingList.substr(pos + 1)); + } + } + + if(!IceInternal::isSupported(oldEncoding, Ice::currentEncoding) || + !IceInternal::isSupported(newEncoding, Ice::currentEncoding)) + { + cerr << appName << ": " << "unsupported encoding" << endl; + return EXIT_FAILURE; } Slice::UnitPtr oldUnit = Slice::Unit::createUnit(true, true, ice, underscore); @@ -490,7 +530,8 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator FreezeScript::TransformAnalyzer analyzer(oldUnit, newUnit, ignoreTypeChanges, out, missingTypes, analyzeErrors); const string evictorKeyName = "::Ice::Identity"; - const string evictorValueName = "::Freeze::ObjectRecord"; + const string oldEvictorValueTypeName = (oldEncoding == Ice::Encoding_1_0) ? "::Freeze::ObjectRecord" : "Object"; + const string newEvictorValueTypeName = (newEncoding == Ice::Encoding_1_0) ? "::Freeze::ObjectRecord" : "Object"; if(allDb) { @@ -504,7 +545,7 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator if(p->second.evictor) { keyName = evictorKeyName; - valueName = evictorValueName; + valueName = oldEvictorValueTypeName; } else { @@ -533,7 +574,17 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator cerr << appName << ": type `" << valueName << "' from database `" << p->first << "' not found in old Slice definitions" << endl; } - Slice::TypePtr newValueType = findType(newUnit, valueName); + + Slice::TypePtr newValueType; + if(p->second.evictor) + { + newValueType = findType(newUnit, newEvictorValueTypeName); + } + else + { + newValueType = findType(newUnit, valueName); + } + if(!newValueType) { cerr << appName << ": type `" << valueName << "' from database `" << p->first @@ -564,7 +615,8 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator if(evictor) { oldKeyName = newKeyName = evictorKeyName; - oldValueName = newValueName = evictorValueName; + oldValueName = oldEvictorValueTypeName; + newValueName = newEvictorValueTypeName; } else { diff --git a/cpp/test/FreezeScript/evictor/check.xml b/cpp/test/FreezeScript/evictor/check.xml index 00eee237847..877895e3dcf 100644 --- a/cpp/test/FreezeScript/evictor/check.xml +++ b/cpp/test/FreezeScript/evictor/check.xml @@ -1,10 +1,21 @@ <transformdb> + +<!-- <database key="::Ice::Identity" value="::Freeze::ObjectRecord"> <record> <fail test="newvalue.servant.ice_id == '::Test::DerivedMainObject'"/> <fail test="newvalue.servant.ice_id == '::Test::DerivedFacetObject'"/> </record> </database> +--> + + <database key="::Ice::Identity" value="Object"> + <record> + <fail test="newvalue.ice_id == '::Test::DerivedMainObject'"/> + <fail test="newvalue.ice_id == '::Test::DerivedFacetObject'"/> + </record> + </database> + <!-- enum ::Test::E --> <transform type="::Test::E"/> diff --git a/cpp/test/FreezeScript/evictor/transform.xml b/cpp/test/FreezeScript/evictor/transform.xml index c18a6c6629c..b6cb74d1562 100644 --- a/cpp/test/FreezeScript/evictor/transform.xml +++ b/cpp/test/FreezeScript/evictor/transform.xml @@ -1,7 +1,15 @@ <transformdb> + + <database key="::Ice::Identity" value="Object"> + <record/> + </database> + +<!-- <database key="::Ice::Identity" value="::Freeze::ObjectRecord"> <record/> </database> +--> + <!-- enum ::Test::E --> <transform type="::Test::E"/> |