def test_interval_task_delayed_start_run_once(): results = [] task = IntervalTask(lambda: results.append(1), name="test_task", interval=0.2, immediate_start=False) task.start() time.sleep(0.25) task.shutdown() assert len(results) == 1
def __init__(self, **kwargs) -> None: startup_timer = ExecutionTimer() super().__init__(fsmon=True, **kwargs) self.haltables = [ ("queue worker", self._shutdown_queue_worker), ("file watcher", self._shutdown_watcher), ("database heartbeat", self._shutdown_database_heartbeat), ("workflow scheduler", self._shutdown_scheduling_manager), ("object store", self._shutdown_object_store), ("job manager", self._shutdown_job_manager), ("application heartbeat", self._shutdown_heartbeat), ("repository manager", self._shutdown_repo_manager), ("database connection", self._shutdown_model), ("application stack", self._shutdown_application_stack), ] self._register_singleton(StructuredApp, self) # A lot of postfork initialization depends on the server name, ensure it is set immediately after forking before other postfork functions self.application_stack.register_postfork_function( self.application_stack.set_postfork_server_name, self) self.config.reload_sanitize_allowlist( explicit='sanitize_allowlist_file' in kwargs) self.amqp_internal_connection_obj = galaxy.queues.connection_from_config( self.config) # queue_worker *can* be initialized with a queue, but here we don't # want to and we'll allow postfork to bind and start it. self.queue_worker = self._register_singleton(GalaxyQueueWorker, GalaxyQueueWorker(self)) self._configure_tool_shed_registry() self.dependency_resolvers_view = self._register_singleton( DependencyResolversView, DependencyResolversView(self)) self.test_data_resolver = self._register_singleton( TestDataResolver, TestDataResolver(file_dirs=self.config.tool_test_data_directories)) self.dynamic_tool_manager = self._register_singleton( DynamicToolManager) self.api_keys_manager = self._register_singleton(ApiKeyManager) # Tool Data Tables self._configure_tool_data_tables(from_shed_config=False) # Load dbkey / genome build manager self._configure_genome_builds(data_table_name="__dbkeys__", load_old_style=True) # Genomes self.genomes = self._register_singleton(Genomes) # Data providers registry. self.data_provider_registry = self._register_singleton( DataProviderRegistry) # Initialize error report plugins. self.error_reports = self._register_singleton( ErrorReports, ErrorReports(self.config.error_report_file, app=self)) # Setup a Tool Cache self.tool_cache = self._register_singleton(ToolCache) self.tool_shed_repository_cache = self._register_singleton( ToolShedRepositoryCache) # Watch various config files for immediate reload self.watchers = self._register_singleton(ConfigWatchers) self._configure_toolbox() # Load Data Manager self.data_managers = self._register_singleton(DataManagers) # Load the update repository manager. self.update_repository_manager = self._register_singleton( UpdateRepositoryManager, UpdateRepositoryManager(self)) # Load proprietary datatype converters and display applications. self.installed_repository_manager.load_proprietary_converters_and_display_applications( ) # Load datatype display applications defined in local datatypes_conf.xml self.datatypes_registry.load_display_applications(self) # Load datatype converters defined in local datatypes_conf.xml self.datatypes_registry.load_datatype_converters(self.toolbox) # Load external metadata tool self.datatypes_registry.load_external_metadata_tool(self.toolbox) # Load history import/export tools. load_lib_tools(self.toolbox) self.toolbox.persist_cache(register_postfork=True) # visualizations registry: associates resources with visualizations, controls how to render self.visualizations_registry = self._register_singleton( VisualizationsRegistry, VisualizationsRegistry( self, directories_setting=self.config. visualization_plugins_directory, template_cache_dir=self.config.template_cache_path)) # Tours registry tour_registry = build_tours_registry(self.config.tour_config_dir) self.tour_registry = tour_registry self[ToursRegistry] = tour_registry # type: ignore[misc] # Webhooks registry self.webhooks_registry = self._register_singleton( WebhooksRegistry, WebhooksRegistry(self.config.webhooks_dir)) # Load security policy. self.security_agent = self.model.security_agent self.host_security_agent = galaxy.model.security.HostAgent( model=self.security_agent.model, permitted_actions=self.security_agent.permitted_actions) # Load quota management. self.quota_agent = self._register_singleton( QuotaAgent, get_quota_agent(self.config, self.model)) # Heartbeat for thread profiling self.heartbeat = None self.auth_manager = self._register_singleton( auth.AuthManager, auth.AuthManager(self.config)) # Start the heartbeat process if configured and available (wait until # postfork if using uWSGI) if self.config.use_heartbeat: if heartbeat.Heartbeat: self.heartbeat = heartbeat.Heartbeat( self.config, period=self.config.heartbeat_interval, fname=self.config.heartbeat_log) self.heartbeat.daemon = True self.application_stack.register_postfork_function( self.heartbeat.start) self.authnz_manager = None if self.config.enable_oidc: from galaxy.authnz import managers self.authnz_manager = managers.AuthnzManager( self, self.config.oidc_config_file, self.config.oidc_backends_config_file) self.containers = {} if self.config.enable_beta_containers_interface: self.containers = build_container_interfaces( self.config.containers_config_file, containers_conf=self.config.containers_conf) if not self.config.enable_celery_tasks and self.config.history_audit_table_prune_interval > 0: self.prune_history_audit_task = IntervalTask( func=lambda: galaxy.model.HistoryAudit.prune(self.model.session ), name="HistoryAuditTablePruneTask", interval=self.config.history_audit_table_prune_interval, immediate_start=False, time_execution=True) self.application_stack.register_postfork_function( self.prune_history_audit_task.start) self.haltables.append(("HistoryAuditTablePruneTask", self.prune_history_audit_task.shutdown)) # Start the job manager self.application_stack.register_postfork_function( self.job_manager.start) # If app is not job handler but uses mule messaging. # Can be removed when removing mule support. self.job_manager._check_jobs_at_startup() self.proxy_manager = ProxyManager(self.config) # Must be initialized after job_config. self.workflow_scheduling_manager = scheduling_manager.WorkflowSchedulingManager( self) self.trs_proxy = self._register_singleton(TrsProxy, TrsProxy(self.config)) # Must be initialized after any component that might make use of stack messaging is configured. Alternatively if # it becomes more commonly needed we could create a prefork function registration method like we do with # postfork functions. self.application_stack.init_late_prefork() self.interactivetool_manager = InteractiveToolManager(self) # Configure handling of signals handlers = {} if self.heartbeat: handlers[signal.SIGUSR1] = self.heartbeat.dump_signal_handler self._configure_signal_handlers(handlers) self.database_heartbeat = DatabaseHeartbeat( application_stack=self.application_stack) self.database_heartbeat.add_change_callback(self.watchers.change_state) self.application_stack.register_postfork_function( self.database_heartbeat.start) # Start web stack message handling self.application_stack.register_postfork_function( self.application_stack.start) self.application_stack.register_postfork_function( self.queue_worker.bind_and_start) # Delay toolbox index until after startup self.application_stack.register_postfork_function( lambda: send_local_control_task(self, 'rebuild_toolbox_search_index')) # Inject url_for for components to more easily optionally depend # on url_for. self.url_for = url_for self.server_starttime = int(time.time()) # used for cachebusting # Limit lifetime of tool shed repository cache to app startup self.tool_shed_repository_cache = None log.info(f"Galaxy app startup finished {startup_timer}")
def test_interval_task_immediate_start(): results = [] task = IntervalTask(lambda: results.append(1), name="test_task", interval=0.2, immediate_start=True) task.start() task.shutdown() assert len(results) == 1