@ -236,21 +236,22 @@ void RegisterBackendMetricsLbPolicy(CoreConfiguration::Builder* builder) {
void LoadReportTracker : : RecordPerRpcLoadReport (
const grpc_core : : BackendMetricData * backend_metric_data ) {
absl : : MutexLock lock ( & load_reports_mu_ ) ;
grpc_core : : MutexLock lock ( & load_reports_mu_ ) ;
per_rpc_load_reports_ . emplace_back (
BackendMetricDataToOrcaLoadReport ( backend_metric_data ) ) ;
}
void LoadReportTracker : : RecordOobLoadReport (
const grpc_core : : BackendMetricData & oob_metric_data ) {
absl : : MutexLock lock ( & load_reports_mu_ ) ;
grpc_core : : MutexLock lock ( & load_reports_mu_ ) ;
oob_load_reports_ . emplace_back (
* BackendMetricDataToOrcaLoadReport ( & oob_metric_data ) ) ;
load_reports_cv_ . Signal ( ) ;
}
absl : : optional < LoadReportTracker : : LoadReportEntry >
LoadReportTracker : : GetNextLoadReport ( ) {
absl : : MutexLock lock ( & load_reports_mu_ ) ;
grpc_core : : MutexLock lock ( & load_reports_mu_ ) ;
if ( per_rpc_load_reports_ . empty ( ) ) {
return absl : : nullopt ;
}
@ -262,16 +263,17 @@ LoadReportTracker::GetNextLoadReport() {
LoadReportTracker : : LoadReportEntry LoadReportTracker : : WaitForOobLoadReport (
const std : : function < bool ( const TestOrcaReport & ) > & predicate ,
absl : : Duration poll_timeout , size_t max_attempts ) {
absl : : MutexLock lock ( & load_reports_mu_ ) ;
grpc_core : : MutexLock lock ( & load_reports_mu_ ) ;
// This condition will be called under lock
auto condition = [ & ] ( ) ABSL_NO_THREAD_SAFETY_ANALYSIS {
return ! oob_load_reports_ . empty ( ) ;
} ;
for ( size_t i = 0 ; i < max_attempts ; i + + ) {
if ( ! load_reports_mu_ . AwaitWithTimeout ( absl : : Condition ( & condition ) ,
poll_timeout ) ) {
return absl : : nullopt ;
}
auto deadline = absl : : Now ( ) + poll_timeout ;
// loop to handle spurious wakeups.
do {
if ( absl : : Now ( ) > = deadline ) {
return absl : : nullopt ;
}
load_reports_cv_ . WaitWithDeadline ( & load_reports_mu_ , deadline ) ;
} while ( oob_load_reports_ . empty ( ) ) ;
auto report = std : : move ( oob_load_reports_ . front ( ) ) ;
oob_load_reports_ . pop_front ( ) ;
if ( predicate ( report ) ) {
@ -283,7 +285,7 @@ LoadReportTracker::LoadReportEntry LoadReportTracker::WaitForOobLoadReport(
}
void LoadReportTracker : : ResetCollectedLoadReports ( ) {
absl : : MutexLock lock ( & load_reports_mu_ ) ;
grpc_core : : MutexLock lock ( & load_reports_mu_ ) ;
per_rpc_load_reports_ . clear ( ) ;
oob_load_reports_ . clear ( ) ;
}