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
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
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)
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
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
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
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)
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
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
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()
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
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
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
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)
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
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
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
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
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
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
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
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)
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
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
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')
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]
def _etcd_add_member(cls, host): cmd = "etcdctl member add %s http://%s:2380" % (host, host) _exec_shell1(cmd, p=True)
def _etcd_service_trystart(cls): try: cmd = "systemctl start etcd" _exec_shell1(cmd, p=False) except Exp, e: pass
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)
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()