Пример #1
0
 def pool_info(self, is_to_pb, data):
     if is_to_pb:
         pool_info = msg_pds.PoolInfo()
         pool_info.pool_id = data['pool_id']
         pool_info.pool_name = data['pool_name']
         if data.has_key('extent'): pool_info.extent = data['extent']
         if data.has_key('bucket'): pool_info.bucket = data['bucket']
         if data.has_key('sippet'): pool_info.sippet = data['sippet']
         if data.has_key('is_invalid'):
             pool_info.is_invalid = data['is_invalid']
         if data.has_key('is_rebuild'):
             pool_info.is_rebuild = data['is_rebuild']
         if data.has_key('sync_level'):
             pool_info.sync_level = data['sync_level']
         if data.has_key('skip_thresh'):
             pool_info.skip_thresh = data['skip_thresh']
         if data.has_key('is_variable'):
             pool_info.is_variable = data['is_variable']
         for _pool_disk_info in data['pool_disk_infos']:
             pool_disk_info = pool_info.pool_disk_infos.add()
             pool_disk_info.disk_id = _pool_disk_info['disk_id']
             pool_disk_info.disk_part = _pool_disk_info['disk_part']
         if data.has_key('dirty_thresh'):
             pool_info.dirty_thresh.lower = int(
                 data['dirty_thresh']['lower'])
             pool_info.dirty_thresh.upper = int(
                 data['dirty_thresh']['upper'])
         return pool_info
     else:
         pool_info = {}
         pool_info['pool_name'] = data.pool_name
         pool_info['pool_id'] = data.pool_id
         if data.HasField('extent'): pool_info['extent'] = data.extent
         if data.HasField('bucket'): pool_info['bucket'] = data.bucket
         if data.HasField('sippet'): pool_info['sippet'] = data.sippet
         if data.HasField('is_invalid'):
             pool_info['is_invalid'] = data.is_invalid
         if data.HasField('is_rebuild'):
             pool_info['is_rebuild'] = data.is_rebuild
         if data.HasField('sync_level'):
             pool_info['sync_level'] = data.sync_level
         if data.HasField('skip_thresh'):
             pool_info['skip_thresh'] = data.skip_thresh
         if data.HasField('is_variable'):
             pool_info['is_variable'] = data.is_variable
         pool_info['pool_disk_infos'] = []
         for _pool_disk_info in data.pool_disk_infos:
             pool_disk_info = {}
             pool_disk_info['disk_id'] = _pool_disk_info.disk_id
             pool_disk_info['disk_part'] = _pool_disk_info.disk_part
             pool_info['pool_disk_infos'].append(pool_disk_info)
         if data.HasField('dirty_thresh'):
             pool_info['dirty_thresh'] = {}
             pool_info['dirty_thresh']['lower'] = data.dirty_thresh.lower
             pool_info['dirty_thresh']['upper'] = data.dirty_thresh.upper
         return pool_info
Пример #2
0
    def INIT(self, request):
        self.default_timeout = 55
        self.response = MakeResponse(msg_mds.POOL_ADD_RESPONSE, request)
        self.request = request
        self.request_body = request.body.Extensions[msg_mds.pool_add_request]

        if g.is_ready == False:
            self.response.rc.retcode = msg_mds.RC_MDS_SERVICE_IS_NOT_READY
            self.response.rc.message = "MDS service is not ready"
            self.SendResponse(self.response)
            return MS_FINISH

        disk_names = self.request_body.disk_names

        # 当前仅支持单磁盘单pool配置
        if len(disk_names) > 1:
            self.response.rc.retcode = msg_mds.RC_MDS_ERROR_PARAMS
            self.response.rc.message = "Does not support multi-disk config pool "
            self.SendResponse(self.response)
            return MS_FINISH

        disk_name = disk_names[0]
        rc, self.disk_info = self.check_disk_available(disk_name)
        if rc.retcode != msg_pds.RC_SUCCESS:
            logger.run.error("Check disk faild %s:%s" %
                             (disk_name, rc.message))
            self.response.rc.CopyFrom(rc)
            self.SendResponse(self.response)
            return MS_FINISH

        pool_info = msg_pds.PoolInfo()
        if self.request_body.HasField('pool_name'):
            pool_info.pool_name = self.request_body.pool_name
        else:
            pool_info.pool_name = common.NewPoolName()
        pool_info.is_variable = self.request_body.is_variable
        pool_disk_info = pool_info.pool_disk_infos.add()
        pool_disk_info.disk_id = self.disk_info.header.uuid
        pool_disk_info.disk_part = int(disk_name.split('p')[1])
        if self.request_body.HasField('extent'):
            pool_info.extent = self.request_body.extent
        if self.request_body.HasField('bucket'):
            pool_info.bucket = self.request_body.bucket
        if self.request_body.HasField('sippet'):
            pool_info.sippet = self.request_body.sippet

        self.ios_request = MakeRequest(msg_ios.POOL_ADD_REQUEST, self.request)
        self.ios_request.body.Extensions[
            msg_ios.pool_add_request].pool_info.CopyFrom(pool_info)

        self.SendRequest(g.ios_service.listen_ip, g.ios_service.listen_port,
                         self.ios_request, self.Entry_AddPool)
        return MS_CONTINUE
