Skip to content

Commit

Permalink
Merge pull request #16 from geoserver/ISSUE_8
Browse files Browse the repository at this point in the history
close #8 : An unhandled exception might crash wpsagent and related WPS process
  • Loading branch information
Alessio Fabiani committed Jun 19, 2017
2 parents 6d50a75 + dd83b1d commit 24745c6
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 19 deletions.
25 changes: 22 additions & 3 deletions src/wpsremote/servicebot.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ def handle_execute(self, execute_message):
logger.info("created process " + self.service + " with PId " + str(invoked_process.pid) + " and cmd: " + cmd )

#use a parallel thread to wait the end of the request handler process and get the exit code of the just created asynchronous process computation
thread.start_new_thread(self.output_parser_verbose, (invoked_process,))
thread.start_new_thread(self.output_parser_verbose, (invoked_process, param_filepath,))

logger.info("end of execute message handler, going back in listening mode")

Expand Down Expand Up @@ -209,7 +209,7 @@ def handle_getloadavg(self, getloadavg_message):
# if return_code != 0:
# logger.critical("Process " + self.service + " PId " + str(invoked_process.pid) + " terminated with exit code " + str(return_code))

def output_parser_verbose(self, invoked_process):
def output_parser_verbose(self, invoked_process, param_filepath):
logger = logging.getLogger("servicebot.output_parser_verbose")
logger.info("wait for end of execution of created process " + self.service + ", PId " + str(invoked_process.pid) )

Expand Down Expand Up @@ -245,8 +245,23 @@ def output_parser_verbose(self, invoked_process):
msg = "Process " + self.service + " PId " + str(invoked_process.pid) + " terminated with exit code " + str(return_code)
logger.critical(msg)

logger.debug("gs_UID[%s] / gs_JID[%s]" % (gs_UID, gs_JID))
if gs_UID and gs_JID:
self.bus.SendMessage( busIndipendentMessages.ErrorMessage( gs_JID, msg + " Exception: " + str(gs_MSG), gs_UID ) )
elif self._remote_wps_endpoint:
self.bus.SendMessage( busIndipendentMessages.ErrorMessage( self._remote_wps_endpoint, msg ) )
else:
exe_msg = None
try:
logger.debug("Trying to recover Originator from Process Params!")
exe_msg = busIndipendentMessages.ExecuteMessage.deserialize( param_filepath )
if exe_msg.originator():
self.bus.SendMessage( busIndipendentMessages.ErrorMessage( exe_msg.originator(), msg + " Exception: remote process exception. Please check outputs!", exe_msg.UniqueId() ) )
except:
pass
if not exe_msg:
msg = "Process " + self.service + " PId " + str(invoked_process.pid) + " STALLED! Don't know who to send ERROR Message..."
logger.error(msg)
else:
msg = "Process " + self.service + " PId " + str(invoked_process.pid) + " terminated successfully!"
logger.debug(msg)
Expand All @@ -261,7 +276,11 @@ def send_error_message(self, msg):
# self.bus.xmpp.get_roster()
except:
logger.info( "[XMPP Disconnected]: Service "+str(self.service)+" Could not send error message to GeoServer Endpoint "+str(self._remote_wps_endpoint))
self.bus.SendMessage( busIndipendentMessages.ErrorMessage( self._remote_wps_endpoint, msg ) )
if self._remote_wps_endpoint:
self.bus.SendMessage( busIndipendentMessages.ErrorMessage( self._remote_wps_endpoint, msg ) )
else:
msg = "Process " + str(self.service) + " STALLED! Don't know who to send ERROR Message..."
logger.error(msg)

def disconnect(self):
self.bus.disconnect()
Expand Down
41 changes: 25 additions & 16 deletions src/wpsremote/wpsagent.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
#-r .\configs\remote.config -s .\configs\OAAonDemand\service.config service
#-r .\configs\remote.config -s .\configs\OAAonDemand\service.config -p d:\users\cimino\appdata\local\temp\wps_params_ullgiw.tmp process


class WPSAgent(object):
def __init__(self, args):
#remove sleek xmpp logging
Expand Down Expand Up @@ -121,19 +120,24 @@ def __init__(self, args):
except Exception as e:
#here log is not available use log_bootstrap_error func to log somewhere else (e.g. operating system error log, tmp file, stdout)
msg = "Failure during bot bootstrap due to : " + str(e)
self.log_bootstrap_error(msg, traceback.format_exc())
WPSAgent.log_bootstrap_error(msg, traceback.format_exc())
sys.exit(100)

#start execution
self.run()

def create_bot(self):
logger = logging.getLogger("WPSAgentProcess.create_bot")
logger.info("Create process bot")
bot = processbot.ProcessBot( self.args.remoteconfig, self.args.serviceconfig, self.exe_msg )
#create resource cleaner
self.set_resource_cleaner_parameters(bot.get_resource_file_dir(), bot.max_execution_time(), bot.max_execution_time(), bot.max_execution_time())
return bot
try:
logger = logging.getLogger("WPSAgentProcess.create_bot")
logger.info("Create process bot")
bot = processbot.ProcessBot( self.args.remoteconfig, self.args.serviceconfig, self.exe_msg )
#create resource cleaner
self.set_resource_cleaner_parameters(bot.get_resource_file_dir(), bot.max_execution_time(), bot.max_execution_time(), bot.max_execution_time())
return bot
except Exception as e:
msg = "Failure during bot bootstrap due to : " + str(e)
WPSAgent.log_bootstrap_error(msg, traceback.format_exc())
sys.exit(100)

class WPSAgentService(WPSAgent):

Expand All @@ -152,14 +156,19 @@ def __init__(self, args):
self.run()

def create_bot(self):
logger = logging.getLogger("WPSAgentService.create_bot")
logger.info("Create process bot")
bot = servicebot.ServiceBot(self.args.remoteconfig, self.args.serviceconfig)
logger.info("Create resource cleaner")
WPSAgent.set_resource_cleaner_parameters(bot.get_resource_file_dir(), bot.max_execution_time(), bot.max_execution_time(), bot.max_execution_time())
#start infinite loop for resource clenaer thread
thread.start_new_thread( resource_cleaner.Resource.clean_up_all,())
return bot
try:
logger = logging.getLogger("WPSAgentService.create_bot")
logger.info("Create process bot")
bot = servicebot.ServiceBot(self.args.remoteconfig, self.args.serviceconfig)
logger.info("Create resource cleaner")
WPSAgent.set_resource_cleaner_parameters(bot.get_resource_file_dir(), bot.max_execution_time(), bot.max_execution_time(), bot.max_execution_time())
#start infinite loop for resource clenaer thread
thread.start_new_thread( resource_cleaner.Resource.clean_up_all,())
return bot
except Exception as e:
msg = "Failure during bot bootstrap due to : " + str(e)
WPSAgent.log_bootstrap_error(msg, traceback.format_exc())
sys.exit(100)

class SleekXMPPLoggerFilter(logging.Filter):

Expand Down

0 comments on commit 24745c6

Please sign in to comment.