Salome HOME
[EDF29576] : Monitoring of directories option
authorAnthony Geay <anthony.geay@edf.fr>
Fri, 1 Mar 2024 09:03:08 +0000 (10:03 +0100)
committerAnthony Geay <anthony.geay@edf.fr>
Fri, 1 Mar 2024 09:03:08 +0000 (10:03 +0100)
src/yacsloader/driver
src/yacsloader/driver_internal.py

index cbd85b922398a19da8b50cdb48f232a62a74dbb3..f0c9d0ea8e1af0f50a68f979381ea53577ad7846 100644 (file)
@@ -57,5 +57,5 @@ if __name__ == "__main__":
   proc.communicate()
   del ior_file
   code = proc.returncode
-  if proc != 0:
+  if code != 0:
     raise RuntimeError(f"Subprocess finished with a non zero status ({code}). Command returning non zero status was : {cmd}")
index 6a30cec23b18abe8905cb3dd3228d12b38e80943..21b978e2c436e6283963350e3d0ec7b074465f73 100644 (file)
@@ -40,6 +40,9 @@ HTOPFileEntryInCMD = "--htop-of-yacs-engine-process-file"
 HTOPServerFileEntryInCMD = "--htop-of-servers"
 HTOPFileTimeResEntryInCMD = "--htop-of-yacs-engine-process-time-res"
 HTOPServerFileTimeResEntryInCMD = "--htop-of-servers-time-res"
+MonitoringDirsEntryInCMD = "--monitoring-dirs-content"
+MonitoringDirsResEntryInCMD = "--monitoring-dirs-content-res"
+MonitoringDirsTimeResEntryInCMD = "--monitoring-dirs-content-time-res"
 
 DisplayKeyInARGS = "display"
 VerboseKeyInARGS = "verbose"
@@ -60,6 +63,9 @@ HTOPFileKeyInARGS = "htop_of_yacs_engine_process_file"
 HTOPServerFileKeyInARGS = "htop_of_servers"
 HTOPFileTimeResKeyInARGS = "htop_of_yacs_engine_process_time_res"
 HTOPServerFileTimeResKeyInARGS = "htop_of_servers_time_res"