Пример #3
0
    def Entry_ConfigPoolSkipThresh(self, skip_thresh):
        pool_info = msg_pds.PoolInfo()
        pool_info.CopyFrom(self.pool_info)
        pool_info.skip_thresh = self.request_body.skip_thresh

        data = pb2dict_proxy.pb2dict("pool_info", pool_info)
        e, _ = dbservice.srv.update("/pool/%s" % pool_info.pool_id, data)
        if e:
            logger.run.error("Update pool info faild %s:%s" % (e, _))
            self.response.rc.retcode = msg_mds.RC_MDS_UPDATE_DB_DATA_FAILED
            self.response.rc.message = "Keep data failed"
            self.SendResponse(self.response)
            return MS_FINISH

        self.pool_info.CopyFrom(pool_info)

        self.response.rc.retcode = msg_pds.RC_SUCCESS
        self.SendResponse(self.response)
        return MS_FINISH
Пример #4
0
    def INIT(self, request):
        self.response = MakeResponse(msg_mds.SET_POOL_DISABLE_RESPONSE,
                                     request)
        self.request = request
        self.request_body = request.body.Extensions[
            msg_mds.set_pool_disable_request]

        if g.is_ready == False:
            self.response.rc.retcode = msg_mds.RC_MDS_SERVICE_IS_NOT_READY
            self.response.rc.message = "MDS service is not ready"
            self.SendResponse(self.response)
            return MS_FINISH

        self.pool_info = common.GetPoolInfoByName(self.request_body.pool_name)
        if self.pool_info == None:
            self.response.rc.retcode = msg_mds.RC_MDS_POOL_NOT_EXIST
            self.response.rc.message = "Pool %s not exist" % self.request_body.pool_name
            self.SendResponse(self.response)
            return MS_FINISH

        if self.pool_info.is_disable == True:
            self.response.rc.retcode = msg_mds.RC_MDS_ERROR_PARAMS
            self.response.rc.message = "Pool %s already disabled" % self.request_body.pool_name
            self.SendResponse(self.response)
            return MS_FINISH

        # pool如果在线, 则不准许disable
        if self.pool_info.actual_state == True:
            self.response.rc.retcode = msg_mds.RC_MDS_NOT_SUPPORT
            self.response.rc.message = "Not support set disable to a online pool"
            self.SendResponse(self.response)
            return MS_FINISH

        # 如果pool下有palcache是在线状态, 则不准许disable
        for palcache_info in g.palcache_list.palcache_infos:
            if palcache_info.pool_id == self.pool_info.pool_id and palcache_info.actual_state == True:
                self.response.rc.retcode = msg_mds.RC_MDS_INTERNAL_ERROR
                self.response.rc.message = "Not support set disable to this pool for exist available palcache"
                self.SendResponse(self.response)
                return MS_FINISH

        # 如果pool之前没有更新is_invalid字段, 需要先更新
        pool_info = msg_pds.PoolInfo()
        pool_info.CopyFrom(self.pool_info)

        if pool_info.is_invalid != True:
            pool_info.is_invalid = True
            data = pb2dict_proxy.pb2dict("pool_info", pool_info)
            e, _ = dbservice.srv.update("/pool/%s" % pool_info.pool_id, data)
            if e:
                logger.run.error("Update pool info faild %s:%s" % (e, _))
                self.response.rc.retcode = msg_mds.RC_MDS_UPDATE_DB_DATA_FAILED
                self.response.rc.message = "Keep data failed"
                self.SendResponse(self.response)
                return MS_FINISH
            logger.run.info("Set pool %s to invalid" %
                            self.request_body.pool_name)

        pool_info.is_disable = True
        self.pool_info.CopyFrom(pool_info)
        logger.run.info("Set pool %s to diable" % self.request_body.pool_name)

        self.response.rc.retcode = msg_pds.RC_SUCCESS
        self.SendResponse(self.response)
        return MS_FINISH
