diff options
Diffstat (limited to 'cpp/src')
-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. |