add checker for system_memory and memory_limit
This commit is contained in:
		| @ -108,7 +108,7 @@ int ObHeartBeatProcess::init_lease_request(ObLeaseRequest &lease_request) | |||||||
|     lease_request.resource_info_.report_cpu_max_assigned_ = svr_res_assigned.max_cpu_; |     lease_request.resource_info_.report_cpu_max_assigned_ = svr_res_assigned.max_cpu_; | ||||||
|     lease_request.resource_info_.report_mem_assigned_ = svr_res_assigned.memory_size_; |     lease_request.resource_info_.report_mem_assigned_ = svr_res_assigned.memory_size_; | ||||||
|     lease_request.resource_info_.mem_in_use_ = 0; |     lease_request.resource_info_.mem_in_use_ = 0; | ||||||
|     lease_request.resource_info_.mem_total_ = GCONF.get_server_memory_avail(); |     lease_request.resource_info_.mem_total_ = GMEMCONF.get_server_memory_avail(); | ||||||
|     lease_request.resource_info_.disk_total_ |     lease_request.resource_info_.disk_total_ | ||||||
|         = OB_SERVER_BLOCK_MGR.get_total_macro_block_count() * OB_SERVER_BLOCK_MGR.get_macro_block_size(); |         = OB_SERVER_BLOCK_MGR.get_total_macro_block_count() * OB_SERVER_BLOCK_MGR.get_macro_block_size(); | ||||||
|     lease_request.resource_info_.disk_in_use_ |     lease_request.resource_info_.disk_in_use_ | ||||||
|  | |||||||
| @ -1312,6 +1312,8 @@ int ObServer::init_config() | |||||||
|     // nop |     // nop | ||||||
|   } else if (OB_FAIL(config_.strict_check_special())) { |   } else if (OB_FAIL(config_.strict_check_special())) { | ||||||
|     LOG_ERROR("some config setting is not valid", KR(ret)); |     LOG_ERROR("some config setting is not valid", KR(ret)); | ||||||
|  |   } else if (OB_FAIL(GMEMCONF.reload_config(config_))) { | ||||||
|  |     LOG_ERROR("reload memory config failed", KR(ret)); | ||||||
|   } else if (OB_FAIL(set_running_mode())) { |   } else if (OB_FAIL(set_running_mode())) { | ||||||
|     LOG_ERROR("set running mode failed", KR(ret)); |     LOG_ERROR("set running mode failed", KR(ret)); | ||||||
|   } else { |   } else { | ||||||
| @ -1369,7 +1371,7 @@ int ObServer::init_config() | |||||||
| int ObServer::set_running_mode() | int ObServer::set_running_mode() | ||||||
| { | { | ||||||
|   int ret = OB_SUCCESS; |   int ret = OB_SUCCESS; | ||||||
|   const int64_t memory_limit = GCONF.get_server_memory_limit(); |   const int64_t memory_limit = GMEMCONF.get_server_memory_limit(); | ||||||
|   if (memory_limit < lib::ObRunningModeConfig::MINI_MEM_LOWER) { |   if (memory_limit < lib::ObRunningModeConfig::MINI_MEM_LOWER) { | ||||||
|     ret = OB_MACHINE_RESOURCE_NOT_ENOUGH; |     ret = OB_MACHINE_RESOURCE_NOT_ENOUGH; | ||||||
|     LOG_ERROR("memory limit too small", KR(ret), K(memory_limit)); |     LOG_ERROR("memory limit too small", KR(ret), K(memory_limit)); | ||||||
| @ -1422,7 +1424,7 @@ int ObServer::init_pre_setting() | |||||||
|  |  | ||||||
|   // total memory limit |   // total memory limit | ||||||
|   if (OB_SUCC(ret)) { |   if (OB_SUCC(ret)) { | ||||||
|     const int64_t limit_memory = config_.get_server_memory_limit(); |     const int64_t limit_memory = GMEMCONF.get_server_memory_limit(); | ||||||
|     const int64_t reserved_memory = std::min(config_.cache_wash_threshold.get_value(), |     const int64_t reserved_memory = std::min(config_.cache_wash_threshold.get_value(), | ||||||
|         static_cast<int64_t>(static_cast<double>(limit_memory) * KVCACHE_FACTOR)); |         static_cast<int64_t>(static_cast<double>(limit_memory) * KVCACHE_FACTOR)); | ||||||
|     const int64_t reserved_urgent_memory = config_.memory_reserved; |     const int64_t reserved_urgent_memory = config_.memory_reserved; | ||||||
| @ -1497,7 +1499,7 @@ int ObServer::init_io() | |||||||
|  |  | ||||||
|   if (OB_SUCC(ret)) { |   if (OB_SUCC(ret)) { | ||||||
|     static const double IO_MEMORY_RATIO = 0.2; |     static const double IO_MEMORY_RATIO = 0.2; | ||||||
|     if (OB_FAIL(ObIOManager::get_instance().init(GCONF.get_reserved_server_memory() * IO_MEMORY_RATIO))) { |     if (OB_FAIL(ObIOManager::get_instance().init(GMEMCONF.get_reserved_server_memory() * IO_MEMORY_RATIO))) { | ||||||
|       LOG_ERROR("init io manager fail, ", KR(ret)); |       LOG_ERROR("init io manager fail, ", KR(ret)); | ||||||
|     } else { |     } else { | ||||||
|       ObIOConfig io_config; |       ObIOConfig io_config; | ||||||
|  | |||||||
| @ -126,7 +126,8 @@ int ObServerReloadConfig::operator()() | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   { |   { | ||||||
|     const int64_t limit_memory = GCONF.get_server_memory_limit(); |     GMEMCONF.reload_config(GCONF); | ||||||
|  |     const int64_t limit_memory = GMEMCONF.get_server_memory_limit(); | ||||||
|     const int64_t reserved_memory = GCONF.cache_wash_threshold; |     const int64_t reserved_memory = GCONF.cache_wash_threshold; | ||||||
|     const int64_t reserved_urgent_memory = GCONF.memory_reserved; |     const int64_t reserved_urgent_memory = GCONF.memory_reserved; | ||||||
|     LOG_INFO("set limit memory", K(limit_memory)); |     LOG_INFO("set limit memory", K(limit_memory)); | ||||||
| @ -172,7 +173,7 @@ int ObServerReloadConfig::operator()() | |||||||
|  |  | ||||||
|  |  | ||||||
|   const int64_t cache_size = GCONF.memory_chunk_cache_size; |   const int64_t cache_size = GCONF.memory_chunk_cache_size; | ||||||
|   const int cache_cnt = (cache_size > 0 ? cache_size : GCONF.get_server_memory_limit()) / INTACT_ACHUNK_SIZE; |   const int cache_cnt = (cache_size > 0 ? cache_size : GMEMCONF.get_server_memory_limit()) / INTACT_ACHUNK_SIZE; | ||||||
|   lib::AChunkMgr::instance().set_max_chunk_cache_cnt(cache_cnt); |   lib::AChunkMgr::instance().set_max_chunk_cache_cnt(cache_cnt); | ||||||
|   if (GCONF.cluster_id.get_value() >= 0) { |   if (GCONF.cluster_id.get_value() >= 0) { | ||||||
|     obrpc::ObRpcNetHandler::CLUSTER_ID = GCONF.cluster_id.get_value(); |     obrpc::ObRpcNetHandler::CLUSTER_ID = GCONF.cluster_id.get_value(); | ||||||
|  | |||||||
| @ -83,7 +83,7 @@ int ObAllVirtualServer::inner_get_next_row(ObNewRow *&row) | |||||||
|     const double cpu_capacity_max = (cpu_capacity * hard_limit) / 100; |     const double cpu_capacity_max = (cpu_capacity * hard_limit) / 100; | ||||||
|     const double cpu_assigned = svr_res_assigned.min_cpu_; |     const double cpu_assigned = svr_res_assigned.min_cpu_; | ||||||
|     const double cpu_assigned_max = svr_res_assigned.max_cpu_; |     const double cpu_assigned_max = svr_res_assigned.max_cpu_; | ||||||
|     const int64_t mem_capacity = GCONF.get_server_memory_avail(); |     const int64_t mem_capacity = GMEMCONF.get_server_memory_avail(); | ||||||
|     const int64_t mem_assigned = svr_res_assigned.memory_size_; |     const int64_t mem_assigned = svr_res_assigned.memory_size_; | ||||||
|     const int64_t data_disk_capacity = |     const int64_t data_disk_capacity = | ||||||
|         OB_SERVER_BLOCK_MGR.get_total_macro_block_count() * OB_SERVER_BLOCK_MGR.get_macro_block_size(); |         OB_SERVER_BLOCK_MGR.get_total_macro_block_count() * OB_SERVER_BLOCK_MGR.get_macro_block_size(); | ||||||
| @ -162,7 +162,7 @@ int ObAllVirtualServer::inner_get_next_row(ObNewRow *&row) | |||||||
|           cur_row_.cells_[i].set_int(ssl_cert_expired_time); |           cur_row_.cells_[i].set_int(ssl_cert_expired_time); | ||||||
|           break; |           break; | ||||||
|         case MEMORY_LIMIT: |         case MEMORY_LIMIT: | ||||||
|           cur_row_.cells_[i].set_int(GCONF.get_server_memory_limit()); |           cur_row_.cells_[i].set_int(GMEMCONF.get_server_memory_limit()); | ||||||
|           break; |           break; | ||||||
|         default: { |         default: { | ||||||
|           ret = OB_ERR_UNEXPECTED; |           ret = OB_ERR_UNEXPECTED; | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								src/share/cache/ob_kv_storecache.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								src/share/cache/ob_kv_storecache.cpp
									
									
									
									
										vendored
									
									
								
							| @ -167,8 +167,8 @@ ObKVGlobalCache &ObKVGlobalCache::get_instance() | |||||||
|  |  | ||||||
| int64_t ObKVGlobalCache::get_suitable_bucket_num() | int64_t ObKVGlobalCache::get_suitable_bucket_num() | ||||||
| { | { | ||||||
|   int64_t server_memory_factor = upper_align(GCONF.get_server_memory_limit(), BASE_SERVER_MEMORY_FACTOR) / BASE_SERVER_MEMORY_FACTOR; |   int64_t server_memory_factor = upper_align(GMEMCONF.get_server_memory_limit(), BASE_SERVER_MEMORY_FACTOR) / BASE_SERVER_MEMORY_FACTOR; | ||||||
|   int64_t reserved_memory = GCONF.get_reserved_server_memory() * MAX_RESERVED_MEMORY_RATIO; |   int64_t reserved_memory = GMEMCONF.get_reserved_server_memory() * MAX_RESERVED_MEMORY_RATIO; | ||||||
|   int64_t bucket_num = DEFAULT_BUCKET_NUM; |   int64_t bucket_num = DEFAULT_BUCKET_NUM; | ||||||
|   for (int64_t bucket_level = MAX_BUCKET_NUM_LEVEL -1; bucket_level > 0; bucket_level--) { |   for (int64_t bucket_level = MAX_BUCKET_NUM_LEVEL -1; bucket_level > 0; bucket_level--) { | ||||||
|     if ((1 << bucket_level) > server_memory_factor) { |     if ((1 << bucket_level) > server_memory_factor) { | ||||||
|  | |||||||
| @ -31,6 +31,7 @@ namespace oceanbase | |||||||
| { | { | ||||||
| namespace common | namespace common | ||||||
| { | { | ||||||
|  |  | ||||||
| int64_t get_cpu_count() | int64_t get_cpu_count() | ||||||
| { | { | ||||||
|   int64_t cpu_cnt = GCONF.cpu_count; |   int64_t cpu_cnt = GCONF.cpu_count; | ||||||
| @ -77,46 +78,6 @@ bool ObServerConfig::in_upgrade_mode() const | |||||||
|   return bret; |   return bret; | ||||||
| } | } | ||||||
|  |  | ||||||
| int64_t ObServerConfig::get_server_memory_limit() |  | ||||||
| { |  | ||||||
|   int64_t memory = 0; |  | ||||||
|   if (0 != memory_limit.get()) { |  | ||||||
|     memory = memory_limit; |  | ||||||
|   } else { |  | ||||||
|     memory = get_phy_mem_size() * memory_limit_percentage / 100; |  | ||||||
|   } |  | ||||||
|   return memory; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int64_t ObServerConfig::get_server_memory_avail() |  | ||||||
| { |  | ||||||
|   return get_server_memory_limit() - get_reserved_server_memory(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int64_t ObServerConfig::get_reserved_server_memory() |  | ||||||
| { |  | ||||||
|   int64_t system_memory_b = system_memory; |  | ||||||
|   if (0 == system_memory_b) { |  | ||||||
|     int64_t memory_limit_g = get_server_memory_limit() >> 30; |  | ||||||
|     if (memory_limit_g < 4) { |  | ||||||
|       OB_LOG(ERROR, "memory_limit with unexpected value", K(memory_limit_g)); |  | ||||||
|     } else if (memory_limit_g <= 8) { |  | ||||||
|       system_memory_b = 2LL << 30; |  | ||||||
|     } else if (memory_limit_g <= 16) { |  | ||||||
|       system_memory_b = 3LL << 30; |  | ||||||
|     } else if (memory_limit_g <= 32) { |  | ||||||
|       system_memory_b = 5LL << 30; |  | ||||||
|     } else if (memory_limit_g <= 48) { |  | ||||||
|       system_memory_b = 7LL << 30; |  | ||||||
|     } else if (memory_limit_g <= 64) { |  | ||||||
|       system_memory_b = 10LL << 30; |  | ||||||
|     } else { |  | ||||||
|       system_memory_b = int64_t(15 + 3 * (sqrt(memory_limit_g) - 8)) << 30; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   return system_memory_b; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int ObServerConfig::read_config() | int ObServerConfig::read_config() | ||||||
| { | { | ||||||
|   int ret = OB_SUCCESS; |   int ret = OB_SUCCESS; | ||||||
| @ -237,6 +198,64 @@ int ObServerConfig::deserialize_with_compat(const char *buf, const int64_t data_ | |||||||
|   return ret; |   return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | ObServerMemoryConfig::ObServerMemoryConfig() | ||||||
|  |   : memory_limit_(0), system_memory_(0) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | ObServerMemoryConfig &ObServerMemoryConfig::get_instance() | ||||||
|  | { | ||||||
|  |   static ObServerMemoryConfig memory_config; | ||||||
|  |   return memory_config; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int ObServerMemoryConfig::reload_config(const ObServerConfig& server_config)  | ||||||
|  | { | ||||||
|  |   int ret = OB_SUCCESS; | ||||||
|  |   int64_t memory_limit = server_config.memory_limit; | ||||||
|  |   if (0 == memory_limit) { | ||||||
|  |     memory_limit = get_phy_mem_size() * server_config.memory_limit_percentage / 100; | ||||||
|  |   } | ||||||
|  |   int64_t system_memory = server_config.system_memory; | ||||||
|  |   if (0 == system_memory) { | ||||||
|  |     int64_t memory_limit_g = memory_limit >> 30; | ||||||
|  |     if (memory_limit_g < 4) { | ||||||
|  |       LOG_ERROR("memory_limit with unexpected value", K(memory_limit)); | ||||||
|  |     } else if (memory_limit_g <= 8) { | ||||||
|  |       system_memory = 2LL << 30; | ||||||
|  |     } else if (memory_limit_g <= 16) { | ||||||
|  |       system_memory = 3LL << 30; | ||||||
|  |     } else if (memory_limit_g <= 32) { | ||||||
|  |       system_memory = 5LL << 30; | ||||||
|  |     } else if (memory_limit_g <= 48) { | ||||||
|  |       system_memory = 7LL << 30; | ||||||
|  |     } else if (memory_limit_g <= 64) { | ||||||
|  |       system_memory = 10LL << 30; | ||||||
|  |     } else { | ||||||
|  |       system_memory = int64_t(15 + 3 * (sqrt(memory_limit_g) - 8)) << 30; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   if (memory_limit > system_memory) { | ||||||
|  |     memory_limit_ = memory_limit; | ||||||
|  |     system_memory_ = system_memory; | ||||||
|  |     LOG_INFO("update memory_limit or system_memory success",  | ||||||
|  |               K(memory_limit_), K(system_memory_)); | ||||||
|  |   } else { | ||||||
|  |     ret = OB_INVALID_CONFIG; | ||||||
|  |     LOG_ERROR("update memory_limit or system_memory failed",  | ||||||
|  |               K(memory_limit), K(system_memory)); | ||||||
|  |   } | ||||||
|  |   return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ObServerMemoryConfig::set_server_memory_limit(int64_t memory_limit) | ||||||
|  | { | ||||||
|  |   if (memory_limit > system_memory_) { | ||||||
|  |     LOG_INFO("update memory_limit success", K(memory_limit), K(system_memory_)); | ||||||
|  |   } else { | ||||||
|  |     LOG_ERROR("update memory_limit failed", K(memory_limit), K(system_memory_)); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| OB_DEF_SERIALIZE(ObServerConfig) | OB_DEF_SERIALIZE(ObServerConfig) | ||||||
| { | { | ||||||
|   int ret = OB_SUCCESS; |   int ret = OB_SUCCESS; | ||||||
|  | |||||||
| @ -18,6 +18,10 @@ | |||||||
|  |  | ||||||
| namespace oceanbase | namespace oceanbase | ||||||
| { | { | ||||||
|  | namespace unittest | ||||||
|  | { | ||||||
|  |   class ObSimpleClusterTestBase; | ||||||
|  | } | ||||||
| namespace common | namespace common | ||||||
| { | { | ||||||
| class ObISQLClient; | class ObISQLClient; | ||||||
| @ -46,10 +50,12 @@ const char* const EXTERNAL_KMS_INFO = "external_kms_info"; | |||||||
| const char* const SSL_EXTERNAL_KMS_INFO = "ssl_external_kms_info"; | const char* const SSL_EXTERNAL_KMS_INFO = "ssl_external_kms_info"; | ||||||
| const char* const CLUSTER_ID = "cluster_id"; | const char* const CLUSTER_ID = "cluster_id"; | ||||||
| const char* const CLUSTER_NAME = "cluster"; | const char* const CLUSTER_NAME = "cluster"; | ||||||
|  | class ObServerMemoryConfig; | ||||||
|  |  | ||||||
| class ObServerConfig : public ObCommonConfig | class ObServerConfig : public ObCommonConfig | ||||||
| { | { | ||||||
| public: | public: | ||||||
|  |   friend class ObServerMemoryConfig; | ||||||
|   int init(const ObSystemConfig &config); |   int init(const ObSystemConfig &config); | ||||||
|   static ObServerConfig &get_instance(); |   static ObServerConfig &get_instance(); | ||||||
|  |  | ||||||
| @ -63,13 +69,6 @@ public: | |||||||
|   // print all config to log file |   // print all config to log file | ||||||
|   void print() const; |   void print() const; | ||||||
|  |  | ||||||
|   // server memory limit |  | ||||||
|   int64_t get_server_memory_limit(); |  | ||||||
|   // server memory available for normal tenants |  | ||||||
|   int64_t get_server_memory_avail(); |  | ||||||
|   // server momory reserved for internal usage. |  | ||||||
|   int64_t get_reserved_server_memory(); |  | ||||||
|  |  | ||||||
|   double get_sys_tenant_default_min_cpu() { return server_cpu_quota_min; } |   double get_sys_tenant_default_min_cpu() { return server_cpu_quota_min; } | ||||||
|   double get_sys_tenant_default_max_cpu() { return server_cpu_quota_max; } |   double get_sys_tenant_default_max_cpu() { return server_cpu_quota_max; } | ||||||
|  |  | ||||||
| @ -134,9 +133,29 @@ protected: | |||||||
| private: | private: | ||||||
|   DISALLOW_COPY_AND_ASSIGN(ObServerConfig); |   DISALLOW_COPY_AND_ASSIGN(ObServerConfig); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | class ObServerMemoryConfig | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |   friend class unittest::ObSimpleClusterTestBase; | ||||||
|  |   ObServerMemoryConfig(); | ||||||
|  |   static ObServerMemoryConfig &get_instance(); | ||||||
|  |   int reload_config(const ObServerConfig& server_config); | ||||||
|  |   int64_t get_server_memory_limit() { return memory_limit_; } | ||||||
|  |   int64_t get_reserved_server_memory() { return system_memory_; } | ||||||
|  |   int64_t get_server_memory_avail() { return memory_limit_ - system_memory_; } | ||||||
|  | private: | ||||||
|  | // set_server_memory_limit just for mittest | ||||||
|  |   void set_server_memory_limit(int64_t memory_limit); | ||||||
|  | private: | ||||||
|  |   int64_t memory_limit_; | ||||||
|  |   int64_t system_memory_; | ||||||
|  | private: | ||||||
|  |   DISALLOW_COPY_AND_ASSIGN(ObServerMemoryConfig); | ||||||
|  | }; | ||||||
| } | } | ||||||
| } | } | ||||||
|  |  | ||||||
| #define GCONF (::oceanbase::common::ObServerConfig::get_instance()) | #define GCONF (::oceanbase::common::ObServerConfig::get_instance()) | ||||||
|  | #define GMEMCONF (::oceanbase::common::ObServerMemoryConfig::get_instance()) | ||||||
| #endif // OCEANBASE_SHARE_CONFIG_OB_SERVER_CONFIG_H_ | #endif // OCEANBASE_SHARE_CONFIG_OB_SERVER_CONFIG_H_ | ||||||
|  | |||||||
| @ -430,7 +430,7 @@ int ObVirtualTenantManager::print_tenant_usage_( | |||||||
|   } |   } | ||||||
|   if (OB_SERVER_TENANT_ID == node.tenant_id_) { |   if (OB_SERVER_TENANT_ID == node.tenant_id_) { | ||||||
|     int64_t observer_tenant_hold = lib::get_tenant_memory_hold(node.tenant_id_); |     int64_t observer_tenant_hold = lib::get_tenant_memory_hold(node.tenant_id_); | ||||||
|     int64_t system_memory = GCONF.get_reserved_server_memory(); |     int64_t system_memory = GMEMCONF.get_reserved_server_memory(); | ||||||
|     if (observer_tenant_hold > system_memory) { |     if (observer_tenant_hold > system_memory) { | ||||||
|       if (GCONF._ignore_system_memory_over_limit_error) { |       if (GCONF._ignore_system_memory_over_limit_error) { | ||||||
|         COMMON_LOG(WARN, "the hold of observer tenant is over the system_memory", K(observer_tenant_hold), K(system_memory)); |         COMMON_LOG(WARN, "the hold of observer tenant is over the system_memory", K(observer_tenant_hold), K(system_memory)); | ||||||
|  | |||||||
| @ -20,26 +20,27 @@ | |||||||
| #define _OB_CLUSTER_PARAMETER common::Scope::CLUSTER | #define _OB_CLUSTER_PARAMETER common::Scope::CLUSTER | ||||||
| #define _OB_TENANT_PARAMETER common::Scope::TENANT | #define _OB_TENANT_PARAMETER common::Scope::TENANT | ||||||
|  |  | ||||||
| #define _DEF_PARAMETER_SCOPE_EASY(param, name, SCOPE, args...)                 \ | #define _DEF_PARAMETER_SCOPE_EASY(access_specifier, param, name, SCOPE, args...)                        \ | ||||||
|   SCOPE(_DEF_PARAMETER_EASY(param, _ ## SCOPE, name, args)) |   SCOPE(_DEF_PARAMETER_EASY(access_specifier, param, _ ## SCOPE, name, args)) | ||||||
| #define _DEF_PARAMETER_SCOPE_RANGE_EASY(param, name, SCOPE, args...)           \ | #define _DEF_PARAMETER_SCOPE_RANGE_EASY(access_specifier, param, name, SCOPE, args...)                  \ | ||||||
|   SCOPE(_DEF_PARAMETER_RANGE_EASY(param, _ ## SCOPE, name, args)) |   SCOPE(_DEF_PARAMETER_RANGE_EASY(access_specifier, param, _ ## SCOPE, name, args)) | ||||||
| #define _DEF_PARAMETER_SCOPE_CHECKER_EASY(param, name, SCOPE, args...)         \ | #define _DEF_PARAMETER_SCOPE_CHECKER_EASY(access_specifier, param, name, SCOPE, args...)                \ | ||||||
|   SCOPE(_DEF_PARAMETER_CHECKER_EASY(param, _ ## SCOPE, name, args)) |   SCOPE(_DEF_PARAMETER_CHECKER_EASY(access_specifier, param, _ ## SCOPE, name, args)) | ||||||
|  |  | ||||||
| #define _DEF_PARAMETER_SCOPE_IP_EASY(param, name, SCOPE, def, args...)         \ | #define _DEF_PARAMETER_SCOPE_IP_EASY(access_specifier, param, name, SCOPE, def, args...)                \ | ||||||
|   SCOPE(_DEF_PARAMETER_CHECKER_EASY(param, _ ## SCOPE, name, def,              \ |   SCOPE(_DEF_PARAMETER_CHECKER_EASY(access_specifier, param, _ ## SCOPE, name, def,                     \ | ||||||
|                                     common::ObConfigIpChecker, args)) |                                     common::ObConfigIpChecker, args)) | ||||||
| #define _DEF_PARAMETER_SCOPE_LOG_LEVEL_EASY(param, name, SCOPE, def, args...)  \ | #define _DEF_PARAMETER_SCOPE_LOG_LEVEL_EASY(access_specifier, param, name, SCOPE, def, args...)         \ | ||||||
|   SCOPE(_DEF_PARAMETER_CHECKER_EASY(param, _ ## SCOPE, name, def,              \ |   SCOPE(_DEF_PARAMETER_CHECKER_EASY(access_specifier, param, _ ## SCOPE, name, def,                     \ | ||||||
|                                     common::ObConfigLogLevelChecker, args)) |                                     common::ObConfigLogLevelChecker, args)) | ||||||
|  |  | ||||||
| #define _DEF_PARAMETER_SCOPE_WORK_AREA_POLICY_EASY(param, name, SCOPE, def, args...)  \ | #define _DEF_PARAMETER_SCOPE_WORK_AREA_POLICY_EASY(access_specifier, param, name, SCOPE, def, args...)  \ | ||||||
|   SCOPE(_DEF_PARAMETER_CHECKER_EASY(param, _ ## SCOPE, name, def,              \ |   SCOPE(_DEF_PARAMETER_CHECKER_EASY(access_specifier, param, _ ## SCOPE, name, def,                     \ | ||||||
|                                     common::ObConfigWorkAreaPolicyChecker, args)) |                                     common::ObConfigWorkAreaPolicyChecker, args)) | ||||||
|  |  | ||||||
| // TODO: use parameter instead of config | // TODO: use parameter instead of config | ||||||
| #define _DEF_PARAMETER_EASY(param, scope, name, args...)                       \ | #define _DEF_PARAMETER_EASY(access_specifier, param, scope, name, args...)                 \ | ||||||
|  | access_specifier:                                                                          \ | ||||||
|   class ObConfig ## param ## Item ## _ ## name                                 \ |   class ObConfig ## param ## Item ## _ ## name                                 \ | ||||||
|       : public common::ObConfig ## param ## Item                               \ |       : public common::ObConfig ## param ## Item                               \ | ||||||
|   {                                                                            \ |   {                                                                            \ | ||||||
| @ -56,7 +57,8 @@ | |||||||
|     TO_STRING_KV(K_(value_str))                                                \ |     TO_STRING_KV(K_(value_str))                                                \ | ||||||
|   } name; |   } name; | ||||||
|  |  | ||||||
| #define _DEF_PARAMETER_RANGE_EASY(param, scope, name, args...)                 \ | #define _DEF_PARAMETER_RANGE_EASY(access_specifier, param, scope, name, args...)           \ | ||||||
|  | access_specifier:                                                                          \ | ||||||
|   class ObConfig ## param ## Item ## _ ## name                                 \ |   class ObConfig ## param ## Item ## _ ## name                                 \ | ||||||
|       : public common::ObConfig ## param ## Item                               \ |       : public common::ObConfig ## param ## Item                               \ | ||||||
|   {                                                                            \ |   {                                                                            \ | ||||||
| @ -72,7 +74,8 @@ | |||||||
|     }                                                                          \ |     }                                                                          \ | ||||||
|   } name; |   } name; | ||||||
|  |  | ||||||
| #define _DEF_PARAMETER_CHECKER_EASY(param, scope, name, def, checker, args...) \ | #define _DEF_PARAMETER_CHECKER_EASY(access_specifier, param, scope, name, def, checker, args...) \ | ||||||
|  | access_specifier:                                                                          \ | ||||||
|   class ObConfig ## param ## Item ## _ ## name                                 \ |   class ObConfig ## param ## Item ## _ ## name                                 \ | ||||||
|       : public common::ObConfig ## param ## Item                               \ |       : public common::ObConfig ## param ## Item                               \ | ||||||
|   {                                                                            \ |   {                                                                            \ | ||||||
| @ -93,54 +96,54 @@ | |||||||
|  |  | ||||||
| //////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// | ||||||
| #define DEF_INT(args...)                                                       \ | #define DEF_INT(args...)                                                       \ | ||||||
|   _DEF_PARAMETER_SCOPE_RANGE_EASY(Int, args) |   _DEF_PARAMETER_SCOPE_RANGE_EASY(public, Int, args) | ||||||
|  |  | ||||||
| #define DEF_INT_WITH_CHECKER(args...)                                          \ | #define DEF_INT_WITH_CHECKER(args...)                                          \ | ||||||
|   _DEF_PARAMETER_SCOPE_CHECKER_EASY(Int, args) |   _DEF_PARAMETER_SCOPE_CHECKER_EASY(public, Int, args) | ||||||
|  |  | ||||||
| #define DEF_DBL(args...)                                                       \ | #define DEF_DBL(args...)                                                       \ | ||||||
|   _DEF_PARAMETER_SCOPE_RANGE_EASY(Double, args) |   _DEF_PARAMETER_SCOPE_RANGE_EASY(public, Double, args) | ||||||
|  |  | ||||||
| #define DEF_CAP(args...)                                                       \ | #define DEF_CAP(args...)                                                       \ | ||||||
|   _DEF_PARAMETER_SCOPE_RANGE_EASY(Capacity, args) |   _DEF_PARAMETER_SCOPE_RANGE_EASY(public, Capacity, args) | ||||||
|  |  | ||||||
| #define DEF_CAP_WITH_CHECKER(args...)                                          \ | #define DEF_CAP_WITH_CHECKER(args...)                                          \ | ||||||
|   _DEF_PARAMETER_SCOPE_CHECKER_EASY(Capacity, args) |   _DEF_PARAMETER_SCOPE_CHECKER_EASY(public, Capacity, args) | ||||||
|  |  | ||||||
| #define DEF_TIME(args...)                                                      \ | #define DEF_TIME(args...)                                                      \ | ||||||
|   _DEF_PARAMETER_SCOPE_RANGE_EASY(Time, args) |   _DEF_PARAMETER_SCOPE_RANGE_EASY(public, Time, args) | ||||||
|  |  | ||||||
| #define DEF_TIME_WITH_CHECKER(args...)                                         \ | #define DEF_TIME_WITH_CHECKER(args...)                                         \ | ||||||
|   _DEF_PARAMETER_SCOPE_CHECKER_EASY(Time, args) |   _DEF_PARAMETER_SCOPE_CHECKER_EASY(public, Time, args) | ||||||
|  |  | ||||||
| #define DEF_BOOL(args...)                                                      \ | #define DEF_BOOL(args...)                                                      \ | ||||||
|   _DEF_PARAMETER_SCOPE_EASY(Bool, args) |   _DEF_PARAMETER_SCOPE_EASY(public, Bool, args) | ||||||
|  |  | ||||||
| #define DEF_STR(args...)                                                       \ | #define DEF_STR(args...)                                                       \ | ||||||
|   _DEF_PARAMETER_SCOPE_EASY(String, args) |   _DEF_PARAMETER_SCOPE_EASY(public, String, args) | ||||||
|  |  | ||||||
| #define DEF_STR_WITH_CHECKER(args...)                                          \ | #define DEF_STR_WITH_CHECKER(args...)                                          \ | ||||||
|   _DEF_PARAMETER_SCOPE_CHECKER_EASY(String, args) |   _DEF_PARAMETER_SCOPE_CHECKER_EASY(public, String, args) | ||||||
|  |  | ||||||
| #define DEF_IP(args...)                                                        \ | #define DEF_IP(args...)                                                        \ | ||||||
|   _DEF_PARAMETER_SCOPE_IP_EASY(String, args) |   _DEF_PARAMETER_SCOPE_IP_EASY(public, String, args) | ||||||
|  |  | ||||||
| #define DEF_MOMENT(args...)                                                    \ | #define DEF_MOMENT(args...)                                                    \ | ||||||
|   _DEF_PARAMETER_SCOPE_EASY(Moment, args) |   _DEF_PARAMETER_SCOPE_EASY(public, Moment, args) | ||||||
|  |  | ||||||
| #define DEF_INT_LIST(args...)                                                  \ | #define DEF_INT_LIST(args...)                                                  \ | ||||||
|   _DEF_PARAMETER_SCOPE_EASY(IntList, args) |   _DEF_PARAMETER_SCOPE_EASY(public, IntList, args) | ||||||
|  |  | ||||||
| #define DEF_STR_LIST(args...)                                                  \ | #define DEF_STR_LIST(args...)                                                  \ | ||||||
|   _DEF_PARAMETER_SCOPE_EASY(StrList, args) |   _DEF_PARAMETER_SCOPE_EASY(public, StrList, args) | ||||||
|  |  | ||||||
| #define DEF_LOG_ARCHIVE_OPTIONS_WITH_CHECKER(args...)                          \ | #define DEF_LOG_ARCHIVE_OPTIONS_WITH_CHECKER(args...)                          \ | ||||||
|   _DEF_PARAMETER_SCOPE_CHECKER_EASY(LogArchiveOptions, args) |   _DEF_PARAMETER_SCOPE_CHECKER_EASY(public, LogArchiveOptions, args) | ||||||
| #define DEF_LOG_LEVEL(args...)                                                 \ | #define DEF_LOG_LEVEL(args...)                                                 \ | ||||||
|   _DEF_PARAMETER_SCOPE_LOG_LEVEL_EASY(String, args) |   _DEF_PARAMETER_SCOPE_LOG_LEVEL_EASY(public, String, args) | ||||||
|  |  | ||||||
| #define DEF_WORK_AREA_POLICY(args...)                                          \ | #define DEF_WORK_AREA_POLICY(args...)                                          \ | ||||||
|   _DEF_PARAMETER_SCOPE_WORK_AREA_POLICY_EASY(String, args) |   _DEF_PARAMETER_SCOPE_WORK_AREA_POLICY_EASY(public, String, args) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -149,55 +152,55 @@ | |||||||
| #ifdef ERRSIM | #ifdef ERRSIM | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_INT(args...)                                                       \ | #define ERRSIM_DEF_INT(args...)                                                       \ | ||||||
|   _DEF_PARAMETER_SCOPE_RANGE_EASY(Int, args) |   _DEF_PARAMETER_SCOPE_RANGE_EASY(public, Int, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_INT_WITH_CHECKER(args...)                                          \ | #define ERRSIM_DEF_INT_WITH_CHECKER(args...)                                          \ | ||||||
|   _DEF_PARAMETER_SCOPE_CHECKER_EASY(Int, args) |   _DEF_PARAMETER_SCOPE_CHECKER_EASY(public, Int, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_DBL(args...)                                                       \ | #define ERRSIM_DEF_DBL(args...)                                                       \ | ||||||
|   _DEF_PARAMETER_SCOPE_RANGE_EASY(Double, args) |   _DEF_PARAMETER_SCOPE_RANGE_EASY(public, Double, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_CAP(args...)                                                       \ | #define ERRSIM_DEF_CAP(args...)                                                       \ | ||||||
|   _DEF_PARAMETER_SCOPE_RANGE_EASY(Capacity, args) |   _DEF_PARAMETER_SCOPE_RANGE_EASY(public, Capacity, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_CAP_WITH_CHECKER(args...)                                          \ | #define ERRSIM_DEF_CAP_WITH_CHECKER(args...)                                          \ | ||||||
|   _DEF_PARAMETER_SCOPE_CHECKER_EASY(Capacity, args) |   _DEF_PARAMETER_SCOPE_CHECKER_EASY(public, Capacity, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_TIME(args...)                                                      \ | #define ERRSIM_DEF_TIME(args...)                                                      \ | ||||||
|   _DEF_PARAMETER_SCOPE_RANGE_EASY(Time, args) |   _DEF_PARAMETER_SCOPE_RANGE_EASY(public, Time, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_TIME_WITH_CHECKER(args...)                                         \ | #define ERRSIM_DEF_TIME_WITH_CHECKER(args...)                                         \ | ||||||
|   _DEF_PARAMETER_SCOPE_CHECKER_EASY(Time, args) |   _DEF_PARAMETER_SCOPE_CHECKER_EASY(public, Time, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_BOOL(args...)                                                      \ | #define ERRSIM_DEF_BOOL(args...)                                                      \ | ||||||
|   _DEF_PARAMETER_SCOPE_EASY(Bool, args) |   _DEF_PARAMETER_SCOPE_EASY(public, Bool, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_STR(args...)                                                       \ | #define ERRSIM_DEF_STR(args...)                                                       \ | ||||||
|   _DEF_PARAMETER_SCOPE_EASY(String, args) |   _DEF_PARAMETER_SCOPE_EASY(public, String, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_STR_WITH_CHECKER(args...)                                          \ | #define ERRSIM_DEF_STR_WITH_CHECKER(args...)                                          \ | ||||||
|   _DEF_PARAMETER_SCOPE_CHECKER_EASY(String, args) |   _DEF_PARAMETER_SCOPE_CHECKER_EASY(public, String, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_IP(args...)                                                        \ | #define ERRSIM_DEF_IP(args...)                                                        \ | ||||||
|   _DEF_PARAMETER_SCOPE_IP_EASY(String, args) |   _DEF_PARAMETER_SCOPE_IP_EASY(public, String, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_MOMENT(args...)                                                    \ | #define ERRSIM_DEF_MOMENT(args...)                                                    \ | ||||||
|   _DEF_PARAMETER_SCOPE_EASY(Moment, args) |   _DEF_PARAMETER_SCOPE_EASY(public, Moment, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_INT_LIST(args...)                                                  \ | #define ERRSIM_DEF_INT_LIST(args...)                                                  \ | ||||||
|   _DEF_PARAMETER_SCOPE_EASY(IntList, args) |   _DEF_PARAMETER_SCOPE_EASY(public, IntList, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_STR_LIST(args...)                                                  \ | #define ERRSIM_DEF_STR_LIST(args...)                                                  \ | ||||||
|   _DEF_PARAMETER_SCOPE_EASY(StrList, args) |   _DEF_PARAMETER_SCOPE_EASY(public, StrList, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_LOG_ARCHIVE_OPTIONS_WITH_CHECKER(args...)                          \ | #define ERRSIM_DEF_LOG_ARCHIVE_OPTIONS_WITH_CHECKER(args...)                          \ | ||||||
|   _DEF_PARAMETER_SCOPE_CHECKER_EASY(LogArchiveOptions, args) |   _DEF_PARAMETER_SCOPE_CHECKER_EASY(public, LogArchiveOptions, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_LOG_LEVEL(args...)                                                 \ | #define ERRSIM_DEF_LOG_LEVEL(args...)                                                 \ | ||||||
|   _DEF_PARAMETER_SCOPE_LOG_LEVEL_EASY(String, args) |   _DEF_PARAMETER_SCOPE_LOG_LEVEL_EASY(public, String, args) | ||||||
|  |  | ||||||
| #define ERRSIM_DEF_WORK_AREA_POLICY(args...)                                          \ | #define ERRSIM_DEF_WORK_AREA_POLICY(args...)                                          \ | ||||||
|   _DEF_PARAMETER_SCOPE_WORK_AREA_POLICY_EASY(String, args) |   _DEF_PARAMETER_SCOPE_WORK_AREA_POLICY_EASY(public, String, args) | ||||||
|  |  | ||||||
| #else | #else | ||||||
| #define ERRSIM_DEF_INT(args...) | #define ERRSIM_DEF_INT(args...) | ||||||
|  | |||||||
| @ -73,14 +73,14 @@ DEF_INT(rdma_io_thread_count, OB_CLUSTER_PARAMETER, "0", "[0,8]", | |||||||
| DEF_INT(tenant_task_queue_size, OB_CLUSTER_PARAMETER, "65536", "[1024,]", | DEF_INT(tenant_task_queue_size, OB_CLUSTER_PARAMETER, "65536", "[1024,]", | ||||||
|         "the size of the task queue for each tenant. Range: [1024,+∞)", |         "the size of the task queue for each tenant. Range: [1024,+∞)", | ||||||
|         ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); |         ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); | ||||||
| DEF_CAP_WITH_CHECKER(memory_limit, OB_CLUSTER_PARAMETER, "0", | _DEF_PARAMETER_SCOPE_CHECKER_EASY(private, Capacity, memory_limit, OB_CLUSTER_PARAMETER, "0", | ||||||
|         common::ObConfigMemoryLimitChecker, "[0M,)", |         common::ObConfigMemoryLimitChecker, "[0M,)", | ||||||
|         "the size of the memory reserved for internal use(for testing purpose), 0 means follow memory_limit_percentage. Range: 0, [4G,).", |         "the size of the memory reserved for internal use(for testing purpose), 0 means follow memory_limit_percentage. Range: 0, [4G,).", | ||||||
|         ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); |         ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); | ||||||
| DEF_CAP(rootservice_memory_limit, OB_CLUSTER_PARAMETER, "2G", "[2G,)", | DEF_CAP(rootservice_memory_limit, OB_CLUSTER_PARAMETER, "2G", "[2G,)", | ||||||
|         "max memory size which can be used by rs tenant The default value is 2G. Range: [2G,)", |         "max memory size which can be used by rs tenant The default value is 2G. Range: [2G,)", | ||||||
|         ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); |         ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); | ||||||
| DEF_CAP(system_memory, OB_CLUSTER_PARAMETER, "0M", "[0M,)", | _DEF_PARAMETER_SCOPE_RANGE_EASY(private, Capacity, system_memory, OB_CLUSTER_PARAMETER, "0M", "[0M,)", | ||||||
|         "the memory reserved for internal use which cannot be allocated to any outer-tenant, " |         "the memory reserved for internal use which cannot be allocated to any outer-tenant, " | ||||||
|         "and should be determined to guarantee every server functions normally. Range: [0M,)", |         "and should be determined to guarantee every server functions normally. Range: [0M,)", | ||||||
|         ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); |         ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); | ||||||
|  | |||||||
| @ -685,13 +685,13 @@ int ObUnitResource::gen_sys_tenant_default_unit_resource() | |||||||
| int ObUnitResource::get_sys_tenant_default_memory(int64_t &memory_size) | int ObUnitResource::get_sys_tenant_default_memory(int64_t &memory_size) | ||||||
| { | { | ||||||
|   int ret = OB_SUCCESS; |   int ret = OB_SUCCESS; | ||||||
|   const int64_t server_avail_memory = GCONF.get_server_memory_avail(); |  | ||||||
|   const int64_t sys_tenant_default_memory_percentage = SYS_TENANT_DEFAULT_MEMORY_PERCENTAGE; |   const int64_t sys_tenant_default_memory_percentage = SYS_TENANT_DEFAULT_MEMORY_PERCENTAGE; | ||||||
|   const int64_t sys_tenant_default_memory_max =  SYS_TENANT_DEFAULT_MEMORY_MAX; |   const int64_t sys_tenant_default_memory_max =  SYS_TENANT_DEFAULT_MEMORY_MAX; | ||||||
|   const int64_t unit_min_memory = UNIT_MIN_MEMORY; |   const int64_t unit_min_memory = UNIT_MIN_MEMORY; | ||||||
|   const int64_t __min_full_resource_pool_memory = GCONF.__min_full_resource_pool_memory; |   const int64_t __min_full_resource_pool_memory = GCONF.__min_full_resource_pool_memory; | ||||||
|   const int64_t system_memory = GCONF.get_reserved_server_memory(); |   const int64_t system_memory = GMEMCONF.get_reserved_server_memory(); | ||||||
|   const int64_t server_memory_limit = GCONF.get_server_memory_limit(); |   const int64_t server_memory_limit = GMEMCONF.get_server_memory_limit(); | ||||||
|  |   const int64_t server_avail_memory = server_memory_limit - system_memory; | ||||||
|  |  | ||||||
|   memory_size = 0; |   memory_size = 0; | ||||||
|  |  | ||||||
|  | |||||||
| @ -25,7 +25,7 @@ ObMonitorInfoManager::ObMonitorInfoManager() | |||||||
| { | { | ||||||
|   memory_limit_ = min( |   memory_limit_ = min( | ||||||
|       MAX_MEMORY_SIZE, |       MAX_MEMORY_SIZE, | ||||||
|       static_cast<int64_t>(static_cast<double>(GCONF.get_server_memory_avail()) * MONITOR_MEM_FACTOR)); |       static_cast<int64_t>(static_cast<double>(GMEMCONF.get_server_memory_avail()) * MONITOR_MEM_FACTOR)); | ||||||
| } | } | ||||||
|  |  | ||||||
| ObMonitorInfoManager::~ObMonitorInfoManager() | ObMonitorInfoManager::~ObMonitorInfoManager() | ||||||
|  | |||||||
| @ -177,7 +177,7 @@ int ObTenantSSTableMergeInfoMgr::init(const int64_t memory_limit) | |||||||
|     STORAGE_LOG(WARN, "Invalid argument", K(ret), K(memory_limit)); |     STORAGE_LOG(WARN, "Invalid argument", K(ret), K(memory_limit)); | ||||||
|   } else { |   } else { | ||||||
|     void *buf = NULL; |     void *buf = NULL; | ||||||
|     int64_t max_info_cnt = min(GCONF.get_server_memory_limit(), memory_limit) / (sizeof(ObSSTableMergeInfo)); |     int64_t max_info_cnt = min(GMEMCONF.get_server_memory_limit(), memory_limit) / (sizeof(ObSSTableMergeInfo)); | ||||||
|     if (max_info_cnt < 2) { |     if (max_info_cnt < 2) { | ||||||
|       max_info_cnt = 2; |       max_info_cnt = 2; | ||||||
|     } |     } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 obdev
					obdev