diff --git a/etc/controlDict b/etc/controlDict index 5be9a1166468ae191aa9e67e01f47c4351a359a2..02bdf85dbd4c5257794ab8006fda7a93474b1802 100644 --- a/etc/controlDict +++ b/etc/controlDict @@ -82,6 +82,10 @@ OptimisationSwitches // updated. Set to 0 on distributed case. fileModificationSkew 10; + // How often retest (using above fileModificationSkew) before giving up. + // Default is 1. + //maxFileModificationPolls 100; + //- Modification checking: // - timeStamp : use modification time on file // - inotify : use inotify framework diff --git a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C index bc9c22c355d596463f916da4173534886337e345..72a1f92778f3851d0c946ea32caf3f07c5ec7314 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C +++ b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C @@ -222,44 +222,77 @@ Foam::functionEntries::codeStream::getFunction off_t masterSize = mySize; Pstream::scatter(masterSize); - DebugPout - << nl << "on processor " << Pstream::myProcNo() - << " have masterSize:" << masterSize - << " and localSize:" << mySize << endl; - - if (mySize < masterSize) + for + ( + label iter = 0; + iter < regIOobject::maxFileModificationPolls; + iter++ + ) { DebugPout - << "Local file " << libPath - << " not of same size (" << mySize - << ") as master (" - << masterSize << "). Waiting for " - << regIOobject::fileModificationSkew - << " seconds." << endl; - - Foam::sleep(regIOobject::fileModificationSkew); + << "on processor " << Pstream::myProcNo() + << "masterSize:" << masterSize + << " and localSize:" << mySize + << endl; - // Recheck local size - mySize = Foam::fileSize(libPath); - - if (mySize < masterSize) + if (mySize == masterSize) { - FatalIOErrorInFunction(parentDict) - << "Cannot read (NFS mounted) library " << nl - << libPath << nl + break; + } + else if (mySize > masterSize) + { + FatalIOErrorInFunction(context.dict()) + << "Excessive size when reading (NFS mounted) library " + << nl << libPath << nl << "on processor " << Pstream::myProcNo() << " detected size " << mySize << " whereas master size is " << masterSize << " bytes." << nl - << "If your case is not NFS mounted" + << "If your case is NFS mounted increase" + << " fileModificationSkew or maxFileModificationPolls;" + << nl << "If your case is not NFS mounted" << " (so distributed) set fileModificationSkew" << " to 0" << exit(FatalIOError); } + else + { + DebugPout + << "Local file " << libPath + << " not of same size (" << mySize + << ") as master (" + << masterSize << "). Waiting for " + << regIOobject::fileModificationSkew + << " seconds." << endl; + + Foam::sleep(regIOobject::fileModificationSkew); + + // Recheck local size + mySize = Foam::fileSize(libPath); + } + } + + + // Finished doing iterations. Do final check + if (mySize != masterSize) + { + FatalIOErrorInFunction(context.dict()) + << "Cannot read (NFS mounted) library " << nl + << libPath << nl + << "on processor " << Pstream::myProcNo() + << " detected size " << mySize + << " whereas master size is " << masterSize + << " bytes." << nl + << "If your case is NFS mounted increase" + << " fileModificationSkew or maxFileModificationPolls;" + << nl << "If your case is not NFS mounted" + << " (so distributed) set fileModificationSkew" + << " to 0" + << exit(FatalIOError); } DebugPout - << nl << "on processor " << Pstream::myProcNo() + << "on processor " << Pstream::myProcNo() << " after waiting: have masterSize:" << masterSize << " and localSize:" << mySize << endl; } diff --git a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C index 2be000110e952b29b52c1b3d63ccc5b409f037ba..37731c909acc9ca3683bfc66d63c8a08c69e4bb0 100644 --- a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C +++ b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C @@ -250,54 +250,79 @@ void Foam::codedBase::createLibrary off_t masterSize = mySize; Pstream::scatter(masterSize); - if (debug) + for + ( + label iter = 0; + iter < regIOobject::maxFileModificationPolls; + iter++ + ) { - Pout<< endl<< "on processor " << Pstream::myProcNo() + DebugPout + << "on processor " << Pstream::myProcNo() << " have masterSize:" << masterSize << " and localSize:" << mySize << endl; - } - - if (mySize < masterSize) - { - if (debug) + if (mySize == masterSize) { - Pout<< "Local file " << libPath - << " not of same size (" << mySize - << ") as master (" - << masterSize << "). Waiting for " - << regIOobject::fileModificationSkew - << " seconds." << endl; + break; } - Foam::sleep(regIOobject::fileModificationSkew); - - // Recheck local size - mySize = Foam::fileSize(libPath); - - if (mySize < masterSize) + else if (mySize > masterSize) { FatalIOErrorInFunction(context.dict()) - << "Cannot read (NFS mounted) library " << nl - << libPath << nl + << "Excessive size when reading (NFS mounted) library " + << nl << libPath << nl << "on processor " << Pstream::myProcNo() << " detected size " << mySize << " whereas master size is " << masterSize << " bytes." << nl - << "If your case is not NFS mounted" + << "If your case is NFS mounted increase" + << " fileModificationSkew or maxFileModificationPolls;" + << nl << "If your case is not NFS mounted" << " (so distributed) set fileModificationSkew" << " to 0" << exit(FatalIOError); } + else + { + DebugPout + << "Local file " << libPath + << " not of same size (" << mySize + << ") as master (" + << masterSize << "). Waiting for " + << regIOobject::fileModificationSkew + << " seconds." << endl; + + Foam::sleep(regIOobject::fileModificationSkew); + + // Recheck local size + mySize = Foam::fileSize(libPath); + } } - if (debug) + + // Finished doing iterations. Do final check + if (mySize != masterSize) { - Pout<< endl<< "on processor " << Pstream::myProcNo() - << " after waiting: have masterSize:" << masterSize - << " and localSize:" << mySize - << endl; + FatalIOErrorInFunction(context.dict()) + << "Cannot read (NFS mounted) library " << nl + << libPath << nl + << "on processor " << Pstream::myProcNo() + << " detected size " << mySize + << " whereas master size is " << masterSize + << " bytes." << nl + << "If your case is NFS mounted increase" + << " fileModificationSkew or maxFileModificationPolls;" + << nl << "If your case is not NFS mounted" + << " (so distributed) set fileModificationSkew" + << " to 0" + << exit(FatalIOError); } + + DebugPout + << "on processor " << Pstream::myProcNo() + << " after waiting: have masterSize:" << masterSize + << " and localSize:" << mySize << endl; } reduce(create, orOp<bool>()); } diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.C b/src/OpenFOAM/db/regIOobject/regIOobject.C index 3fe337f1b6506a9cba3546c2a3f85b21e7309f0f..eb938a6605be4218cde5711ea18157de9415a1a4 100644 --- a/src/OpenFOAM/db/regIOobject/regIOobject.C +++ b/src/OpenFOAM/db/regIOobject/regIOobject.C @@ -50,6 +50,17 @@ registerOptSwitch Foam::regIOobject::fileModificationSkew ); +int Foam::regIOobject::maxFileModificationPolls +( + Foam::debug::optimisationSwitch("maxFileModificationPolls", 1) +); +registerOptSwitch +( + "maxFileModificationPolls", + int, + Foam::regIOobject::maxFileModificationPolls +); + bool Foam::regIOobject::masterOnlyReading = false; diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.H b/src/OpenFOAM/db/regIOobject/regIOobject.H index 0f9ae1196c6c608f67f16932b051271d2b595c8b..e990fa7ab67d6730ccacd7e80bdd84a941d3ff4e 100644 --- a/src/OpenFOAM/db/regIOobject/regIOobject.H +++ b/src/OpenFOAM/db/regIOobject/regIOobject.H @@ -131,6 +131,8 @@ public: static float fileModificationSkew; + static int maxFileModificationPolls; + // Constructors diff --git a/src/OpenFOAM/global/argList/argList.C b/src/OpenFOAM/global/argList/argList.C index 99d2f04e2eee50021331aa0b69f3879ffc5e03f9..01f1bddc5e7c0eee9aafdec6253cd83cbe8a3f28 100644 --- a/src/OpenFOAM/global/argList/argList.C +++ b/src/OpenFOAM/global/argList/argList.C @@ -1501,8 +1501,27 @@ void Foam::argList::parse ) ) { - Info<< " (fileModificationSkew " - << regIOobject::fileModificationSkew << ")"; + if (regIOobject::maxFileModificationPolls == 1) + { + Info<< " (fileModificationSkew " + << regIOobject::fileModificationSkew + << ")"; + } + else if (regIOobject::maxFileModificationPolls > 1) + { + Info<< " (fileModificationSkew " + << regIOobject::fileModificationSkew + << ", maxFileModificationPolls " + << regIOobject::maxFileModificationPolls + << ")"; + } + else + { + FatalErrorInFunction + << "Invalid setting for maxFileModificationPolls " + << regIOobject::maxFileModificationPolls + << exit(FatalError); + } } Info<< nl;