limit the print frequency for each ERROR log
This commit is contained in:
		
							
								
								
									
										15
									
								
								deps/oblib/src/lib/oblog/ob_log.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								deps/oblib/src/lib/oblog/ob_log.cpp
									
									
									
									
										vendored
									
									
								
							| @ -56,6 +56,7 @@ _RLOCAL(lib::ObRateLimiter*, ObLogger::tl_log_limiter_); | ||||
| static const int64_t limiter_initial = 1000; | ||||
| static const int64_t limiter_thereafter = 100; | ||||
| ObSyslogSampleRateLimiter ObLogger::per_log_limiters_[]; | ||||
| ObSyslogSampleRateLimiter ObLogger::per_error_log_limiters_[]; | ||||
| _RLOCAL(int32_t, ObLogger::tl_type_); | ||||
| _RLOCAL(uint64_t, ObLogger::curr_logging_seq_); | ||||
| _RLOCAL(uint64_t, ObLogger::last_logging_seq_); | ||||
| @ -1423,6 +1424,9 @@ int ObLogger::init(const ObBaseLogWriterCfg &log_cfg, | ||||
|     for (int i = 0; i < ARRAYSIZEOF(per_log_limiters_); i++) { | ||||
|       new (&per_log_limiters_[i])ObSyslogSampleRateLimiter(limiter_initial, limiter_thereafter); | ||||
|     } | ||||
|     for (int i = 0; i < ARRAYSIZEOF(per_error_log_limiters_); i++) { | ||||
|       new (&per_error_log_limiters_[i])ObSyslogSampleRateLimiter(limiter_initial, limiter_thereafter); | ||||
|     } | ||||
|     const int64_t limit = ObBaseLogWriterCfg::DEFAULT_MAX_BUFFER_ITEM_CNT * OB_MALLOC_BIG_BLOCK_SIZE / 8; // 256M | ||||
|     log_mem_limiter_ = new (buf) ObBlockAllocMgr(limit); | ||||
|     allocator_ = new (log_mem_limiter_ + 1) ObVSliceAlloc(); | ||||
| @ -1676,10 +1680,13 @@ int ObLogger::check_tl_log_limiter(const uint64_t location_hash_val, | ||||
|         if (!allow) { limiter_info = " REACH SYSLOG RATE LIMIT [bandwidth]"; } | ||||
|       } | ||||
|       if (allow) { | ||||
|         int64_t idx0 = (location_hash_val >> 32) % N_LIMITER; | ||||
|         int64_t idx1 = ((location_hash_val << 32) >> 32) % N_LIMITER; | ||||
|         bool r0 = OB_SUCCESS == per_log_limiters_[idx0].try_acquire(1, level, errcode); | ||||
|         bool r1 = OB_SUCCESS == per_log_limiters_[idx1].try_acquire(1, level, errcode); | ||||
|         int n_limiter = (OB_LOG_LEVEL_ERROR == level) ? N_ERROR_LIMITER : N_LIMITER; | ||||
|         ObSyslogSampleRateLimiter *log_sample_rate_limiters = | ||||
|             (OB_LOG_LEVEL_ERROR == level) ? per_error_log_limiters_ : per_log_limiters_; | ||||
|         int64_t idx0 = (location_hash_val >> 32) % n_limiter; | ||||
|         int64_t idx1 = ((location_hash_val << 32) >> 32) % n_limiter; | ||||
|         bool r0 = OB_SUCCESS == log_sample_rate_limiters[idx0].try_acquire(1, level, errcode); | ||||
|         bool r1 = OB_SUCCESS == log_sample_rate_limiters[idx1].try_acquire(1, level, errcode); | ||||
|         allow = r0 && r1; | ||||
|         if (!allow) { limiter_info = " REACH SYSLOG RATE LIMIT [frequency]"; } | ||||
|       } | ||||
|  | ||||
							
								
								
									
										2
									
								
								deps/oblib/src/lib/oblog/ob_log.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								deps/oblib/src/lib/oblog/ob_log.h
									
									
									
									
										vendored
									
									
								
							| @ -753,7 +753,9 @@ private: | ||||
|   static ::oceanbase::lib::ObRateLimiter *default_log_limiter_; | ||||
|   RLOCAL_STATIC(lib::ObRateLimiter*, tl_log_limiter_); | ||||
|   static constexpr int N_LIMITER = 4096; | ||||
|   static constexpr int N_ERROR_LIMITER = 1024; | ||||
|   static ObSyslogSampleRateLimiter per_log_limiters_[N_LIMITER]; | ||||
|   static ObSyslogSampleRateLimiter per_error_log_limiters_[N_ERROR_LIMITER]; | ||||
|   RLOCAL_STATIC(int32_t, tl_type_); | ||||
|   //used for stat logging time and log dropped | ||||
|   RLOCAL_STATIC(uint64_t, curr_logging_seq_); | ||||
|  | ||||
| @ -53,10 +53,6 @@ public: | ||||
|     if (!in_acquire) { | ||||
|       if (0 == rate_) { | ||||
|         ret = common::OB_EAGAIN; | ||||
|       } else if (OB_LOG_LEVEL_ERROR == log_level | ||||
|                  || OB_LOG_LEVEL_DBA_WARN == log_level | ||||
|                  || OB_LOG_LEVEL_DBA_ERROR == log_level) { | ||||
|         // allow | ||||
|       } else { | ||||
|         in_acquire = 1; | ||||
|         ret = do_acquire(permits, log_level, errcode); | ||||
| @ -117,9 +113,16 @@ public: | ||||
|   void reset_force_allows() override { }; | ||||
|   int do_acquire(int64_t permits, int log_level, int errcode) override | ||||
|   { | ||||
|     UNUSED(log_level); | ||||
|     UNUSED(errcode); | ||||
|     return impl_.try_acquire(permits); | ||||
|     int ret = OB_SUCCESS; | ||||
|     if (OB_LOG_LEVEL_ERROR == log_level | ||||
|         || OB_LOG_LEVEL_DBA_WARN == log_level | ||||
|         || OB_LOG_LEVEL_DBA_ERROR == log_level) { | ||||
|       // allow | ||||
|     } else { | ||||
|       ret = impl_.try_acquire(permits); | ||||
|     } | ||||
|     return ret; | ||||
|   } | ||||
|  | ||||
| private: | ||||
|  | ||||
| @ -34,6 +34,12 @@ TEST(TestSampleRateLimiter, Basic) | ||||
|   ASSERT_EQ(OB_SUCCESS, rl.try_acquire(1, OB_LOG_LEVEL_INFO)); | ||||
|   ASSERT_EQ(OB_EAGAIN, rl.try_acquire(2, OB_LOG_LEVEL_INFO)); | ||||
|   ASSERT_EQ(OB_SUCCESS, rl.try_acquire(1, OB_LOG_LEVEL_INFO)); | ||||
|  | ||||
|   sleep(1); | ||||
|   ASSERT_EQ(OB_SUCCESS, rl.try_acquire(1, OB_LOG_LEVEL_ERROR)); | ||||
|   ASSERT_EQ(OB_EAGAIN, rl.try_acquire(2, OB_LOG_LEVEL_ERROR)); | ||||
|   ASSERT_EQ(OB_SUCCESS, rl.try_acquire(1, OB_LOG_LEVEL_ERROR)); | ||||
|  | ||||
| } | ||||
|  | ||||
| int main(int argc, char **argv) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 tushicheng
					tushicheng