Added logic to restart when job in task queue

This commit is contained in:
David Maisonave
2024-08-06 14:50:26 -04:00
parent 1fd252522d
commit 83fd90bfcd
5 changed files with 50 additions and 10 deletions

View File

@@ -102,7 +102,7 @@ class StashPluginHelper:
if stash_url and len(stash_url): self.STASH_URL = stash_url if stash_url and len(stash_url): self.STASH_URL = stash_url
self.MAIN_SCRIPT_NAME = mainScriptName if mainScriptName != "" else __main__.__file__ self.MAIN_SCRIPT_NAME = mainScriptName if mainScriptName != "" else __main__.__file__
self.PLUGIN_ID = pluginID if pluginID != "" else pathlib.Path(self.MAIN_SCRIPT_NAME).stem.lower() self.PLUGIN_ID = pluginID if pluginID != "" else pathlib.Path(self.MAIN_SCRIPT_NAME).stem.lower()
print(f"self.MAIN_SCRIPT_NAME={self.MAIN_SCRIPT_NAME}, self.PLUGIN_ID={self.PLUGIN_ID}", file=sys.stderr) # print(f"self.MAIN_SCRIPT_NAME={self.MAIN_SCRIPT_NAME}, self.PLUGIN_ID={self.PLUGIN_ID}", file=sys.stderr)
self.LOG_FILE_NAME = logFilePath if logFilePath != "" else f"{pathlib.Path(self.MAIN_SCRIPT_NAME).resolve().parent}{os.sep}{pathlib.Path(self.MAIN_SCRIPT_NAME).stem}.log" self.LOG_FILE_NAME = logFilePath if logFilePath != "" else f"{pathlib.Path(self.MAIN_SCRIPT_NAME).resolve().parent}{os.sep}{pathlib.Path(self.MAIN_SCRIPT_NAME).stem}.log"
self.LOG_FILE_DIR = pathlib.Path(self.LOG_FILE_NAME).resolve().parent self.LOG_FILE_DIR = pathlib.Path(self.LOG_FILE_NAME).resolve().parent
RFH = RotatingFileHandler( RFH = RotatingFileHandler(

1
plugins/.gitignore vendored
View File

@@ -33,6 +33,7 @@ renamefile_settings.cpython-310.pyc
/WindowsSymbolicLinkCleaner /WindowsSymbolicLinkCleaner
/DeleteMe /DeleteMe
/ATestPlugin /ATestPlugin
/FileMonitor/working
## Ignore Visual Studio temporary files, build results, and ## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons. ## files generated by popular Visual Studio add-ons.

View File

@@ -102,7 +102,7 @@ class StashPluginHelper:
if stash_url and len(stash_url): self.STASH_URL = stash_url if stash_url and len(stash_url): self.STASH_URL = stash_url
self.MAIN_SCRIPT_NAME = mainScriptName if mainScriptName != "" else __main__.__file__ self.MAIN_SCRIPT_NAME = mainScriptName if mainScriptName != "" else __main__.__file__
self.PLUGIN_ID = pluginID if pluginID != "" else pathlib.Path(self.MAIN_SCRIPT_NAME).stem.lower() self.PLUGIN_ID = pluginID if pluginID != "" else pathlib.Path(self.MAIN_SCRIPT_NAME).stem.lower()
print(f"self.MAIN_SCRIPT_NAME={self.MAIN_SCRIPT_NAME}, self.PLUGIN_ID={self.PLUGIN_ID}", file=sys.stderr) # print(f"self.MAIN_SCRIPT_NAME={self.MAIN_SCRIPT_NAME}, self.PLUGIN_ID={self.PLUGIN_ID}", file=sys.stderr)
self.LOG_FILE_NAME = logFilePath if logFilePath != "" else f"{pathlib.Path(self.MAIN_SCRIPT_NAME).resolve().parent}{os.sep}{pathlib.Path(self.MAIN_SCRIPT_NAME).stem}.log" self.LOG_FILE_NAME = logFilePath if logFilePath != "" else f"{pathlib.Path(self.MAIN_SCRIPT_NAME).resolve().parent}{os.sep}{pathlib.Path(self.MAIN_SCRIPT_NAME).stem}.log"
self.LOG_FILE_DIR = pathlib.Path(self.LOG_FILE_NAME).resolve().parent self.LOG_FILE_DIR = pathlib.Path(self.LOG_FILE_NAME).resolve().parent
RFH = RotatingFileHandler( RFH = RotatingFileHandler(

View File

@@ -22,8 +22,15 @@ parser.add_argument('--url', '-u', dest='stash_url', type=str, help='Add Stash U
parser.add_argument('--trace', '-t', dest='trace', action='store_true', help='Enables debug trace mode.') parser.add_argument('--trace', '-t', dest='trace', action='store_true', help='Enables debug trace mode.')
parser.add_argument('--stop', '-s', dest='stop', action='store_true', help='Stop (kill) a running FileMonitor task.') parser.add_argument('--stop', '-s', dest='stop', action='store_true', help='Stop (kill) a running FileMonitor task.')
parser.add_argument('--restart', '-r', dest='restart', action='store_true', help='Restart FileMonitor.') parser.add_argument('--restart', '-r', dest='restart', action='store_true', help='Restart FileMonitor.')
parser.add_argument('--silent', '--quit', '-q', dest='quit', action='store_true', help='Run in silent mode. No output to console or stderr. Use this when running from pythonw.exe')
parse_args = parser.parse_args() parse_args = parser.parse_args()
logToErrSet = 0
logToNormSet = 0
if parse_args.quit:
logToErrSet = 1
logToNormSet = 1
settings = { settings = {
"recursiveDisabled": False, "recursiveDisabled": False,
"zzdebugTracing": False, "zzdebugTracing": False,
@@ -33,7 +40,10 @@ plugin = StashPluginHelper(
stash_url=parse_args.stash_url, stash_url=parse_args.stash_url,
debugTracing=parse_args.trace, debugTracing=parse_args.trace,
settings=settings, settings=settings,
config=config) config=config,
logToErrSet=logToErrSet,
logToNormSet=logToNormSet
)
plugin.Status() plugin.Status()
plugin.Log(f"\nStarting (__file__={__file__}) (plugin.CALLED_AS_STASH_PLUGIN={plugin.CALLED_AS_STASH_PLUGIN}) (plugin.DEBUG_TRACING={plugin.DEBUG_TRACING}) (plugin.DRY_RUN={plugin.DRY_RUN}) (plugin.PLUGIN_TASK_NAME={plugin.PLUGIN_TASK_NAME})************************************************") plugin.Log(f"\nStarting (__file__={__file__}) (plugin.CALLED_AS_STASH_PLUGIN={plugin.CALLED_AS_STASH_PLUGIN}) (plugin.DEBUG_TRACING={plugin.DEBUG_TRACING}) (plugin.DRY_RUN={plugin.DRY_RUN}) (plugin.PLUGIN_TASK_NAME={plugin.PLUGIN_TASK_NAME})************************************************")
@@ -69,6 +79,22 @@ if plugin.DRY_RUN:
plugin.Log("Dry run mode is enabled.") plugin.Log("Dry run mode is enabled.")
plugin.Trace(f"(SCAN_MODIFIED={SCAN_MODIFIED}) (SCAN_ON_ANY_EVENT={SCAN_ON_ANY_EVENT}) (RECURSIVE={RECURSIVE})") plugin.Trace(f"(SCAN_MODIFIED={SCAN_MODIFIED}) (SCAN_ON_ANY_EVENT={SCAN_ON_ANY_EVENT}) (RECURSIVE={RECURSIVE})")
def isJobWaitingToRun():
i = 1
while i < 999:
jobDetails = plugin.STASH_INTERFACE.find_job(i)
if jobDetails:
plugin.Trace(f"(Job ID({i})={jobDetails})")
if jobDetails['status'] == "READY" and jobDetails['description'] != "Running plugin task: Start Library Monitor":
return i
else:
plugin.Trace(f"Last job {i}")
break
i += 1
return 0
plugin.Trace(f"isJobWaitingToRun() = {isJobWaitingToRun()})")
def start_library_monitor(): def start_library_monitor():
global shouldUpdate global shouldUpdate
global TargetPaths global TargetPaths
@@ -154,6 +180,8 @@ def start_library_monitor():
observer.schedule(event_handler, path, recursive=RECURSIVE) observer.schedule(event_handler, path, recursive=RECURSIVE)
plugin.Trace(f"Observing {path}") plugin.Trace(f"Observing {path}")
observer.start() observer.start()
JobIsRunning = False
PutPluginBackOnTaskQueAndExit = False
plugin.Trace("Starting loop") plugin.Trace("Starting loop")
try: try:
while True: while True:
@@ -161,11 +189,19 @@ def start_library_monitor():
with mutex: with mutex:
while not shouldUpdate: while not shouldUpdate:
plugin.Trace("Wait start") plugin.Trace("Wait start")
if plugin.CALLED_AS_STASH_PLUGIN:
signal.wait(timeout=SIGNAL_TIMEOUT) signal.wait(timeout=SIGNAL_TIMEOUT)
else:
signal.wait()
plugin.Trace("Wait end") plugin.Trace("Wait end")
if shm_buffer[0] != CONTINUE_RUNNING_SIG: if shm_buffer[0] != CONTINUE_RUNNING_SIG:
plugin.Log(f"Breaking out of loop. (shm_buffer[0]={shm_buffer[0]})") plugin.Log(f"Breaking out of loop. (shm_buffer[0]={shm_buffer[0]})")
break break
JobIdInTheQue = isJobWaitingToRun()
if plugin.CALLED_AS_STASH_PLUGIN and JobIdInTheQue:
plugin.Log(f"Another task (JobID={JobIdInTheQue}) is waiting on the queue. Will restart FileMonitor to allow other task to run.")
JobIsRunning = True
shouldUpdate = True
shouldUpdate = False shouldUpdate = False
TmpTargetPaths = [] TmpTargetPaths = []
for TargetPath in TargetPaths: for TargetPath in TargetPaths:
@@ -186,16 +222,19 @@ def start_library_monitor():
if RUN_GENERATE_CONTENT: if RUN_GENERATE_CONTENT:
plugin.STASH_INTERFACE.metadata_generate() plugin.STASH_INTERFACE.metadata_generate()
if plugin.CALLED_AS_STASH_PLUGIN and shm_buffer[0] == CONTINUE_RUNNING_SIG: if plugin.CALLED_AS_STASH_PLUGIN and shm_buffer[0] == CONTINUE_RUNNING_SIG:
plugin.STASH_INTERFACE.run_plugin_task(plugin_id=plugin.PLUGIN_ID, task_name="Start Library Monitor") PutPluginBackOnTaskQueAndExit = True
plugin.Trace("Exiting plugin so that metadata_scan task can run.")
return
else: else:
plugin.Trace("Nothing to scan.") plugin.Trace("Nothing to scan.")
if shm_buffer[0] != CONTINUE_RUNNING_SIG: if shm_buffer[0] != CONTINUE_RUNNING_SIG:
plugin.Log(f"Exiting Change File Monitor. (shm_buffer[0]={shm_buffer[0]})") plugin.Log(f"Exiting Change File Monitor. (shm_buffer[0]={shm_buffer[0]})")
shm_a.close() shm_a.close()
shm_a.unlink() # Call unlink only once to release the shared memory shm_a.unlink() # Call unlink only once to release the shared memory
raise KeyboardInterrupt raise KeyboardInterrupt
elif JobIsRunning or PutPluginBackOnTaskQueAndExit:
plugin.STASH_INTERFACE.run_plugin_task(plugin_id=plugin.PLUGIN_ID, task_name="Start Library Monitor")
plugin.Trace("Exiting plugin so that other task can run.")
return
except KeyboardInterrupt: except KeyboardInterrupt:
observer.stop() observer.stop()
plugin.Trace("Stopping observer") plugin.Trace("Stopping observer")

View File

@@ -8,8 +8,8 @@ config = {
"onAnyEvent": False, "onAnyEvent": False,
# Enable to monitor changes in file system for modification flag. This option is NOT needed for Windows, because on Windows changes are triggered via CREATE, DELETE, and MOVE flags. Other OS may differ. # Enable to monitor changes in file system for modification flag. This option is NOT needed for Windows, because on Windows changes are triggered via CREATE, DELETE, and MOVE flags. Other OS may differ.
"scanModified": False, "scanModified": False,
# Timeout in seconds. This is how often it will check if a stop signal is sent. # Timeout in seconds. This is how often it will check if another job (Task) is in the queue.
"timeOut": 3600, "timeOut": 60, # Not needed when running in command line mode.
# Enable to exit FileMonitor by creating special file in plugin folder\working # Enable to exit FileMonitor by creating special file in plugin folder\working
"createSpecFileToExit": True, "createSpecFileToExit": True,
# Enable to delete special file imediately after it's created in stop process # Enable to delete special file imediately after it's created in stop process