@ -15,13 +15,17 @@ namespace rocksdb {
class StopWatch {
class StopWatch {
public :
public :
StopWatch ( Env * const env , Statistics * statistics , const uint32_t hist_type ,
StopWatch ( Env * const env , Statistics * statistics , const uint32_t hist_type ,
uint64_t * elapsed = nullptr , bool overwrite = true )
uint64_t * elapsed = nullptr , bool overwrite = true ,
bool delay_enabled = false )
: env_ ( env ) ,
: env_ ( env ) ,
statistics_ ( statistics ) ,
statistics_ ( statistics ) ,
hist_type_ ( hist_type ) ,
hist_type_ ( hist_type ) ,
elapsed_ ( elapsed ) ,
elapsed_ ( elapsed ) ,
overwrite_ ( overwrite ) ,
overwrite_ ( overwrite ) ,
stats_enabled_ ( statistics & & statistics - > HistEnabledForType ( hist_type ) ) ,
stats_enabled_ ( statistics & & statistics - > HistEnabledForType ( hist_type ) ) ,
delay_enabled_ ( delay_enabled ) ,
total_delay_ ( 0 ) ,
delay_start_time_ ( 0 ) ,
start_time_ ( ( stats_enabled_ | | elapsed ! = nullptr ) ? env - > NowMicros ( )
start_time_ ( ( stats_enabled_ | | elapsed ! = nullptr ) ? env - > NowMicros ( )
: 0 ) { }
: 0 ) { }
@ -33,6 +37,9 @@ class StopWatch {
* elapsed_ + = env_ - > NowMicros ( ) - start_time_ ;
* elapsed_ + = env_ - > NowMicros ( ) - start_time_ ;
}
}
}
}
if ( elapsed_ & & delay_enabled_ ) {
* elapsed_ - = total_delay_ ;
}
if ( stats_enabled_ ) {
if ( stats_enabled_ ) {
statistics_ - > measureTime ( hist_type_ ,
statistics_ - > measureTime ( hist_type_ ,
( elapsed_ ! = nullptr ) ? * elapsed_ :
( elapsed_ ! = nullptr ) ? * elapsed_ :
@ -40,6 +47,25 @@ class StopWatch {
}
}
}
}
void DelayStart ( ) {
// if delay_start_time_ is not 0, it means we are already tracking delay,
// so delay_start_time_ should not be overwritten
if ( elapsed_ & & delay_enabled_ & & delay_start_time_ = = 0 ) {
delay_start_time_ = env_ - > NowMicros ( ) ;
}
}
void DelayStop ( ) {
if ( elapsed_ & & delay_enabled_ & & delay_start_time_ ! = 0 ) {
total_delay_ + = env_ - > NowMicros ( ) - delay_start_time_ ;
}
// reset to 0 means currently no delay is being tracked, so two consecutive
// calls to DelayStop will not increase total_delay_
delay_start_time_ = 0 ;
}
uint64_t GetDelay ( ) const { return delay_enabled_ ? total_delay_ : 0 ; }
uint64_t start_time ( ) const { return start_time_ ; }
uint64_t start_time ( ) const { return start_time_ ; }
private :
private :
@ -49,6 +75,9 @@ class StopWatch {
uint64_t * elapsed_ ;
uint64_t * elapsed_ ;
bool overwrite_ ;
bool overwrite_ ;
bool stats_enabled_ ;
bool stats_enabled_ ;
bool delay_enabled_ ;
uint64_t total_delay_ ;
uint64_t delay_start_time_ ;
const uint64_t start_time_ ;
const uint64_t start_time_ ;
} ;
} ;