Exemplo n.º 1
0
    def signal_pids(self, sig, **kwargs):
        """Send a signal to pids for this server

        :param sig: signal to send

        :returns: a dict mapping pids (ints) to pid_files (paths)

        """
        pids = {}
        for pid_file, pid in self.iter_pid_files(**kwargs):
            try:
                if sig != signal.SIG_DFL:
                    print _('Signal %s  pid: %s  signal: %s') % (self.server,
                                                                 pid, sig)
                os.kill(pid, sig)
            except OSError as e:
                if e.errno == errno.ESRCH:
                    # pid does not exist
                    if kwargs.get('verbose'):
                        print _("Removing stale pid file %s") % pid_file
                    remove_file(pid_file)
                elif e.errno == errno.EPERM:
                    print _("No permission to signal PID %d") % pid
            else:
                # process exists
                pids[pid] = pid_file
        return pids
Exemplo n.º 2
0
    def signal_pids(self, sig, **kwargs):
        """Send a signal to pids for this server

        :param sig: signal to send

        :returns: a dict mapping pids (ints) to pid_files (paths)

        """
        pids = {}
        for pid_file, pid in self.iter_pid_files(**kwargs):
            try:
                if sig != signal.SIG_DFL:
                    print _('Signal %s  pid: %s  signal: %s') % (self.server,
                                                                 pid, sig)
                os.kill(pid, sig)
            except OSError as e:
                if e.errno == errno.ESRCH:
                    # pid does not exist
                    if kwargs.get('verbose'):
                        print _("Removing stale pid file %s") % pid_file
                    remove_file(pid_file)
                elif e.errno == errno.EPERM:
                    print _("No permission to signal PID %d") % pid
            else:
                # process exists
                pids[pid] = pid_file
        return pids
Exemplo n.º 3
0
 def _signal_pid(self, sig, pid, pid_file, verbose):
     try:
         if sig != signal.SIG_DFL:
             print(
                 _('Signal %(server)s  pid: %(pid)s  signal: '
                   '%(signal)s') % {
                       'server': self.server,
                       'pid': pid,
                       'signal': sig
                   })
         safe_kill(pid, sig, 'swift-%s' % self.server)
     except InvalidPidFileException:
         if verbose:
             print(
                 _('Removing pid file %(pid_file)s with wrong pid '
                   '%(pid)d') % {
                       'pid_file': pid_file,
                       'pid': pid
                   })
         remove_file(pid_file)
         return False
     except OSError as e:
         if e.errno == errno.ESRCH:
             # pid does not exist
             if verbose:
                 print(_("Removing stale pid file %s") % pid_file)
             remove_file(pid_file)
         elif e.errno == errno.EPERM:
             print(_("No permission to signal PID %d") % pid)
         return False
     else:
         # process exists
         return True
Exemplo n.º 4
0
 def collect_parts(self, override_devices=None, override_partitions=None):
     """
     Helper for yielding partitions in the top level reconstructor
     """
     override_devices = override_devices or []
     override_partitions = override_partitions or []
     ips = whataremyips()
     for policy in POLICIES:
         if policy.policy_type != EC_POLICY:
             continue
         self._diskfile_mgr = self._df_router[policy]
         self.load_object_ring(policy)
         data_dir = get_data_dir(policy)
         local_devices = itertools.ifilter(
             lambda dev: dev and is_local_device(ips, self.port, dev[
                 'replication_ip'], dev['replication_port']),
             policy.object_ring.devs)
         for local_dev in local_devices:
             if override_devices and (local_dev['device']
                                      not in override_devices):
                 continue
             dev_path = join(self.devices_dir, local_dev['device'])
             obj_path = join(dev_path, data_dir)
             tmp_path = join(dev_path, get_tmp_dir(int(policy)))
             if self.mount_check and not ismount(dev_path):
                 self.logger.warn(_('%s is not mounted'),
                                  local_dev['device'])
                 continue
             unlink_older_than(tmp_path, time.time() - self.reclaim_age)
             if not os.path.exists(obj_path):
                 try:
                     mkdirs(obj_path)
                 except Exception:
                     self.logger.exception('Unable to create %s' % obj_path)
                 continue
             try:
                 partitions = os.listdir(obj_path)
             except OSError:
                 self.logger.exception('Unable to list partitions in %r' %
                                       obj_path)
                 continue
             for partition in partitions:
                 part_path = join(obj_path, partition)
                 if not (partition.isdigit() and os.path.isdir(part_path)):
                     self.logger.warning(
                         'Unexpected entity in data dir: %r' % part_path)
                     remove_file(part_path)
                     continue
                 partition = int(partition)
                 if override_partitions and (partition
                                             not in override_partitions):
                     continue
                 part_info = {
                     'local_dev': local_dev,
                     'policy': policy,
                     'partition': partition,
                     'part_path': part_path,
                 }
                 yield part_info
