示例#1
0
    def add(self, args):
        #check args
        update = 1
        count = 0
        data = {}
        group_list = []

        if os.path.exists(self.json_file):
            data = json_load(self.json_file)

        if len(data) != 0:
            group_list = [(k, data[k]) for k in sorted(data.keys())]
            gname, v = group_list[len(group_list) - 1]
            count = filter(str.isdigit, json.dumps(gname))

        if args:
            gname = "group" + str(int(count) + 1)
            data[gname] = {}
            group = data[gname]

            #generate vipconf json
            group['nodes'] = args.host
            group['type'] = args.type
            group['vip'] = args.vip
        else:
            update = 0

        #data = sorted(data.items(), key=lambda d: d[0])
        #modify vipconf about vip or nodes

        if update:
            json_store(data, self.config.vip_conf)
            dmsg('add vipconf sucessfully')
        else:
            dwarn('vipconf was updated.')
示例#2
0
 def _update_version(k):
     update_cmd = "echo %s > /opt/sdfs/%s/%s/status/version " % (version, k[1], k[2])
     try:
         dmsg('update meta %s %s.%s version to %s' % (k[0], k[1], k[2], version))
         exec_remote(k[0], update_cmd)
     except Exp, e:
         derror("%s : %s" % (k, e))
示例#3
0
def _get_src_nid(filename):
    master_node = 0
    net_info = ""

    while True:
        cmd = "sdfs.stat %s -v | grep master | awk '{print $7}'" % (filename)
        out, err = exec_shell(cmd, p=False, need_return=True)
        if len(out.split('\n')[0]) != 0:
            master_node = int(out.split('\n')[0])
            break

    dmsg("++++++++++++++filename:%s, master:%d+++++++++++++++" % (filename, master_node))
    if master_node == 0:
        cmd = "sdfs.stat %s -v | grep available | awk '{print $1,$2}' | tail -n1" % (filename)
    else:
        cmd = "sdfs.stat %s -v | grep available | awk '{print $1,$2}' | head -n1" % (filename)

    while True:
        out, err = exec_shell(cmd, p=False, need_return=True)
        if len(out.split('\n')[0]) != 0:
            net_info = out.split('\n')[0]
            break

    nid = net_info.split(" ")[1].split("(")[1].split(")")[0]

    return nid
示例#4
0
def vip_confdel_group(args):
    data = {}

    config = Config()
    json_file = config.vip_conf

    if os.path.exists(json_file):
        data = json_load(json_file)

    if len(data) == 0:
        dmsg('vipconf was null')
        return

    if not data.has_key(args.group):
        derror("vipconfdel: %s not exist." % (args.group))
        sys.exit(2)
    else:
        del_vips = data[args.group]["vips"]
        mask = data[args.group]["mask"]
        hosts = data[args.group]["nodes"].split(",")
        del data[args.group]
        json_store(data, json_file)

        for host in hosts:
            try:
                _del_vip_from_host(config, host, del_vips, mask)
            except Exp, e:
                print e
示例#5
0
def test_clean():
    try:
        os.system("/opt/sdfs/app/admin/node.py stop")
    except:
        pass

    os.system("pkill -9 sdfs")
    os.system("pkill -9 redis")
    dmsg("cleanup redis")
    #os.system("systemctl stop redis")
    #os.system("rm -rf /var/lib/redis/*")
    #os.system("systemctl start redis")
    dmsg("cleanup etcd")
    os.system("systemctl stop etcd")
    os.system("rm -rf `grep ETCD_DATA_DIR /etc/etcd/etcd.conf | awk -F '=' '{print $2}' | sed  's/\"//g'`")
    os.system("rm -rf /etc/etcd/etcd.conf")
    os.system("rm -rf /var/lib/etcd/*")
    os.system("chown etcd /var/lib/etcd")

    try:
        os.system("rm -rf %s" % (TEST_PATH))
    except Exp, e:
        #加try是为了规避目录非空的错误
        #目录下会存在 uss.mdstat todo 查下原因
        pass
