Пример #1
0
 def stop_daemons(self, dtg):
     try:
         self.process_kill_all()
         return CommandSuccess('OK', False)
     except SDaemonError as err:
         self.logger.exception('Failed to stop some storlet daemons')
         return CommandFailure(err.args[0], False)
Пример #2
0
 def halt(self, dtg):
     try:
         self.shutdown_all_processes()
         msg = 'Stopped all storlet daemons. Terminating.'
         return CommandSuccess(msg, False)
     except SDaemonError as err:
         self.logger.exception('Failed to stop some storlet daemons')
         return CommandFailure(err.args[0], False)
Пример #3
0
 def stop_daemon(self, dtg):
     params = dtg.params
     storlet_name = params['storlet_name']
     try:
         pid, code = self.process_kill(storlet_name)
         msg = 'The storlet daemon {0} is stopped'.format(storlet_name)
         return CommandSuccess(msg)
     except SDaemonError as err:
         self.logger.exception('Failed to kill the storlet daemon %s' %
                               storlet_name)
         return CommandFailure(err.args[0])
Пример #4
0
    def cancel(self, dtg):
        task_id = dtg.task_id
        if task_id not in self.task_id_to_pid:
            return CommandFailure('Task id %s is not found' % task_id, False)

        pid = self.task_id_to_pid.get(task_id)
        try:
            os.kill(pid, signal.SIGTERM)
            self._remove_pid(pid)
            return CommandSuccess('Cancelled task %s' % task_id, False)
        except OSError:
            self.logger.exception('Failed to kill subprocess: %d' % pid)
            return CommandFailure('Failed to cancel task %s' % task_id, False)
Пример #5
0
 def daemon_status(self, dtg):
     params = dtg.params
     storlet_name = params['storlet_name']
     try:
         if self.get_process_status_by_name(storlet_name):
             msg = 'The storlet daemon {0} seems to be OK'.format(
                 storlet_name)
             return CommandSuccess(msg)
         else:
             msg = 'No running storlet daemons for {0}'.format(storlet_name)
             return CommandFailure(msg)
     except SDaemonError as err:
         self.logger.exception('Failed to get status of the storlet '
                               'daemon %s' % storlet_name)
         return CommandFailure(err.args[0])
Пример #6
0
 def start_daemon(self, dtg):
     params = dtg.params
     storlet_name = params['storlet_name']
     try:
         if self.process_start_daemon(params['daemon_language'],
                                      params['storlet_path'],
                                      storlet_name,
                                      params['pool_size'],
                                      params['uds_path'],
                                      params['log_level'],
                                      daemon_language_version=params.get(
                                          'daemon_language_version')):
             msg = 'OK'
         else:
             msg = 'The storlet daemon {0} is already running'.format(
                 storlet_name)
         return CommandSuccess(msg)
     except SDaemonError as err:
         self.logger.exception(
             'Failed to start the sdaemon for {0}'.format(storlet_name))
         return CommandFailure(err.args[0])
Пример #7
0
    def execute(self, dtg):
        task_id = str(uuid.uuid4())[:8]
        self.logger.debug('Execute storlet %s (task %s)' %
                          (self.storlet_name, task_id))

        while len(self.task_id_to_pid) >= self.pool_size:
            self._wait_child_process()

        pid = os.fork()
        if pid:
            self.logger.debug('Create a subprocess %d for task %s' %
                              (pid, task_id))
            self.task_id_to_pid[task_id] = pid

            for fd in dtg.invocation_fds:
                # We do not use invocation fds in main process, so close them
                self._safe_close(fd)
        else:
            self._safe_close(dtg.service_out_fd)
            self._execute(dtg)
            sys.exit()

        return CommandSuccess('OK', task_id=task_id)
Пример #8
0
 def halt(self, dtg):
     self.logger.debug('Terminating')
     return CommandSuccess('OK', False)
Пример #9
0
 def halt(self, dtg):
     return CommandSuccess('OK', False)
Пример #10
0
    def execute(self, dtg):
        task_id_out_fd = dtg.task_id_out_fd

        task_id = str(uuid.uuid4())[:8]

        while len(self.task_id_to_pid) >= self.pool_size:
            self._wait_child_process()

        self.logger.debug('Returning task_id: %s ' % task_id)
        with os.fdopen(task_id_out_fd, 'w') as outfile:
            outfile.write(task_id)

        storlet_md = dtg.object_in_storlet_metadata
        params = dtg.params
        in_md = dtg.object_in_metadata
        in_fds = dtg.object_in_fds
        out_md_fds = dtg.object_metadata_out_fds
        out_fds = dtg.object_out_fds
        logger_fd = dtg.logger_out_fd

        pid = os.fork()
        if pid:
            self.logger.debug('Create a subprocess %d for task %s' %
                              (pid, task_id))
            self.task_id_to_pid[task_id] = pid

            for fd in dtg.fds:
                # We do not use fds in main process, so close them
                try:
                    os.close(fd)
                except OSError as e:
                    if e.errno != errno.EBADF:
                        raise
                    pass
        else:
            try:
                self.logger.debug('Start storlet invocation')

                self.logger.debug(
                    'in_fds:%s in_md:%s out_md_fds:%s out_fds:%s'
                    ' logger_fd: %s' %
                    (in_fds, in_md, out_md_fds, out_fds, logger_fd))

                in_files = [
                    self._create_input_file(st_md, md, in_fd)
                    for st_md, md, in_fd in zip(storlet_md, in_md, in_fds)
                ]

                out_files = [
                    StorletOutputFile(out_md_fd, out_fd)
                    for out_md_fd, out_fd in zip(out_md_fds, out_fds)
                ]

                self.logger.debug('Start storlet execution')
                with StorletLogger(self.storlet_name, logger_fd) as slogger:
                    handler = self.storlet_cls(slogger)
                    handler(in_files, out_files, params)
                self.logger.debug('Completed')
            except Exception:
                self.logger.exception('Error in storlet invocation')
            finally:
                # Make sure that all fds are closed
                self._safe_close_files(in_files)
                self._safe_close_files(out_files)
                sys.exit()
        return CommandSuccess('OK')
Пример #11
0
 def test_init(self):
     resp = CommandSuccess('ok')
     self.assertTrue(resp.status)
     self.assertEqual('ok', resp.message)
     self.assertTrue(resp.iterable)