Exemplo n.º 5
0
    def collect_parts(self, override_devices=None, override_partitions=None):
        """
        Helper for yielding partitions in the top level reconstructor
        """
        override_devices = override_devices or []
        override_partitions = override_partitions or []
        ips = whataremyips(self.bind_ip)
        for policy in POLICIES:
            if policy.policy_type != EC_POLICY:
                continue
            self._diskfile_mgr = self._df_router[policy]
            self.load_object_ring(policy)
            data_dir = get_data_dir(policy)
            local_devices = itertools.ifilter(
                lambda dev: dev and is_local_device(ips, self.port, dev["replication_ip"], dev["replication_port"]),
                policy.object_ring.devs,
            )

            for local_dev in local_devices:
                if override_devices and (local_dev["device"] not in override_devices):
                    continue
                dev_path = self._df_router[policy].get_dev_path(local_dev["device"])
                if not dev_path:
                    self.logger.warn(_("%s is not mounted"), local_dev["device"])
                    continue
                obj_path = join(dev_path, data_dir)
                tmp_path = join(dev_path, get_tmp_dir(int(policy)))
                unlink_older_than(tmp_path, time.time() - self.reclaim_age)
                if not os.path.exists(obj_path):
                    try:
                        mkdirs(obj_path)
                    except Exception:
                        self.logger.exception("Unable to create %s" % obj_path)
                    continue
                try:
                    partitions = os.listdir(obj_path)
                except OSError:
                    self.logger.exception("Unable to list partitions in %r" % obj_path)
                    continue
                for partition in partitions:
                    part_path = join(obj_path, partition)
                    if not (partition.isdigit() and os.path.isdir(part_path)):
                        self.logger.warning("Unexpected entity in data dir: %r" % part_path)
                        remove_file(part_path)
                        continue
                    partition = int(partition)
                    if override_partitions and (partition not in override_partitions):
                        continue
                    part_info = {
                        "local_dev": local_dev,
                        "policy": policy,
                        "partition": partition,
                        "part_path": part_path,
                    }
                    yield part_info
Exemplo n.º 6
0
 def test_remove_file(self):
     with temptree([]) as t:
         file_name = os.path.join(t, 'blah.pid')
         # assert no raise
         self.assertEquals(os.path.exists(file_name), False)
         self.assertEquals(utils.remove_file(file_name), None)
         with open(file_name, 'w') as f:
             f.write('1')
         self.assert_(os.path.exists(file_name))
         self.assertEquals(utils.remove_file(file_name), None)
         self.assertFalse(os.path.exists(file_name))
Exemplo n.º 7
0
 def test_remove_file(self):
     with temptree([]) as t:
         file_name = os.path.join(t, 'blah.pid')
         # assert no raise
         self.assertEquals(os.path.exists(file_name), False)
         self.assertEquals(utils.remove_file(file_name), None)
         with open(file_name, 'w') as f:
             f.write('1')
         self.assert_(os.path.exists(file_name))
         self.assertEquals(utils.remove_file(file_name), None)
         self.assertFalse(os.path.exists(file_name))
Exemplo n.º 8
0
    def signal_pids(self, sig, **kwargs):
        """Send a signal to pids for this server

        :param sig: signal to send

        :returns: a dict mapping pids (ints) to pid_files (paths)

        """
        pids = {}
        for pid_file, pid in self.iter_pid_files(**kwargs):
            if not pid:  # Catches None and 0
                print(_('Removing pid file %s with invalid pid') % pid_file)
                remove_file(pid_file)
                continue
            if self._signal_pid(sig, pid, pid_file, kwargs.get('verbose')):
                pids[pid] = pid_file
        return pids