示例#6
0
文件: redisd.py 项目: jiashimeng/sdfs
    def __check_volume__(self, volume):
        #print volume
        try:
            sharding = int(
                self.etcd.read("/sdfs/volume/" + volume + "/sharding").value)
            replica = int(
                self.etcd.read("/sdfs/volume/" + volume + "/replica").value)

            #dmsg("%s sharding %d replica %d" % (volume, sharding, replica))
        except etcd.EtcdKeyNotFound:
            return False

        lst = []
        for i in range(sharding):
            slot = "/sdfs/volume/%s/slot/%d/redis" % (volume, i)
            try:
                r = self.etcd.read(slot)._children
                for i in r:
                    lst.append(i["key"])
            except etcd.EtcdKeyNotFound:
                pass

        #print "sharing + replica :" + str(lst)

        count = sharding * replica - len(lst)
        if (count == 0):
            #dmsg("%s registed" % (volume))
            return False
        else:
            dmsg("%s need registed" % (volume))

        for i in range(count):
            self.__register(volume)
示例#7
0
    def bind_cache(self, cachedev, coredevs):
        """
        :todo if coredev is a member of ANOTHER cset

        :param cachedev:
        :param coredev:
        :return:
        """
        force = True

        self.ensure_cache_dev(cachedev, force)

        for coredev in coredevs.split(','):
            if self.is_coredev(coredev):
                if force:
                    if self.is_attached_to_cache(coredev, cachedev):
                        if not self._check_mappingdev_exists(coredev):
                            raise Exp(errno.ENOENT, "%s mapping disk not exists, please check it !\n" % (coredev))

                        dmsg("%s already attached to cache device : %s, just ignore it !" % (coredev, cachedev))
                        return
                    else:
                        dmsg("dev:%s is a core device, will force destroy it!" % coredev)
                        self.__del_coredev_no_detach(coredev)
                        time.sleep(1)
                else:
                    raise Exp(errno.EPERM, "dev:%s is already a core device, please check it" % (coredev))

            self.create_coredev(coredev)
            self._add_coredev_to_cache(coredev, cachedev)
示例#8
0
文件: redisd.py 项目: iesool/sdfs
    def __wait_sync(self):
        dbversion_local = self.__redis_dbversion()

        dbversion_etcd = int(self.__etcd_get("dbversion"))

        blocklist = "blocklist/" + self.hostname + ":" + self.port
        blocked = None
        try:
            blocked = self.__etcd_get(blocklist)
        except etcd.EtcdKeyNotFound:
            pass

        if (dbversion_etcd == dbversion_local or not blocked):
            return

        derror("dbversion not equal local %d remote %d" %
               (dbversion_local, dbversion_etcd))

        self.__etcd_set(blocklist, "blocked")
        master = self.__run_slave__()

        while (1):
            info = self.__get_replica_info()
            if (info['master_repl_offset'] == info['slave_repl_offset']):
                break

        dmsg("sync finish from master %s, remove block %s\n" %
             s(master, blocklist))
        self.__etcd_delete(blocklist)
示例#9
0
文件: test.py 项目: jiashimeng/sdfs
def test():
    script_path = os.path.join(CUR_PATH, 'script')

    #test_objmv()

    exec_shell(
        "python2 %s/test_list.py --length 10 --home %s >> %s/fileop.log 2>&1" %
        (CUR_PATH, TEST_PATH, LOG_PATH))
    exec_shell(
        "python2 %s/nfs_test.py --home %s  >> %s/nfs.log 2>&1 && sync && umount /mnt/nfs"
        % (script_path, TEST_PATH, LOG_PATH))
    exec_shell("python2 %s/ftp_test.py --home %s  >> %s/ftp.log 2>&1" %
               (script_path, TEST_PATH, LOG_PATH))
    #exec_shell("python2 %s/quota_test.py  >> %s/misc.log 2>&1" % (script_path, LOG_PATH))
    exec_shell("python2 %s/group_test.py  >> %s/misc.log 2>&1" %
               (script_path, LOG_PATH))
    exec_shell("python2 %s/user_test.py >> %s/misc.log 2>&1" %
               (script_path, LOG_PATH))
    exec_shell("python2 %s/share_test.py  >> %s/misc.log 2>&1" %
               (script_path, LOG_PATH))
    """
    """

    #exec_shell("python2 %s/fuse_test.py --home %s" % (CUR_PATH, TEST_PATH))
    #exec_shell("python2 %s/flock.py" % (script_path))
    #umount_nfsv4()
    #time.sleep(2)
    dmsg("test all successfully")