Пример #5
0
    def INIT(self, request):
        self.default_timeout = 55
        self.response = MakeResponse(msg_mds.POOL_REBUILD_RESPONSE, request)
        self.request = request
        self.request_body = request.body.Extensions[
            msg_mds.pool_rebuild_request]

        if g.is_ready == False:
            self.response.rc.retcode = msg_mds.RC_MDS_SERVICE_IS_NOT_READY
            self.response.rc.message = "MDS service is not ready"
            self.SendResponse(self.response)
            return MS_FINISH

        disk_names = self.request_body.disk_names

        # 当前仅支持单磁盘单pool配置
        if len(disk_names) > 1:
            self.response.rc.retcode = msg_mds.RC_MDS_ERROR_PARAMS
            self.response.rc.message = "Does not support multi-disk config pool "
            self.SendResponse(self.response)
            return MS_FINISH

        # 查找到pool
        self.pool_info = common.GetPoolInfoByName(self.request_body.pool_name)
        if self.pool_info == None:
            self.response.rc.retcode = msg_mds.RC_MDS_POOL_NOT_EXIST
            self.response.rc.message = "Pool %s not exist" % self.request_body.pool_name
            self.SendResponse(self.response)
            return MS_FINISH

        # 非is_invalid状态的pool禁止rebuild
        if self.pool_info.is_invalid != True:
            self.response.rc.retcode = msg_mds.RC_MDS_NOT_SUPPORT
            self.response.rc.message = "Please disable pool first and reboot"
            self.SendResponse(self.response)
            return MS_FINISH

        # 如果pool下已经有palcache在运行, 则禁止执行rebuild
        for palcache_info in filter(
                lambda palcache_info: palcache_info.pool_id == self.pool_info.
                pool_id, g.palcache_list.palcache_infos):
            if palcache_info.actual_state == True:
                self.response.rc.retcode = msg_mds.RC_MDS_NOT_SUPPORT
                self.response.rc.message = "Not support for exist running palcache of pool %s" % self.pool_info.pool_name
                self.SendResponse(self.response)
                return MS_FINISH

        # 验证磁盘
        disk_name = disk_names[0]
        rc, self.disk_info = self.check_disk_available(disk_name)
        if rc.retcode != msg_pds.RC_SUCCESS:
            logger.run.error("Check disk faild %s:%s" %
                             (disk_name, rc.message))
            self.response.rc.CopyFrom(rc)
            self.SendResponse(self.response)
            return MS_FINISH

        pool_info = msg_pds.PoolInfo()
        pool_info.pool_name = self.pool_info.pool_name  # 使用老的pool名称
        pool_disk_info = pool_info.pool_disk_infos.add()
        pool_disk_info.disk_id = self.disk_info.header.uuid
        pool_disk_info.disk_part = int(disk_name.split('p')[1])
        if self.pool_info.HasField('extent'):
            pool_info.extent = self.pool_info.extent
        if self.pool_info.HasField('bucket'):
            pool_info.bucket = self.pool_info.bucket
        if self.pool_info.HasField('sippet'):
            pool_info.sippet = self.pool_info.sippet

        self.ios_request = MakeRequest(msg_ios.POOL_ADD_REQUEST, self.request)
        self.ios_request.body.Extensions[
            msg_ios.pool_add_request].pool_info.CopyFrom(pool_info)

        self.SendRequest(g.ios_service.listen_ip, g.ios_service.listen_port,
                         self.ios_request, self.Entry_AddPool)
        return MS_CONTINUE