Exemplo n.º 9
0
    def signal_children(self, sig, **kwargs):
        """Send a signal to child pids for this server

        :param sig: signal to send

        :returns: a dict mapping pids (ints) to pid_files (paths)

        """
        pids = {}
        for pid_file, pid in self.iter_pid_files(**kwargs):
            if not pid:  # Catches None and 0
                print(_('Removing pid file %s with invalid pid') % pid_file)
                remove_file(pid_file)
                continue
            ps_cmd = ['ps', '--ppid', str(pid), '--no-headers', '-o', 'pid']
            for pid in subprocess.check_output(ps_cmd).split():
                pid = int(pid)
                if self._signal_pid(sig, pid, pid_file, kwargs.get('verbose')):
                    pids[pid] = pid_file
        return pids
Exemplo n.º 10
0
    def signal_pids(self, sig, **kwargs):
        """Send a signal to pids for this server

        :param sig: signal to send

        :returns: a dict mapping pids (ints) to pid_files (paths)

        """
        pids = {}
        for pid_file, pid in self.iter_pid_files(**kwargs):
            if not pid:  # Catches None and 0
                print(_('Removing pid file %s with invalid pid') % pid_file)
                remove_file(pid_file)
                continue
            try:
                if sig != signal.SIG_DFL:
                    print(
                        _('Signal %(server)s  pid: %(pid)s  signal: '
                          '%(signal)s') % {
                              'server': self.server,
                              'pid': pid,
                              'signal': sig
                          })
                safe_kill(pid, sig, 'swift-%s' % self.server)
            except InvalidPidFileException as e:
                if kwargs.get('verbose'):
                    print(
                        _('Removing pid file %(pid_file)s with wrong pid '
                          '%(pid)d') % {
                              'pid_file': pid_file,
                              'pid': pid
                          })
                remove_file(pid_file)
            except OSError as e:
                if e.errno == errno.ESRCH:
                    # pid does not exist
                    if kwargs.get('verbose'):
                        print(_("Removing stale pid file %s") % pid_file)
                    remove_file(pid_file)
                elif e.errno == errno.EPERM:
                    print(_("No permission to signal PID %d") % pid)
            else:
                # process exists
                pids[pid] = pid_file
        # 如果没有进程在运行则 pids 为空
        return pids
Exemplo n.º 11
0
    def signal_pids(self, sig, **kwargs):
        """Send a signal to pids for this server

        :param sig: signal to send

        :returns: a dict mapping pids (ints) to pid_files (paths)

        """
        pids = {}
        for pid_file, pid in self.iter_pid_files(**kwargs):
            if not pid:  # Catches None and 0
                print(_('Removing pid file %s with invalid pid') % pid_file)
                remove_file(pid_file)
                continue
            try:
                if sig != signal.SIG_DFL:
                    print(_('Signal %(server)s  pid: %(pid)s  signal: '
                            '%(signal)s') %
                          {'server': self.server, 'pid': pid, 'signal': sig})
                safe_kill(pid, sig, 'swift-%s' % self.server)
            except InvalidPidFileException as e:
                if kwargs.get('verbose'):
                    print(_('Removing pid file %(pid_file)s with wrong pid '
                            '%(pid)d') % {'pid_file': pid_file, 'pid': pid})
                remove_file(pid_file)
            except OSError as e:
                if e.errno == errno.ESRCH:
                    # pid does not exist
                    if kwargs.get('verbose'):
                        print(_("Removing stale pid file %s") % pid_file)
                    remove_file(pid_file)
                elif e.errno == errno.EPERM:
                    print(_("No permission to signal PID %d") % pid)
            else:
                # process exists
                pids[pid] = pid_file
        return pids
Exemplo n.º 12
0
 def kill_it(path):
     shutil.rmtree(path, ignore_errors=True)
     remove_file(path)
Exemplo n.º 13
0
 def delete_partition(self, path):
     self.logger.info(_("Removing partition: %s"), path)
     tpool.execute(shutil.rmtree, path, ignore_errors=True)
     remove_file(path)