示例#10
0
文件: redisd.py 项目: iesool/sdfs
    def __exit(self):
        self.running = False

        self.remove()

        try:
            dmsg("%s waiting lock thread exiting ..." % (self.workdir))
            self.lockthread.join()
            dmsg("lock thread exited")
        except AttributeError:
            pass

        try:
            dmsg("%s waiting mainloop thread exiting ..." % (self.workdir))
            self.loop.join()
            dmsg("%s mainloop thread exited" % (self.workdir))
        except AttributeError:
            pass

        self.redis_stop()

        removedir = self.workdir + "/../removed"
        cmd = "mkdir -p " + removedir
        print cmd
        os.system(cmd)
        cmd = "mv %s %s/%d.%s" % (self.workdir, removedir, self.localid,
                                  str(uuid.uuid1()))
        print cmd
        os.system(cmd)

        dmsg("%s exited" % (self.workdir))
示例#11
0
    def update(self):
        if (self.updateable == False):
            return

        idx = 0
        total = len(self.dict.items())
        for (k, v) in self.dict.items():
            idx += 1
            self.dict[k] = v + str(uuid.uuid1())

        for (k, v) in self.dict.items():
            cmd_update = self.cmd_update(k, v)

            retry = 0
            while (1):
                dmsg(cmd_update + '[%d/%d]' % (idx, total) + " retry %d" % (retry))
                try:
                    test_exec(cmd_update)
                except Exp, e:
                    if (e.errno == errno.EIO or retry > 300):
                        raise

                    time.sleep(1)
                    retry = retry + 1
                    continue
                break
示例#12
0
文件: redisd.py 项目: iesool/sdfs
 def __init_redis_master(self, config):
     try:
         self.__etcd_create("dbversion", "0")
         dmsg("create dbversion " + str(self.id))
     except etcd.EtcdAlreadyExist:
         dmsg("dbversion exist")
         pass
示例#13
0
文件: redisd.py 项目: iesool/sdfs
    def __init_register_port(self, path, hostname):
        prefix = "/sdfs/redis/%s" % (hostname)

        if (os.path.exists(path + "/port")):
            self.port_idx = int(get_value(path + "/port"))
            self.port = str(self.config.redis_baseport + self.port_idx)
            return True

        idx = None
        for i in range(NODE_PORT):
            key = prefix + "/port/" + str(i)
            try:
                #dmsg("etcd write " + key)
                self.etcd.write(key, "", prevExist=False)
                idx = i
                break
            except etcd.EtcdAlreadyExist:
                continue

        if (idx == None):
            derror("no port space in " + prefix)
            return False
        else:
            dmsg("register port " + str(idx))
            set_value(path + "/port", str(idx))
            self.port_idx = idx
            self.port = str(self.config.redis_baseport + self.port_idx)
            return True
示例#14
0
文件: test.py 项目: suzaku2019/suzaku
def new_test(args):
    dmsg("test begin, log is in %s" % (LOG_PATH))
    pool = "default"
    os.system("rm -rf %s" % (LOG_PATH))
    os.system("mkdir -p %s" % (LOG_PATH))
    cmd = "python2 " + os.path.abspath(os.path.split(os.path.realpath(__file__))[0]) + "/docker.py create --pool %s >> %s/docker.log 2>&1" % (pool, LOG_PATH)
    print cmd
    os.system(cmd)
    
    begin = time.time()
    global RUNNING
    RUNNING = 1

    """
    if not args.nofail:
        fail_simulate()

    time.sleep(3)
    """

    try:
        test(pool)
    except Exception, e:
        print 'test fail'
        print e
        RUNNING = 0
        end = time.time()
        print "used %s!" % (end - begin)
        kill9_self()
        exit(e.errno)
示例#15
0
    def create(self):
        idx = 0
        total = len(self.dict.items())
        for (k, v) in self.dict.items():
            idx += 1
            cmd_create = self.cmd_create(k, v)
            cmd_remove = self.cmd_remove(k, v)

            retry = 0
            while (1):
                dmsg(cmd_create + '[%d/%d]' % (idx, total) + " retry %d" % (retry))
                try:
                    test_exec(cmd_create)
                except Exp, e:
                    if (e.errno == errno.EIO or retry > 300):
                        raise

                    if (e.errno == errno.EEXIST):
                        if (retry == 0):
                            raise Exp(errno.EEXIST, "create fail, exist")
                        else:
                            try:
                                test_exec(cmd_remove)
                            except Exp, e:
                                pass

                    time.sleep(1)
                    retry = retry + 1
                    continue
                break
