diff options
author | Bernard Normier <bernard@zeroc.com> | 2012-08-21 17:01:15 -0400 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2012-08-21 17:03:33 -0400 |
commit | 472d9552de83c5e8b96030f47ed222de77556417 (patch) | |
tree | da9ed5b4c66c3e9ce112dbe6797cf73d8d386152 /cpp | |
parent | Fixed ICE-2097: with Ice encoding > 1.0, Freeze evictors no longer maintain (diff) | |
download | ice-472d9552de83c5e8b96030f47ed222de77556417.tar.bz2 ice-472d9552de83c5e8b96030f47ed222de77556417.tar.xz ice-472d9552de83c5e8b96030f47ed222de77556417.zip |
Much better fix for ICE-2097: whether or not to keep the stats is no longer
determined by the encoding but by the Catalog data for the evictor. With the
new default, the catalog data key and value are set, in particular the value
is set to "Object". With old evictors, the catalog data value was set to "",
which means ::Freeze::ObjectRecord (with stats).
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/src/Freeze/BackgroundSaveEvictorI.cpp | 23 | ||||
-rw-r--r-- | cpp/src/Freeze/IndexI.cpp | 2 | ||||
-rw-r--r-- | cpp/src/Freeze/ObjectStore.cpp | 34 | ||||
-rw-r--r-- | cpp/src/Freeze/ObjectStore.h | 14 | ||||
-rw-r--r-- | cpp/src/Freeze/TransactionalEvictorContext.cpp | 2 | ||||
-rw-r--r-- | cpp/src/Freeze/TransactionalEvictorI.cpp | 21 | ||||
-rwxr-xr-x | cpp/src/FreezeScript/DumpDB.cpp | 54 | ||||
-rwxr-xr-x | cpp/src/FreezeScript/transformdb.cpp | 129 |
8 files changed, 144 insertions, 135 deletions
diff --git a/cpp/src/Freeze/BackgroundSaveEvictorI.cpp b/cpp/src/Freeze/BackgroundSaveEvictorI.cpp index f71a286b2d9..7b2215f7341 100644 --- a/cpp/src/Freeze/BackgroundSaveEvictorI.cpp +++ b/cpp/src/Freeze/BackgroundSaveEvictorI.cpp @@ -301,7 +301,7 @@ Freeze::BackgroundSaveEvictorI::addFacet(const ObjectPtr& servant, const Identit ObjectRecord& rec = element->rec; rec.servant = servant; - if(_encoding == Ice::Encoding_1_0) + if(store->keepStats()) { rec.stats.creationTime = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); rec.stats.lastSaveTime = 0; @@ -934,11 +934,7 @@ Freeze::BackgroundSaveEvictorI::run() deque<StreamedObject> streamedObjectQueue; - Long streamStart = 0; - if(_encoding == Ice::Encoding_1_0 || _trace >= 1) - { - streamStart = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); - } + Long streamStart = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); // // Stream each element @@ -1120,12 +1116,8 @@ Freeze::BackgroundSaveEvictorI::run() txSize = streamedObjectQueue.size(); } - Long saveStart = 0; - if(_encoding == Ice::Encoding_1_0 || _trace >= 1) - { - saveStart = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); - } - + Long saveStart = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); + try { DbTxn* tx = 0; @@ -1404,17 +1396,18 @@ Freeze::BackgroundSaveEvictorI::stream(const BackgroundSaveEvictorElementPtr& el obj.status = element->status; obj.store = &element->store; - + const Identity& ident = element->cachePosition->first; ObjectStoreBase::marshal(ident, obj.key, _communicator, _encoding); if(element->status != destroyed) { - if(_encoding == Ice::Encoding_1_0) + bool keepStats = obj.store->keepStats(); + if(keepStats) { EvictorIBase::updateStats(element->rec.stats, streamStart); } - ObjectStoreBase::marshal(element->rec, obj.value, _communicator, _encoding); + ObjectStoreBase::marshal(element->rec, obj.value, _communicator, _encoding, keepStats); } } diff --git a/cpp/src/Freeze/IndexI.cpp b/cpp/src/Freeze/IndexI.cpp index f0910bb2452..11a9bfc4be4 100644 --- a/cpp/src/Freeze/IndexI.cpp +++ b/cpp/src/Freeze/IndexI.cpp @@ -405,7 +405,7 @@ Freeze::IndexI::secondaryKeyCreate(Db* secondary, const Dbt* dbKey, ObjectRecord rec; Byte* first = static_cast<Byte*>(dbValue->get_data()); Value value(first, first + dbValue->get_size()); - ObjectStoreBase::unmarshal(rec, value, communicator, encoding); + ObjectStoreBase::unmarshal(rec, value, communicator, encoding, _store->keepStats()); Key bytes; if(_index.marshalKey(rec.servant, bytes)) diff --git a/cpp/src/Freeze/ObjectStore.cpp b/cpp/src/Freeze/ObjectStore.cpp index 899840b62a8..4015ab63eb5 100644 --- a/cpp/src/Freeze/ObjectStore.cpp +++ b/cpp/src/Freeze/ObjectStore.cpp @@ -29,7 +29,8 @@ Freeze::ObjectStoreBase::ObjectStoreBase(const string& facet, const string& face _evictor(evictor), _indices(indices), _communicator(evictor->communicator()), - _encoding(evictor->encoding()) + _encoding(evictor->encoding()), + _keepStats(false) { if(facet == "") { @@ -60,10 +61,17 @@ Freeze::ObjectStoreBase::ObjectStoreBase(const string& facet, const string& face Catalog::iterator p = catalog.find(evictor->filename()); if(p != catalog.end()) { - if(p->second.evictor == false) + if(p->second.evictor) + { + // + // empty means the value is ::Freeze::ObjectRecord + // + _keepStats = p->second.value.empty(); + } + else { DatabaseException ex(__FILE__, __LINE__); - ex.message = evictor->filename() + " is an evictor database"; + ex.message = evictor->filename() + " is not an evictor database"; throw ex; } } @@ -141,6 +149,8 @@ Freeze::ObjectStoreBase::ObjectStoreBase(const string& facet, const string& face { CatalogData catalogData; catalogData.evictor = true; + catalogData.key = "Ice::Identity"; + catalogData.value = "Object"; catalog.put(Catalog::value_type(evictor->filename(), catalogData)); } @@ -348,12 +358,13 @@ void Freeze::ObjectStoreBase::marshal(const ObjectRecord& v, Value& bytes, const CommunicatorPtr& communicator, - const EncodingVersion& encoding) + const EncodingVersion& encoding, + bool keepStats) { IceInternal::InstancePtr instance = IceInternal::getInstance(communicator); IceInternal::BasicStream stream(instance.get(), encoding, true); stream.startWriteEncaps(); - if(encoding == Ice::Encoding_1_0) + if(keepStats) { v.__write(&stream); } @@ -371,7 +382,8 @@ void Freeze::ObjectStoreBase::unmarshal(ObjectRecord& v, const Value& bytes, const CommunicatorPtr& communicator, - const EncodingVersion& encoding) + const EncodingVersion& encoding, + bool keepStats) { IceInternal::InstancePtr instance = IceInternal::getInstance(communicator); IceInternal::BasicStream stream(instance.get(), encoding, true); @@ -381,7 +393,7 @@ Freeze::ObjectStoreBase::unmarshal(ObjectRecord& v, stream.i = stream.b.begin(); stream.startReadEncaps(); - if(encoding == Ice::Encoding_1_0) + if(keepStats) { v.__read(&stream); } @@ -453,7 +465,7 @@ Freeze::ObjectStoreBase::load(const Identity& ident, const TransactionIPtr& tran } } - unmarshal(rec, value, _communicator, _encoding); + unmarshal(rec, value, _communicator, _encoding, _keepStats); _evictor->initialize(ident, _facet, rec.servant); return true; } @@ -477,7 +489,7 @@ Freeze::ObjectStoreBase::update(const Identity& ident, const ObjectRecord& rec, marshal(ident, key, _communicator, _encoding); Value value; - marshal(rec, value, _communicator, _encoding); + marshal(rec, value, _communicator, _encoding, _keepStats); Dbt dbKey; Dbt dbValue; @@ -522,7 +534,7 @@ Freeze::ObjectStoreBase::insert(const Identity& ident, const ObjectRecord& rec, marshal(ident, key, _communicator, _encoding); Value value; - marshal(rec, value, _communicator, _encoding); + marshal(rec, value, _communicator, _encoding, _keepStats); Dbt dbKey; Dbt dbValue; @@ -670,7 +682,7 @@ Freeze::ObjectStoreBase::loadImpl(const Identity& ident, ObjectRecord& rec) } } - unmarshal(rec, value, _communicator, _encoding); + unmarshal(rec, value, _communicator, _encoding, _keepStats); _evictor->initialize(ident, _facet, rec.servant); return true; } diff --git a/cpp/src/Freeze/ObjectStore.h b/cpp/src/Freeze/ObjectStore.h index a78c3e197d9..ff2574fa931 100644 --- a/cpp/src/Freeze/ObjectStore.h +++ b/cpp/src/Freeze/ObjectStore.h @@ -44,8 +44,8 @@ public: static void marshal(const Ice::Identity&, Key&, const Ice::CommunicatorPtr&, const Ice::EncodingVersion&); static void unmarshal(Ice::Identity&, const Key&, const Ice::CommunicatorPtr&, const Ice::EncodingVersion&); - static void marshal(const ObjectRecord&, Value&, const Ice::CommunicatorPtr&, const Ice::EncodingVersion&); - static void unmarshal(ObjectRecord&, const Value&, const Ice::CommunicatorPtr&, const Ice::EncodingVersion&); + static void marshal(const ObjectRecord&, Value&, const Ice::CommunicatorPtr&, const Ice::EncodingVersion&, bool); + static void unmarshal(ObjectRecord&, const Value&, const Ice::CommunicatorPtr&, const Ice::EncodingVersion&, bool); bool load(const Ice::Identity&, const TransactionIPtr&, ObjectRecord&); void update(const Ice::Identity&, const ObjectRecord&, const TransactionIPtr&); @@ -64,7 +64,8 @@ public: const Ice::CommunicatorPtr& communicator() const; const Ice::EncodingVersion& encoding() const; const std::string& facet() const; - + bool keepStats() const; + protected: bool loadImpl(const Ice::Identity&, ObjectRecord&); @@ -79,6 +80,7 @@ private: Ice::CommunicatorPtr _communicator; Ice::EncodingVersion _encoding; Ice::ObjectPtr _sampleServant; + bool _keepStats; }; @@ -156,6 +158,12 @@ ObjectStoreBase::facet() const return _facet; } +inline bool +ObjectStoreBase::keepStats() const +{ + return _keepStats; +} + inline const Ice::ObjectPtr& ObjectStoreBase::sampleServant() const { diff --git a/cpp/src/Freeze/TransactionalEvictorContext.cpp b/cpp/src/Freeze/TransactionalEvictorContext.cpp index e7c12e6a6b0..298019aed26 100644 --- a/cpp/src/Freeze/TransactionalEvictorContext.cpp +++ b/cpp/src/Freeze/TransactionalEvictorContext.cpp @@ -275,7 +275,7 @@ Freeze::TransactionalEvictorContext::ServantHolder::~ServantHolder() { if(!_body.readOnly && !_body.removed) { - if(_body.store->encoding() == Ice::Encoding_1_0) + if(_body.store->keepStats()) { EvictorIBase::updateStats(_body.rec.stats, IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds()); diff --git a/cpp/src/Freeze/TransactionalEvictorI.cpp b/cpp/src/Freeze/TransactionalEvictorI.cpp index 40ec9191450..dfca69dee6a 100644 --- a/cpp/src/Freeze/TransactionalEvictorI.cpp +++ b/cpp/src/Freeze/TransactionalEvictorI.cpp @@ -139,27 +139,26 @@ Freeze::TransactionalEvictorI::addFacet(const ObjectPtr& servant, const Identity checkIdentity(ident); DeactivateController::Guard deactivateGuard(_deactivateController); + ObjectStore<TransactionalEvictorElement>* store = findStore(facet, _createDb); + if(store == 0) + { + throw NotFoundException(__FILE__, __LINE__, "addFacet: could not open database for facet '" + + facet + "'"); + } + Ice::Long currentTime = 0; - if(_encoding == Ice::Encoding_1_0) + if(store->keepStats()) { currentTime = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); } Statistics stats = { currentTime }; ObjectRecord rec = { servant, stats }; - - ObjectStore<TransactionalEvictorElement>* store = findStore(facet, _createDb); - - if(store == 0) - { - throw NotFoundException(__FILE__, __LINE__, "addFacet: could not open database for facet '" - + facet + "'"); - } - + TransactionIPtr tx = beforeQuery(); - if(_encoding == Ice::Encoding_1_0) + if(store->keepStats()) { updateStats(rec.stats, currentTime); } diff --git a/cpp/src/FreezeScript/DumpDB.cpp b/cpp/src/FreezeScript/DumpDB.cpp index 955cbcf66af..b2da041ec3d 100755 --- a/cpp/src/FreezeScript/DumpDB.cpp +++ b/cpp/src/FreezeScript/DumpDB.cpp @@ -106,7 +106,6 @@ 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" ; } @@ -159,7 +158,6 @@ 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 @@ -173,8 +171,6 @@ 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 @@ -193,9 +189,6 @@ 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")) @@ -321,17 +314,7 @@ 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) { usage(appName); @@ -374,15 +357,16 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator if(inputFile.empty()) { const string evictorKeyTypeName = "::Ice::Identity"; - const string evictorValueTypeName = (encoding == Ice::Encoding_1_0) ? "::Freeze::ObjectRecord" : "Object"; + const string oldEvictorValueTypeName = "::Freeze::ObjectRecord"; + const string newEvictorValueTypeName = "Object"; - if((!keyTypeName.empty() && valueTypeName.empty()) || (keyTypeName.empty() && !valueTypeName.empty())) + if((!keyTypeName.empty() && valueTypeName.empty()) || (keyTypeName.empty() && !valueTypeName.empty() && !evictor)) { cerr << appName << ": a key type and a value type must be specified" << endl; usage(appName); return EXIT_FAILURE; } - else if(!evictor && keyTypeName.empty() && valueTypeName.empty()) + else if(valueTypeName.empty()) { try { @@ -404,24 +388,32 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator { evictor = true; } - else - { - keyTypeName = p->second.key; - valueTypeName = p->second.value; - } + keyTypeName = p->second.key; + valueTypeName = p->second.value; + + if(evictor && valueTypeName.empty()) + { + valueTypeName = oldEvictorValueTypeName; + } } } catch(const FreezeScript::FailureException& ex) { - cerr << appName << ": " << ex.reason() << endl; - return EXIT_FAILURE; + cerr << appName << ": " << ex.reason() << endl; + return EXIT_FAILURE; } } if(evictor) { - keyTypeName = evictorKeyTypeName; - valueTypeName = evictorValueTypeName; + if(keyTypeName.empty()) + { + keyTypeName = evictorKeyTypeName; + } + if(valueTypeName.empty()) + { + valueTypeName = newEvictorValueTypeName; + } } Slice::TypePtr keyType, valueType; @@ -553,7 +545,7 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator dbValue.set_flags(DB_DBT_USERMEM | DB_DBT_PARTIAL); Dbc* dbc = 0; - db.cursor(0, &dbc, 0); + db.cursor(txn, &dbc, 0); while(dbc->get(&dbKey, &dbValue, DB_NEXT) == 0) { diff --git a/cpp/src/FreezeScript/transformdb.cpp b/cpp/src/FreezeScript/transformdb.cpp index b9f6e9774ef..24bfdd71d1e 100755 --- a/cpp/src/FreezeScript/transformdb.cpp +++ b/cpp/src/FreezeScript/transformdb.cpp @@ -83,10 +83,8 @@ 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" + "--encoding VERSION Set the Ice encoding version for the new database\n" + " environment.\n" "-f FILE Execute the transformation descriptors in the file FILE.\n" ; } @@ -236,7 +234,6 @@ 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; @@ -440,38 +437,17 @@ 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(","); + newEncoding = Ice::stringToEncodingVersion(opts.optArg("encoding")); - if(pos == 0 || pos == encodingList.size()) + if(!IceInternal::isSupported(newEncoding, Ice::currentEncoding)) { 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); @@ -530,8 +506,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 oldEvictorValueTypeName = (oldEncoding == Ice::Encoding_1_0) ? "::Freeze::ObjectRecord" : "Object"; - const string newEvictorValueTypeName = (newEncoding == Ice::Encoding_1_0) ? "::Freeze::ObjectRecord" : "Object"; + const string oldEvictorValueName = "::Freeze::ObjectRecord"; + const string newEvictorValueName = "Object"; if(allDb) { @@ -544,8 +520,17 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator if(p->second.evictor) { - keyName = evictorKeyName; - valueName = oldEvictorValueTypeName; + keyName = p->second.key; + valueName = p->second.value; + + if(keyName.empty()) + { + keyName = evictorKeyName; + } + if(valueName.empty()) + { + valueName = oldEvictorValueName; + } } else { @@ -578,7 +563,10 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator Slice::TypePtr newValueType; if(p->second.evictor) { - newValueType = findType(newUnit, newEvictorValueTypeName); + // + // The new evictor does not keep stats + // + newValueType = findType(newUnit, newEvictorValueName); } else { @@ -604,47 +592,44 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator { return EXIT_FAILURE; } - + analyzer.addDatabase(p->first, oldKeyType, newKeyType, oldValueType, newValueType); } } else { string oldKeyName, newKeyName, oldValueName, newValueName; - - if(evictor) - { - oldKeyName = newKeyName = evictorKeyName; - oldValueName = oldEvictorValueTypeName; - newValueName = newEvictorValueTypeName; - } - else - { - string::size_type pos; - - if(keyTypeNames.empty() || valueTypeNames.empty()) - { - usage(appName); - return EXIT_FAILURE; - } - - pos = keyTypeNames.find(','); - if(pos == 0 || pos == keyTypeNames.size()) - { - usage(appName); - return EXIT_FAILURE; - } - if(pos == string::npos) - { - oldKeyName = keyTypeNames; - newKeyName = keyTypeNames; - } + + string::size_type pos; + + if(!evictor && (keyTypeNames.empty() || valueTypeNames.empty())) + { + usage(appName); + return EXIT_FAILURE; + } + + if(!keyTypeNames.empty()) + { + pos = keyTypeNames.find(','); + if(pos == 0 || pos == keyTypeNames.size()) + { + usage(appName); + return EXIT_FAILURE; + } + if(pos == string::npos) + { + oldKeyName = keyTypeNames; + newKeyName = keyTypeNames; + } else { oldKeyName = keyTypeNames.substr(0, pos); newKeyName = keyTypeNames.substr(pos + 1); } + } + if(!valueTypeNames.empty()) + { pos = valueTypeNames.find(','); if(pos == 0 || pos == valueTypeNames.size()) { @@ -662,6 +647,26 @@ run(const Ice::StringSeq& originalArgs, const Ice::CommunicatorPtr& communicator newValueName = valueTypeNames.substr(pos + 1); } } + + if(evictor) + { + if(oldKeyName.empty()) + { + oldKeyName = evictorKeyName; + } + if(newKeyName.empty()) + { + newKeyName = evictorKeyName; + } + if(oldValueName.empty()) + { + oldValueName = newEvictorValueName; + } + if(newValueName.empty()) + { + newValueName = newEvictorValueName; + } + } // // Look up the key and value types in the old and new Slice definitions. |