Пример #6
0
    def INIT(self, request):
        self.response = MakeResponse(msg_mds.GET_POOL_LIST_RESPONSE, request)
        self.request = request
        self.request_body = request.body.Extensions[
            msg_mds.get_pool_list_request]

        if g.is_ready == False:
            self.response.rc.retcode = msg_mds.RC_MDS_SERVICE_IS_NOT_READY
            self.response.rc.message = "MDS service is not ready"
            self.SendResponse(self.response)
            return MS_FINISH

        for _pool_info in g.pool_list.pool_infos:
            pool_info = msg_pds.PoolInfo()
            pool_info.CopyFrom(_pool_info)

            # 补充磁盘的实时信息
            for pool_disk_info in pool_info.pool_disk_infos:
                disk_info = common.GetDiskInfoByID(pool_disk_info.disk_id)
                diskpart = common.GetDiskPartByID(pool_disk_info.disk_id,
                                                  pool_disk_info.disk_part)
                pool_disk_info.Extensions[
                    msg_mds.ext_pool_disk_info_dev_name] = diskpart.dev_name
                pool_disk_info.Extensions[
                    msg_mds.ext_pool_disk_info_disk_name] = "%sp%s" % (
                        disk_info.disk_name, pool_disk_info.disk_part)
                pool_disk_info.Extensions[
                    msg_mds.ext_pool_disk_info_size] = diskpart.size

            # 补充pool cache mode
            count = {'wb': 0, 'wt': 0, 'un': 0}
            for palcache_info in g.palcache_list.palcache_infos:
                if palcache_info.pool_id != pool_info.pool_id:
                    continue
                if not palcache_info.HasExtension(
                        msg_mds.ext_palcache_export_info):
                    continue
                if palcache_info.Extensions[
                        msg_mds.
                        ext_palcache_export_info].palcache_cache_model == msg_pds.PALCACHE_CACHE_MODEL_UNKNOWN:
                    count['un'] += 1
                if palcache_info.Extensions[
                        msg_mds.
                        ext_palcache_export_info].palcache_cache_model == msg_pds.PALCACHE_CACHE_MODEL_WRITEBACK:
                    count['wb'] += 1
                if palcache_info.Extensions[
                        msg_mds.
                        ext_palcache_export_info].palcache_cache_model == msg_pds.PALCACHE_CACHE_MODEL_WRITETHROUGH:
                    count['wt'] += 1
            if count['wb'] == 0 and count['wt'] != 0:
                pool_info.Extensions[
                    msg_mds.
                    ext_poolinfo_pool_cache_model] = msg_pds.POOL_CACHE_MODEL_WRITETHROUGH
            elif count['wb'] != 0 and count['wt'] == 0:
                pool_info.Extensions[
                    msg_mds.
                    ext_poolinfo_pool_cache_model] = msg_pds.POOL_CACHE_MODEL_WRITEBACK
            elif count['wb'] != 0 and count['wt'] != 0:
                pool_info.Extensions[
                    msg_mds.
                    ext_poolinfo_pool_cache_model] = msg_pds.POOL_CACHE_MODEL_MIX

            # 补充使用该pool的lun的总容量
            pmt_size = 0
            for palpmt_info in g.palpmt_list.palpmt_infos:
                if palpmt_info.pool_id == pool_info.pool_id:
                    pmt_size += palpmt_info.size
            pool_info.Extensions[msg_mds.ext_poolinfo_pool_pmt_size] = pmt_size

            self.response.body.Extensions[
                msg_mds.get_pool_list_response].pool_infos.add().CopyFrom(
                    pool_info)

        self.response.rc.retcode = msg_pds.RC_SUCCESS
        self.SendResponse(self.response)
        return MS_FINISH