示例#16
0
文件: redisd.py 项目: YuepingJin/sdfs
    def __register(self, volume):
        workdir = None
        for i in range(DISK_INSTENCE):
            dir = "%s/%d" % (self.workdir, i)
            if (os.path.exists(dir + "/config")):
                continue

            cmd = "mkdir " + dir
            os.system(cmd)
            workdir = dir
            break

        if not workdir:
            return False

        dmsg("workdir: " + workdir)

        redis = Redisd(workdir, self.diskid, self.localid)
        if not redis.init(volume):
            dwarn("register %s to %s fail\n" % (workdir, volume))
            return False

        redis = Redisd(workdir, self.diskid, self.localid)
        redis.start_loop()
        self.instence.append(redis)

        self.__update_instence()

        return True
示例#17
0
def _check(config, src_dir):
    src_file_list = list_dir(config, src_dir)
    if len(src_file_list) == 0:
        dmsg("transfer ok")
        return True
    else:
        map(print_file, src_file_list)
        sys.exit(EAGAIN)
示例#18
0
 def _warp(h):
     try:
         dmsg("try set vip:%s on host:%s..." % (dic[h], h))
         cmd = "%s setvip --vips %s --mask %s" % (config.uss_node, dic[h], mask)
         exec_remote(h, cmd)
         dmsg("set vip:%s on host:%s ok..." % (dic[h], h))
     except Exp, e:
         derror("%s : %s" % (h, e))
示例#19
0
def test_mkdir(config):
    try:
        _exec_mkdir = "%s /zz" % (config.uss_mkdir)
        exec_shell(_exec_mkdir)
        _exec_stat = "%s /zz" % (config.uss_stat)
        exec_shell(_exec_stat)
    except Exp, err:
        dmsg("test_mkdir or test_stat failed\n")
        sys.exit(-1)
示例#20
0
    def __update_dbversion(self):
        dbversion = self.__etcd_update_dbversion()
        if (dbversion == -1):
            dwarn("%s master fail, update dbversion\n" % (self.workdir))
            return

        dmsg("update dbversion to %d" % (dbversion))
        cmd = "redis-cli -h %s -p %s set dbversion %d" % (self.hostname, self.port, dbversion)
        os.system(cmd)
示例#21
0
文件: redisd.py 项目: YuepingJin/sdfs
    def __update_instence(self):
        key = "/sdfs/redis/%s/disk/%d/instence" % (self.hostname, self.localid)

        dmsg("etcd write " + key)
        self.etcd.write(key, str(len(self.instence)))

        key = "/sdfs/redis/%s/disk/%d/trigger" % (self.hostname, self.localid)
        dmsg("etcd write " + key)
        self.etcd.write(key, "0")
示例#22
0
def move_vip(config, from_host, to_host, vip, mask):
    if not _check_vip_isexist(config, from_host, vip):
        dwarn("vip:%s not exist on host:%s" % (vip, from_host))
        return

    _del_vip_from_host(config, from_host, vip, mask)
    dmsg("del vip %s from %s ok" % (vip, from_host))
    _add_vip_to_host(config, to_host, vip, mask)
    dmsg("add vip %s to %s ok" % (vip, to_host))
示例#23
0
文件: redisd.py 项目: iesool/sdfs
 def __init_register_new__(self, slot, replica, addr):
     key = "/sdfs/volume/%s/slot/%d/redis/%d" % (self.volume, slot, replica)
     dmsg("set (%s, %s)" % (key, addr))
     try:
         #dmsg("etcd write " + key)
         self.etcd.write(key, addr, prevExist=False)
         #dmsg("key %s succss" % (key))
         return True
     except etcd.EtcdAlreadyExist:
         dmsg("key %s exist" % (key))
         return False
示例#24
0
def delete_client_by_host(content, export_id, host):
    if host is None:
        dmsg("error : must specify host value ")
        sys.exit(-1)
    export_block = build_export_block(export_id, host)
    block = BLOCK(export_block)

    try:
        new = block.del_keys(content, [])
    except ArgError as e:
        sys.exit(e.error)
    modify_file(CONF_PATH, new)
