Esempio n. 1
0
 def _is_deleting(self, coredev):
     cmd = "grep 'delcoredev %s' %s" % (coredev, self.cache_log)
     try:
         _exec_shell1(cmd, p=False)
         return True
     except Exp, e:
         return False
Esempio n. 2
0
    def is_coredev(self, dev):
        first_step = False
        if not dev.startswith('/dev/'):
            return False
        devname = dev.split('/')[2]

        cmd = "bcache-super-show %s 2>/dev/null| grep 'backing device'" % dev
        check_path = '/sys/block/%s/bcache' % devname
        try:
            out, err = _exec_shell1(cmd, p=False)
            first_step = True
        except Exp as e:
            return False

        if first_step is True:
            if os.path.exists(check_path):
                return True
            else:
                try:
                    cmd = "echo '%s' > /sys/fs/bcache/register" % (dev)
                    _exec_shell1(cmd, p=False)
                    time.sleep(1)
                    if os.path.exists(check_path):
                        return True
                    else:
                        return False
                except Exp as e:
                    return False
        else:
            return False
Esempio n. 3
0
    def _etcd_del_member(cls, host):
        member_uuid = cls._get_uuid(host)
        if member_uuid == "":
            raise Exp(errno.ENOENT, "get host:%s uuid fail" % (host))

        cmd = "etcdctl member remove %s " % (member_uuid)
        _exec_shell1(cmd, p=True)
Esempio n. 4
0
    def __del_coredev_no_detach(self, coredev):
        coredevname = coredev.split('/')[2]
        mappingdev = self.get_mappingdev_by_coredev(coredev)

        try:
            abs_stop = '/sys/block/' + coredevname + '/bcache/stop'
            _exec_stop = 'echo 1 > %s' % abs_stop
            _exec_shell1(_exec_stop, p=True)
        except Exp, e:
            pass
Esempio n. 5
0
    def check_cache_dev(self, cachedev):
        if not self.is_cachedev(cachedev):
            return False

        cset_uuid = self.get_cset_uuid_by_dev(cachedev)
        if cset_uuid and self.is_cset_online(cset_uuid):
            cmd = "echo 0 > /sys/fs/bcache/%s/congested_write_threshold_us && echo 0 > /sys/fs/bcache/%s/congested_read_threshold_us" % (cset_uuid, cset_uuid)
            _exec_shell1(cmd, p=False)
            return True

        return False
Esempio n. 6
0
    def register_dev(self, coredev):
        register_path = '/sys/fs/bcache/register'

        if not os.path.exists(register_path):
            raise Exp(errno.EPERM, "bcache load error\n")

        _exec_register = 'echo %s > /sys/fs/bcache/register' % coredev
        try:
            _exec_shell1(_exec_register, p=False)
        except Exp as e:
            pass
Esempio n. 7
0
    def create_coredev(self, coredev):
        self._stop_coredev_bcache_service(coredev)

        # TODO clean lich metadata or not
        self.clean_lich_meta(coredev)

        #self.wipe_dev(coredev)

        cmd = 'make-bcache -B %s' % coredev
        _exec_shell1(cmd, p=True)

        self.check_and_register(coredev)
Esempio n. 8
0
    def get_mappingdev_by_coredev(self, coredev):
        if not self.is_coredev(coredev):
            return None

        retry = 0
        while True:
            cmd = 'lsblk %s --raw -o NAME|grep -v NAME' % coredev
            try:
                out, err = _exec_shell1(cmd, p=False)
            except Exp as e:
                raise Exp(errno.EPERM, 'get bcachename failed\n')

            list_dev = out.strip().split('\n')

            if len(list_dev) < 2:
                if not self.all_cache_register:
                    self.register_all_cachedev()

                self.register_dev(coredev)
                #dwarn("check %s lsblk fail, will retry." % (coredev))
                retry = retry + 1
                if retry < 2:
                    time.sleep(1)
                    continue
                else:
                    return None
                    #raise Exp(errno.EPERM, 'check %s lsblk fail' % (coredev))
            else:
                break

        if coredev == '/dev/' + list_dev[0]:
            return '/dev/' + list_dev[1]

        return None
