From 5cccf15b18522b94ed1bb832e27cd556eadccde8 Mon Sep 17 00:00:00 2001 From: mattijs <mattijs> Date: Mon, 29 Nov 2010 15:40:54 +0000 Subject: [PATCH] BUG: fileMonitor : parallel syncing --- src/OSspecific/POSIX/fileMonitor.C | 70 +++++++++++------------ src/OSspecific/POSIX/fileMonitor.H | 9 ++- src/OpenFOAM/db/regIOobject/regIOobject.C | 1 - src/OpenFOAM/global/argList/argList.C | 11 ++++ 4 files changed, 52 insertions(+), 39 deletions(-) diff --git a/src/OSspecific/POSIX/fileMonitor.C b/src/OSspecific/POSIX/fileMonitor.C index 069ef6de934..318262d9d76 100644 --- a/src/OSspecific/POSIX/fileMonitor.C +++ b/src/OSspecific/POSIX/fileMonitor.C @@ -319,7 +319,7 @@ void Foam::fileMonitor::checkFiles() const if (ready < 0) { - FatalErrorIn("fileMonitor::updateStates()") + FatalErrorIn("fileMonitor::checkFiles()") << "Problem in issuing select." << abort(FatalError); } @@ -335,7 +335,7 @@ void Foam::fileMonitor::checkFiles() const if (nBytes < 0) { - FatalErrorIn("fileMonitor::updateStates(const fileName&)") + FatalErrorIn("fileMonitor::checkFiles()") << "read of " << watcher_->inotifyFd_ << " failed with " << label(nBytes) << abort(FatalError); @@ -374,7 +374,7 @@ void Foam::fileMonitor::checkFiles() const ) { // Correct directory and name - state_[i] = MODIFIED; + localState_[i] = MODIFIED; } } } @@ -403,18 +403,17 @@ void Foam::fileMonitor::checkFiles() const if (newTime == 0) { - state_[watchFd] = DELETED; + localState_[watchFd] = DELETED; } else { if (newTime > (oldTime + regIOobject::fileModificationSkew)) { - watcher_->lastMod_[watchFd] = newTime; - state_[watchFd] = MODIFIED; + localState_[watchFd] = MODIFIED; } else { - state_[watchFd] = UNMODIFIED; + localState_[watchFd] = UNMODIFIED; } } } @@ -422,12 +421,14 @@ void Foam::fileMonitor::checkFiles() const } } + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::fileMonitor::fileMonitor(const bool useInotify) : useInotify_(useInotify), + localState_(20), state_(20), watchFile_(20), freeWatchFds_(2), @@ -476,6 +477,7 @@ Foam::label Foam::fileMonitor::addWatch(const fileName& fName) } else { + localState_(watchFd) = UNMODIFIED; state_(watchFd) = UNMODIFIED; watchFile_(watchFd) = fName; } @@ -517,30 +519,26 @@ void Foam::fileMonitor::updateStates { if (Pstream::master() || !masterOnly) { + // Update the localState_ checkFiles(); } if (syncPar) { - // Pack current state (might be on master only) + // Pack local state (might be on master only) PackedList<2> stats(state_.size(), MODIFIED); if (Pstream::master() || !masterOnly) { forAll(state_, watchFd) { - stats[watchFd] = static_cast<unsigned int>(state_[watchFd]); + stats[watchFd] = static_cast<unsigned int> + ( + localState_[watchFd] + ); } } - // Save local state for warning message below - PackedList<2> thisProcStats; - if (!masterOnly) - { - thisProcStats = stats; - } - - // Scatter or reduce to synchronise state if (masterOnly) { @@ -573,33 +571,34 @@ void Foam::fileMonitor::updateStates } - // Update local state + // Update synchronised state forAll(state_, watchFd) { - if (masterOnly) - { - // No need to check for inconsistent state. Just assign. - unsigned int stat = stats[watchFd]; - state_[watchFd] = fileState(stat); - } - else + // Assign synchronised state + unsigned int stat = stats[watchFd]; + state_[watchFd] = fileState(stat); + + if (!masterOnly) { - // Check for inconsistent state before assigning. - if (thisProcStats[watchFd] != UNMODIFIED) + // Give warning for inconsistent state + if (state_[watchFd] != localState_[watchFd]) { - if (stats[watchFd] == UNMODIFIED) + if (debug) { - WarningIn("fileMonitor::updateStates(const bool) const") - << "Delaying reading " << watchFile_[watchFd] + Pout<< "fileMonitor : Delaying reading " + << watchFile_[watchFd] << " due to inconsistent " "file time-stamps between processors" << endl; } - else - { - unsigned int stat = stats[watchFd]; - state_[watchFd] = fileState(stat); - } + + WarningIn + ( + "fileMonitor::updateStates" + "(const bool, const bool) const" + ) << "Delaying reading " << watchFile_[watchFd] + << " due to inconsistent " + "file time-stamps between processors" << endl; } } } @@ -610,6 +609,7 @@ void Foam::fileMonitor::updateStates void Foam::fileMonitor::setUnmodified(const label watchFd) { state_[watchFd] = UNMODIFIED; + localState_[watchFd] = UNMODIFIED; if (!useInotify_) { diff --git a/src/OSspecific/POSIX/fileMonitor.H b/src/OSspecific/POSIX/fileMonitor.H index d19c3b0e90f..bdb0dd2bb2f 100644 --- a/src/OSspecific/POSIX/fileMonitor.H +++ b/src/OSspecific/POSIX/fileMonitor.H @@ -71,7 +71,7 @@ public: { UNMODIFIED = 0, MODIFIED = 1, - DELETED = 2, + DELETED = 2 }; static const NamedEnum<fileState, 3> fileStateNames_; @@ -82,7 +82,10 @@ private: //- Whether to use inotify (requires -DFOAM_USE_INOTIFY, see above) const bool useInotify_; - //- State for all watchFds + //- State for all watchFds based on local files + mutable DynamicList<fileState> localState_; + + //- State for all watchFds - synchronised mutable DynamicList<fileState> state_; //- Filename for all watchFds @@ -97,7 +100,7 @@ private: // Private Member Functions - //- Update state_ from any events. + //- Update localState_ from any events. void checkFiles() const; //- Disallow default bitwise copy construct diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.C b/src/OpenFOAM/db/regIOobject/regIOobject.C index 2367d79c60d..f43cb4f44ef 100644 --- a/src/OpenFOAM/db/regIOobject/regIOobject.C +++ b/src/OpenFOAM/db/regIOobject/regIOobject.C @@ -60,7 +60,6 @@ Foam::regIOobject::fileCheckTypes Foam::regIOobject::fileModificationChecking debug::optimisationSwitches().lookup ( "fileModificationChecking" - //Foam::regIOobject::timeStamp ) ) ); diff --git a/src/OpenFOAM/global/argList/argList.C b/src/OpenFOAM/global/argList/argList.C index d1ee0a63f75..ee623a30bbe 100644 --- a/src/OpenFOAM/global/argList/argList.C +++ b/src/OpenFOAM/global/argList/argList.C @@ -31,6 +31,7 @@ License #include "IOobject.H" #include "JobInfo.H" #include "labelList.H" +#include "regIOobject.H" #include <cctype> @@ -767,6 +768,16 @@ Foam::argList::argList sigQuit_.set(bannerEnabled); sigSegv_.set(bannerEnabled); + if (bannerEnabled) + { + Info<< "Monitoring run-time modified files using " + << regIOobject::fileCheckTypesNames + [ + regIOobject::fileModificationChecking + ] + << endl; + } + if (Pstream::master() && bannerEnabled) { Info<< endl; -- GitLab