示例#25
0
    def _start(self, ttyonly=False):
        cmd = None
        if self.role == "mdctl":
            cmd = "%s --home %s" % (self.config.uss_mdctl, self.home)
        elif self.role == "bactl":
            self.start_redis()

            cmd = "%s --home %s" % (self.config.uss_bactl, self.home)
        elif self.role == "frctl":
            #cmd = "systemctl start rpcbind"
            #exec_shell(cmd)

            cmd = "%s --home %s" % (self.config.uss_yfrctl, self.home)
        if (self.disk_status):
            derror(' * %s [disk error]' % (cmd), ttyonly)
            return 1

        if (self.nomount):
            derror(' * %s [no mount]' % (cmd), ttyonly)
            return 1

        if (self.deleted):
            derror(' * %s [deleted]' % (cmd), ttyonly)
            return 1

        if (self.skiped):
            derror(' * %s [skiped]' % (cmd), ttyonly)
            return 1

        if (self.running()):
            dwarn(' * %s [running]' % (cmd), ttyonly)
            return 1

        if self.config.testing and self.config.valgrind:
            valgrind = "valgrind --tool=memcheck --leak-check=full  --show-reachable=yes -v "
            logdir = "%s/log/" % (self.config.home)
            os.system("mkdir -p %s" % (logdir))
            vallog = "%s/log/valgrind.%s.%s.log" % (self.config.home,
                                                    self.role, self.service)
            cmd = "%s %s -f >>%s 2>&1 &" % (valgrind, cmd, vallog)
            dmsg(cmd)

        if (cmd == None):
            derror(' * %s skip' % (self.home), ttyonly)
            return

        subprocess.call(cmd, shell=True, close_fds=True)

        try:
            self.__getpid(ttyonly)
        except Exp, e:
            dwarn('%s' % (e.err), ttyonly)
            return e.errno
示例#26
0
def test_touch(config):
    for i in range(100):
        try:
            _exec_touch = "%s /zz/zz%d" % (config.uss_touch, i)
            exec_shell(_exec_touch)
            _exec_stat = "%s /zz/zz%d" % (config.uss_stat, i)
            exec_shell(_exec_stat)
            _exec_rm = "%s /zz/zz%d" % (config.uss_rm, i)
            exec_shell(_exec_rm)
        except Exp, err:
            dmsg("test_touch or test_stat failed\n")
            sys.exit(-1)
示例#27
0
    def tenant_list(self):
        no_tenant = True

        for f in os.listdir(MINIO_CONF_PATH):
            name,port = self._split_dirname(f)
            dmsg("\ttenant:%s\t\tport:%s" % (name, port))
            no_tenant = False

        if no_tenant:
            dmsg("\tno tenant !")

        return
示例#28
0
def test_coredump():
    """
    检查是否有core产生, 如果有就exit
    """
    p = "%s/core/" % (TEST_PATH)
    cores = os.listdir(p)
    if (len(cores)):
        dmsg("%s cores: %s" % (p, cores))
    if cores:
        #raise Exp(1, "has core %s" % str(cores))
        derror("has core %s" % str(cores))
        exit(errno.EPERM)
示例#29
0
def vip_add(args):
    #check args
    if not is_valid_args(args):
        derror('please check args')
        sys.exit(1)

    update = 1
    count = 0
    data = {}
    group_list = []

    config = Config()
    json_file = config.vip_conf

    if os.path.exists(json_file):
        data = json_load(json_file)

    args.host = list_distinct(args.host)
    args.vip = list_distinct(args.vip)

    if len(data) != 0:
        group_list = [(k, data[k]) for k in sorted(data.keys())]
        for k,v in group_list:
            if v['nodes'] == args.host and v['vips'] == args.vip \
                and v['type'] == args.type and v['mask'] == args.mask:
                update = 0
                break

        gname, v = group_list[len(group_list) - 1]
        count = filter(str.isdigit, json.dumps(gname))

    if args:
        gname = "group" + str(int(count)+1)
        data[gname] = {}
        group = data[gname]

        #generate vipconf json
        group['nodes'] = args.host
        group['type'] = args.type
        group['vips'] = args.vip
        group['mask'] = args.mask
    else:
        update = 0

    #data = sorted(data.items(), key=lambda d: d[0])
    #modify vipconf about vip or nodes

    if update:
        json_store(data, json_file)
        dmsg('add vipconf sucessfully')
    else:
        dwarn('vipconf was updated.')
示例#30
0
 def create(self, hosts):
     #self._add_check_env(hosts)
     dmsg("update ...")
     self.update(hosts=hosts)
     dmsg("init etcd ...")
     self._init_etcd(hosts=hosts)
     dmsg("init cluster config ...")
     conf = ClusterConf(config=self.config, lock=False)
     dmsg("add node ...")
     self.config = conf.add_node(hosts)
     self._init_env(hosts)
     dmsg("start service ...")
     self._start_service(hosts)