Esempio n. 9
0
 def _etcd_check_running(cls):
     cmd = "systemctl status etcd | grep 'Active'"
     out, err = _exec_shell1(cmd, p=False)
     if "running" in out:
         return True
     else:
         return False
Esempio n. 10
0
 def get_cset_uuid_by_dev(self, dev):
     _exec = "bcache-super-show %s | grep cset.uuid | awk '{print $2}'" % dev
     try:
         out, err = _exec_shell1(_exec, p=False)
     except Exp as e:
         raise Exp(errno.EPERM, 'cant get coredev uuid\n')
     return out.strip()
Esempio n. 11
0
    def _check_mappingdev_exists(self, coredev):
        if coredev.startswith("/dev/bcache"):
            mappingdev = coredev
        else:
            mappingdev = self.get_mappingdev_by_coredev(coredev)

        if not os.path.exists(mappingdev):
            dev_num = self._get_bcache_device_num()
            cmd = "mknod %s b %s %s" % (mappingdev, dev_num, mappingdev[11:])
            _exec_shell1(cmd, p=False)
            if os.path.exists(mappingdev):
                return True
            else:
                return False
        else:
            return True
Esempio n. 12
0
 def __is_coredev_deleted(dev):
     _exec_check = "bcache-super-show %s 2>/dev/null| grep 'backing device'" % dev
     try:
         out, err = _exec_shell1(_exec_check, p=True)
         return False
     except Exp as e:
         #  deleted success
         return True
Esempio n. 13
0
 def get_admin(cls):
     """
     :return: app admin host
     """
     cmd = u"etcdctl get /sdfs/mond/master | awk -F',' '{print $1}'"
     (host, err) = _exec_shell1(cmd, p=False)
     if err.strip() != '':
         raise Exp(errno.EPERM, "%s:%s" % (host.strip(), err.strip()))
     return host
Esempio n. 14
0
    def del_cachedev(self, cachedev):
        if not self.is_cachedev(cachedev):
            raise Exp(errno.EINVAL, '%s not a cachedev\n' % cachedev)

        cset_uuid = self.get_cset_uuid_by_dev(cachedev)
        coredevs = self.list_coredevs_by_cachedev(cachedev)
        for coredev in coredevs:
            if len(coredev) == 0:
                continue
            self.del_coredev_dangerously(coredev)

        deleted = self.is_all_deleted(coredevs)
        if deleted:
            _exec_stop_cache = 'echo 1 > /sys/fs/bcache/%s/stop' % cset_uuid
            _exec_shell1(_exec_stop_cache, p=True)
            time.sleep(1)

            _exec_dd = 'dd if=/dev/zero of=%s count=1 bs=1M oflag=direct' % cachedev
            _exec_shell1(_exec_dd, p=True)
Esempio n. 15
0
    def register_all_cachedev(self):
        cmd = "cat /proc/partitions | awk '{print $4}' | grep -v name| grep -v '^ram' | grep -v '^dm-' | grep -v '^bcache' | grep -v '^td'"
        out, err = _exec_shell1(cmd, p=False)
        for devname in out.split('\n'):
            if len(devname) == 0:
                continue
            disk = "/dev/" + devname
            self.is_cachedev(disk)

        self.all_cache_register = True
Esempio n. 16
0
 def is_cachedev(self, dev):
     cmd = "bcache-super-show %s 2>/dev/null | grep 'cache device'" % dev
     try:
         out, err = _exec_shell1(cmd, p=False)
         cset_uuid = self.get_cset_uuid_by_dev(dev)
         cache_home = os.path.join("/sys/fs/bcache", cset_uuid)
         if not os.path.isdir(cache_home):
             try:
                 cmd = "echo '%s' > /sys/fs/bcache/register" % (dev)
                 _exec_shell1(cmd, p=False)
                 time.sleep(1)
                 if os.path.isdir(cache_home):
                     return True
                 else:
                     return False
             except Exp as e:
                 return False
         else:
             return True
     except Exp as e:
         return False