+MonitoringDirsInARGS = "monitoring_dirs_content"
+MonitoringDirsResInARGS = "monitoring_dirs_content_res"
+MonitoringDirsTimeResInARGS = "monitoring_dirs_content_time_res"
 
 KeyValnARGS = [(DisplayEntryInCMD,DisplayKeyInARGS),
                (VerboseEntryInCMD,VerboseKeyInARGS),
@@ -79,6 +85,9 @@ KeyValnARGS = [(DisplayEntryInCMD,DisplayKeyInARGS),
                (HTOPFileTimeResEntryInCMD,HTOPFileTimeResKeyInARGS),
                (HTOPServerFileEntryInCMD,HTOPServerFileKeyInARGS),
                (HTOPServerFileTimeResEntryInCMD,HTOPServerFileTimeResKeyInARGS),
+               (MonitoringDirsEntryInCMD,MonitoringDirsInARGS),
+               (MonitoringDirsResEntryInCMD,MonitoringDirsResInARGS),
+               (MonitoringDirsTimeResEntryInCMD,MonitoringDirsTimeResInARGS),
                (IOREntryInCMD,IORKeyInARGS)]
 
 my_runtime_yacs = None
@@ -200,7 +209,7 @@ def prepareExecution(proc, isStop, dumpErrorFile):
 @SALOMEInitializationNeeded
 def executeGraph( executor, xmlfilename, proc, dump, finalDump, display, CPUMemContainerTimeRes,
                  HTopOfThisProcessFile, HTopTimeRes,
-                 HTopOfAllServersFile, HTopOfAllServersTimeRes):
+                 HTopOfAllServersFile, HTopOfAllServersTimeRes, DirectoriesToMonitor):
   """
   Args:
   -----
@@ -221,16 +230,23 @@ def executeGraph( executor, xmlfilename, proc, dump, finalDump, display, CPUMemC
   dump_thread = None
   import pilot
   import os
+  import contextlib
+  
+  def MonitoringDirectories( DirectoriesToMonitor ):
+    import SALOME_PyNode
+    if len( DirectoriesToMonitor ) > 0:
+      return [ SALOME_PyNode.GenericPythonMonitoringLauncherCtxMgr( SALOME_PyNode.FileSystemMonitoring(timeRes*1000,zeDir,zeDirRes) ) for zeDir,zeDirRes,timeRes in DirectoriesToMonitor ]
+    else:
+      return [ contextlib.nullcontext() ]
 
   def MonitoringThisProcess(HTopOfThisProcessFile,HTopTimeRes):
     import SALOME_PyNode
-    import contextlib
     if HTopOfThisProcessFile:
       return SALOME_PyNode.GenericPythonMonitoringLauncherCtxMgr( SALOME_PyNode.CPUMemoryMonitoring(1000*HTopTimeRes,HTopOfThisProcessFile) )
     else:
       return contextlib.nullcontext()
+    
   def MonitoringAllKernelServers(HTopOfAllServersFile, HTopOfAllServersTimeRes):
-    import contextlib
     if HTopOfAllServersFile:
       return salome.LogManagerLaunchMonitoringFileCtxMgr( 1000*HTopOfAllServersTimeRes, HTopOfAllServersFile )
     else:
@@ -244,9 +260,11 @@ def executeGraph( executor, xmlfilename, proc, dump, finalDump, display, CPUMemC
   #
   salome.cm.SetDeltaTimeBetweenCPUMemMeasureInMilliSecond( 1000*CPUMemContainerTimeRes )
   #
-  with MonitoringThisProcess(HTopOfThisProcessFile, HTopTimeRes) as monitoringParamsMaster:
-    with MonitoringAllKernelServers(HTopOfAllServersFile, HTopOfAllServersTimeRes) as monitoringParams:
-      executor.RunPy(proc,display,isPyThread=True,fromscratch=True) # same as RunW but releasing GIL
+  ctxManagers = MonitoringDirectories( DirectoriesToMonitor ) + [ MonitoringThisProcess(HTopOfThisProcessFile, HTopTimeRes) ] + [ MonitoringAllKernelServers(HTopOfAllServersFile, HTopOfAllServersTimeRes) ]
+  with contextlib.ExitStack() as stack:
+    for mgr in ctxManagers:
+        stack.enter_context(mgr)
+        executor.RunPy(proc,display,isPyThread=True,fromscratch=True) # same as RunW but releasing GIL
   if proc.getEffectiveState() != pilot.DONE:
     raise RuntimeError( proc.getErrorReport() )
   #
@@ -316,6 +334,9 @@ def getArgumentParser():
   parser.add_argument(HTOPFileTimeResEntryInCMD, dest = HTOPFileTimeResKeyInARGS, type=int, default = 60, help="Time in second between between two measures of CPU/Mem of current process")
   parser.add_argument(HTOPServerFileEntryInCMD, dest = HTOPServerFileKeyInARGS, type=str, default ="", help="File name (if not empty) containing the result of measure of all server processes")
   parser.add_argument(HTOPServerFileTimeResEntryInCMD, dest = HTOPServerFileTimeResKeyInARGS, type=int, default = 30, help="Time in second between between two measures of CPU/Mem of any server process")
+  parser.add_argument(MonitoringDirsEntryInCMD, dest = MonitoringDirsInARGS, nargs='+', type=str, default =[], help="List of directories to be monitored")
+  parser.add_argument(MonitoringDirsResEntryInCMD, dest = MonitoringDirsResInARGS, nargs='+', type=str, default =[], help=f"List of files with result of monitoring of directories to be monitored (see {MonitoringDirsInARGS}). The size of lists are expected to be the same.")
+  parser.add_argument(MonitoringDirsTimeResEntryInCMD, dest = MonitoringDirsTimeResInARGS, nargs='+', type=int, default =[], help=f"List of time resolution (in second) of monitoring of directories to be monitored (see {MonitoringDirsInARGS}). The size of lists are expected to be the same.")
   parser.add_argument(IOREntryInCMD, dest = IORKeyInARGS, type=str, default ="", help="file inside which the ior of NS will be stored")
   parser.add_argument("--options_from_json", dest = "options_from_json", type=str, default ="", help="Json file of options. If defined options in json will override those specified in command line.")
   return parser
@@ -348,7 +369,7 @@ def mainRun( args, iorNS, xmlFileName):
   #
   executeGraph( executor, xmlFileName, proc, args[DumpKeyInARGS], args[DumpStateKeyInARGS], args[DisplayKeyInARGS], args[CPUTimeResOfContainerKeyInARGS],
                args[HTOPFileKeyInARGS], args[HTOPFileTimeResKeyInARGS],
-               args[HTOPServerFileKeyInARGS], args[HTOPServerFileTimeResKeyInARGS])
+               args[HTOPServerFileKeyInARGS], args[HTOPServerFileTimeResKeyInARGS], [(dirToMonitor,resFile,timeRes) for dirToMonitor,resFile,timeRes in zip(args[MonitoringDirsInARGS],args[MonitoringDirsResInARGS],args[MonitoringDirsTimeResInARGS])] )
   #
   destroyElementsGeneratedByExecutionOfGraph( proc, args[ShutdownKeyInARGS] )