diff --git a/objectstore/Helpers.cpp b/objectstore/Helpers.cpp index d037106d13831eef6b25231265ba4256480fed18..eebcd25da40e45d6b6b44838dc8f1a0b5df08866 100644 --- a/objectstore/Helpers.cpp +++ b/objectstore/Helpers.cpp @@ -396,11 +396,12 @@ void Helpers::getLockedAndFetchedDriveState(DriveState& driveState, ScopedExclus RootEntry re(be); re.fetchNoLock(); DriveRegister dr(re.getDriveRegisterAddress(), be); - dr.fetch(); + dr.fetchNoLock(); driveState.setAddress(dr.getDriveAddress(driveName)); driveStateLock.lock(driveState); driveState.fetch(); if (driveState.getOwner() != dr.getAddressIfSet()) { + std::string previouslySeenOwner=driveState.getOwner(); // We have a special case: the drive state is not owned by the // drive register. // As we are lock free, we will re-lock in proper order. @@ -408,12 +409,20 @@ void Helpers::getLockedAndFetchedDriveState(DriveState& driveState, ScopedExclus ScopedExclusiveLock drl(dr); dr.fetch(); // Re-get the state (could have changed). + driveState.resetAddress(); driveState.setAddress(dr.getDriveAddress(driveName)); driveStateLock.lock(driveState); + driveState.fetch(); // We have an exclusive lock on everything. We can now // safely switch the owner of the drive status to the drive register // (there is no other steady state ownership). // return all as we are done. + log::ScopedParamContainer params (lc); + params.add("driveRegisterObject", dr.getAddressIfSet()) + .add("driveStateObject", driveState.getAddressIfSet()) + .add("driveStateCurrentOwner", driveState.getOwner()) + .add("driveStatePreviouslySeenOwner", previouslySeenOwner); + lc.log(log::WARNING, "In Helpers::getLockedAndFetchedDriveState(): unexpected owner for driveState (should be register, will fix it)."); if (driveState.getOwner() != dr.getAddressIfSet()) { driveState.setOwner(dr.getAddressIfSet()); driveState.commit(); @@ -457,12 +466,15 @@ void Helpers::getLockedAndFetchedDriveState(DriveState& driveState, ScopedExclus driveState.setAddress(agentReference.nextId(std::string ("DriveStatus-")+driveName)); driveState.initialize(driveName); agentReference.addToOwnership(driveState.getAddressIfSet(), be); + driveState.setOwner(agentReference.getAgentAddress()); driveState.insert(); dr.setDriveAddress(driveName, driveState.getAddressIfSet()); dr.commit(); - agentReference.removeFromOwnership(driveState.getAddressIfSet(), be); driveStateLock.lock(driveState); driveState.fetch(); + driveState.setOwner(dr.getAddressIfSet()); + driveState.commit(); + agentReference.removeFromOwnership(driveState.getAddressIfSet(), be); return; } } diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp index f8209895589e7a9f0707da04042959873514aada..34b385bb298def8e9a370dbaad3f0021410f1990 100644 --- a/scheduler/OStoreDB/OStoreDB.cpp +++ b/scheduler/OStoreDB/OStoreDB.cpp @@ -1183,26 +1183,26 @@ void OStoreDB::updateDriveStatistics(const common::dataStructures::DriveInfo& dr lc, Helpers::CreateIfNeeded::doNotCreate); } catch (cta::exception::Exception & ex) { // The drive is missing in the registry. Nothing to update - return; + return; } driveState = ds.getState(); // Set the parameters that we always set driveState.host = driveInfo.host; driveState.logicalLibrary = driveInfo.logicalLibrary; - + switch (driveState.driveStatus) { case DriveStatus::Transferring: - { + { const time_t timeDifference = inputs.reportTime - driveState.lastUpdateTime; const uint64_t bytesDifference = inputs.bytesTransferred - driveState.bytesTransferredInSession; driveState.lastUpdateTime=inputs.reportTime; driveState.bytesTransferredInSession=inputs.bytesTransferred; driveState.filesTransferredInSession=inputs.filesTransferred; driveState.latestBandwidth = timeDifference?1.0*bytesDifference/timeDifference:0.0; - } - break; + break; + } default: - return ; + return; } ds.setState(driveState); ds.commit(); @@ -2823,4 +2823,3 @@ void OStoreDB::RetrieveJob::checkSucceed() { } // namespace cta -