Esempio n. 17
0
    def is_valid_bcachedev(self, bcachedev):
        bcachename = self.get_dev_shortname(bcachedev)
        if not self.is_bcache_device_file(bcachename):
            return False

        cmd = "lsblk | grep '%s ' | wc -l" % (bcachename)
        out, err = _exec_shell1(cmd, p=False)
        count = int(out.strip('\n'))
        if count == 2: #must be 2 records, the one is in coredev, the other is in cachedev
            return True
        else:
            return False
Esempio n. 18
0
 def is_clean_state(self, coredev):
     coredevname = coredev.split('/')[2]
     _exec_state = 'cat /sys/block/%s/bcache/state' % (coredevname)
     try:
         out, err = _exec_shell1(_exec_state, p=False)
     except Exp as e:
         return False
     state = out.strip()
     if 'clean' in state:
         return True
     else:
         return False
Esempio n. 19
0
    def etcd_get_role(cls):
        config = Config()
        cmd = u"ps -ef |grep 'etcd'"
        (out, err) = _exec_shell1(cmd, p=False)
        if err.strip() != '':
            raise Exp(errno.EPERM, "%s:%s" % (host.strip(), err.strip()))

        out = out.strip()
        if out == "":
            return ETCD_NOT_RUNNING

        if os.path.isdir(os.path.join(config.etcd_data_path, "proxy")):
            return ETCD_RUN_AS_PROXY
        else:
            return ETCD_RUN_AS_META
Esempio n. 20
0
    def _get_members_from_conf(cls):
        member_list = []

        cmd = "cat /etc/etcd/etcd.conf | grep '^ETCD_INITIAL_CLUSTER[ =]' | awk -F'\"' '{print $2}'"
        out, err = _exec_shell1(cmd, p=True)
        if len(out.strip()) == 0:
            raise Exp(errno.EPERM, "not find init cluster, please check it !")

        for member in out.strip().split(','):
            if len(member) == 0:
                continue

            host = member.split('=')[0]
            member_list.append(host)

        return member_list
Esempio n. 21
0
    def _etcd_check_removed(cls):
        i = 0

        while i < 10:
            cls._etcd_service_trystart()
            time.sleep(1)
            try:
                cmd = "systemctl status etcd | grep -E 'the member has been permanently removed from the cluster|the data-dir used by this member must be removed'"
                out, err = _exec_shell1(cmd, p=False)
                out = out.strip()
                if len(out) > 0:
                    return True
            except Exp, e:
                pass

            i = i + 1
Esempio n. 22
0
    def __del_coredev(self, coredev, cset_uuid):
        coredevname = coredev.split('/')[2]
        abs_detach = '/sys/block/' + coredevname + '/bcache/detach'
        _exec_detach = 'echo %s > %s' % (cset_uuid, abs_detach)
        _exec_shell1(_exec_detach, p=True)

        abs_stop = '/sys/block/' + coredevname + '/bcache/stop'
        _exec_stop = 'echo 1 > %s' % abs_stop
        _exec_shell1(_exec_stop, p=True)

        _exec_dd = 'dd if=/dev/zero of=%s count=1 bs=1M oflag=direct' % coredev
        _exec_shell1(_exec_dd, p=True)
Esempio n. 23
0
    def _etcd_get_init_cluster(cls):
        init_cluster_list = {}

        #cmd = "etcdctl member list | awk '{print $2}'| awk -F'=' '{print $2}'"
        cmd = """etcdctl member list | awk '{print $2" "$5}'"""
        out, err = _exec_shell1(cmd, p=False)
        for line in out.strip().split('\n'):
            if len(line) == 0:
                continue

            hostname = line.split(' ')[0].split('=')[1]
            if "isLeader" in line:
                is_leader = line.split(' ')[1].split('=')[1]

            init_cluster_list[hostname] = is_leader

        #print init_cluster_list
        return init_cluster_list
