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
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
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
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
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
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