Exemplo n.º 14
0
    def collect_parts(self, override_devices=None, override_partitions=None):
        """
        Helper for yielding partitions in the top level reconstructor
        """
        override_devices = override_devices or []
        override_partitions = override_partitions or []
        ips = whataremyips(self.bind_ip)
        ec_policies = (policy for policy in POLICIES
                       if policy.policy_type == EC_POLICY)

        policy2devices = {}

        for policy in ec_policies:
            self.load_object_ring(policy)
            local_devices = list(
                six.moves.filter(
                    lambda dev: dev and is_local_device(
                        ips, self.port, dev['replication_ip'], dev[
                            'replication_port']), policy.object_ring.devs))

            if override_devices:
                local_devices = list(
                    six.moves.filter(
                        lambda dev_info: dev_info['device'] in
                        override_devices, local_devices))

            policy2devices[policy] = local_devices
            self.device_count += len(local_devices)

        all_parts = []

        for policy, local_devices in policy2devices.items():
            df_mgr = self._df_router[policy]
            for local_dev in local_devices:
                self.reconstruction_device_count += 1
                dev_path = df_mgr.get_dev_path(local_dev['device'])
                if not dev_path:
                    self.logger.warning(_('%s is not mounted'),
                                        local_dev['device'])
                    continue
                data_dir = get_data_dir(policy)
                obj_path = join(dev_path, data_dir)
                tmp_path = join(dev_path, get_tmp_dir(int(policy)))
                unlink_older_than(tmp_path, time.time() - df_mgr.reclaim_age)
                if not os.path.exists(obj_path):
                    try:
                        mkdirs(obj_path)
                    except Exception:
                        self.logger.exception('Unable to create %s' % obj_path)
                    continue
                try:
                    partitions = os.listdir(obj_path)
                except OSError:
                    self.logger.exception('Unable to list partitions in %r' %
                                          obj_path)
                    continue

                self.part_count += len(partitions)
                for partition in partitions:
                    part_path = join(obj_path, partition)
                    if partition in ('auditor_status_ALL.json',
                                     'auditor_status_ZBF.json'):
                        continue
                    if not partition.isdigit():
                        self.logger.warning(
                            'Unexpected entity in data dir: %r' % part_path)
                        remove_file(part_path)
                        self.reconstruction_part_count += 1
                        continue
                    partition = int(partition)
                    if override_partitions and (partition
                                                not in override_partitions):
                        continue
                    part_info = {
                        'local_dev': local_dev,
                        'policy': policy,
                        'partition': partition,
                        'part_path': part_path,
                    }
                    all_parts.append(part_info)
        random.shuffle(all_parts)
        return all_parts
Exemplo n.º 15
0
    def collect_parts(self, override_devices=None,
                      override_partitions=None):
        """
        Helper for yielding partitions in the top level reconstructor
        """
        override_devices = override_devices or []
        override_partitions = override_partitions or []
        ips = whataremyips(self.bind_ip)
        for policy in POLICIES:
            if policy.policy_type != EC_POLICY:
                continue
            self._diskfile_mgr = self._df_router[policy]
            self.load_object_ring(policy)
            data_dir = get_data_dir(policy)
            local_devices = list(six.moves.filter(
                lambda dev: dev and is_local_device(
                    ips, self.port,
                    dev['replication_ip'], dev['replication_port']),
                policy.object_ring.devs))

            if override_devices:
                self.device_count = len(override_devices)
            else:
                self.device_count = len(local_devices)

            for local_dev in local_devices:
                if override_devices and (local_dev['device'] not in
                                         override_devices):
                    continue
                self.reconstruction_device_count += 1
                dev_path = self._df_router[policy].get_dev_path(
                    local_dev['device'])
                if not dev_path:
                    self.logger.warning(_('%s is not mounted'),
                                        local_dev['device'])
                    continue
                obj_path = join(dev_path, data_dir)
                tmp_path = join(dev_path, get_tmp_dir(int(policy)))
                unlink_older_than(tmp_path, time.time() -
                                  self.reclaim_age)
                if not os.path.exists(obj_path):
                    try:
                        mkdirs(obj_path)
                    except Exception:
                        self.logger.exception(
                            'Unable to create %s' % obj_path)
                    continue
                try:
                    partitions = os.listdir(obj_path)
                except OSError:
                    self.logger.exception(
                        'Unable to list partitions in %r' % obj_path)
                    continue

                self.part_count += len(partitions)
                for partition in partitions:
                    part_path = join(obj_path, partition)
                    if not (partition.isdigit() and
                            os.path.isdir(part_path)):
                        self.logger.warning(
                            'Unexpected entity in data dir: %r' % part_path)
                        remove_file(part_path)
                        self.reconstruction_part_count += 1
                        continue
                    partition = int(partition)
                    if override_partitions and (partition not in
                                                override_partitions):
                        continue
                    part_info = {
                        'local_dev': local_dev,
                        'policy': policy,
                        'partition': partition,
                        'part_path': part_path,
                    }
                    yield part_info
                    self.reconstruction_part_count += 1