Esempio n. 24
0
    def get_status_by_coredev(self, coredev):
        coredevname = coredev.split('/')[2]

        if self._is_deleting(coredev):
            status = "deleting_cache"
        else:
            _exec_status = 'cat /sys/block/%s/bcache/running' % coredevname
            try:
                out, err = _exec_shell1(_exec_status, p=False)
            except Exp as e:
                #  derror('dev:%s, ret: %d' % (coredev, e.errno))
                return None
            state = int(out.strip())
            if state == 1:
                status = 'running'
            else:
                status = 'stopped'

        return status
Esempio n. 25
0
    def del_coredev(self, coredev, is_flush):
        if not self.is_coredev(coredev):
            raise Exp(errno.EINVAL, '%s not a coredev\n' % (coredev))

        fd = _lock_file1("/var/run/cache_log.lock")
        cmd = "grep 'delcoredev %s' %s || echo 'delcoredev %s %d' >> %s" %\
                  (coredev, self.cache_log, coredev, int(is_flush), self.cache_log)
        _exec_shell1(cmd, p=False)
        _unlock_file1(fd)

        if is_flush:
            self.set_cache_wb_percent(coredev, "0")

        pid = os.fork()
        if pid == 0:
            while not self.is_clean_state(coredev):
                time.sleep(2)
            cset_uuid = self.get_cset_uuid_by_dev(coredev)
            mappingdev = self.get_mappingdev_by_coredev(coredev)
            super_8k_buff = self._get_superinfo(mappingdev, BCACHE_HEADER_LEN, 0)
            softdisk = self.get_softdisk_by_dev(mappingdev)

            self.__del_coredev(coredev, cset_uuid)

            self._resume_8k_superinfo(coredev, super_8k_buff)
            self.node.disk_manage.disk_setmeta_cset(coredev, '00000000-0000-0000-0000-000000000000')
            self._update_ln_to_hdd(mappingdev, softdisk, coredev)

            #remove from docker
            if os.path.exists(mappingdev):
                cmd = "rm -rf %s" % (mappingdev)
                _exec_shell1(cmd)

            # delete from /opt/fusionstack/log/cache.log
            fd = _lock_file1("/var/run/cache_log.lock")
            cmd = "sed -i '/delcoredev %s/d' %s" % (coredev.replace("/dev/", "\/dev\/"), self.cache_log)
            _exec_shell1(cmd, p=True)
            _unlock_file1(fd)
            sys.exit(0)
        elif pid > 0:
            return
        else:
            raise Exp(errno.EPERM, 'fork error\n')
Esempio n. 26
0
 def _get_uuid(cls, host):
     cmd = "etcdctl member list | grep 'name=%s ' | awk '{print $1}'" % (host)
     out, err = _exec_shell1(cmd, p=False)
     return out.strip()[:-1]
Esempio n. 27
0
 def _etcd_add_member(cls, host):
     cmd = "etcdctl member add %s http://%s:2380" % (host, host)
     _exec_shell1(cmd, p=True)
Esempio n. 28
0
 def _etcd_service_trystart(cls):
     try:
         cmd = "systemctl start etcd"
         _exec_shell1(cmd, p=False)
     except Exp, e:
         pass
Esempio n. 29
0
 def clean_lich_meta(self, dev):
     # 8K + 1M
     cmd = 'dd if=/dev/zero of=%s bs=1M count=1 oflag=direct' % dev
     _exec_shell1(cmd, p=True)
Esempio n. 30
0
 def _get_bcache_device_num(self):
     cmd = "cat /proc/devices | grep ' bcache' | awk '{print $1}'"
     out, err = _exec_shell1(cmd, p=False)
     return out.strip()