1*14675a02SAndroid Build Coastguard Worker /* 2*14675a02SAndroid Build Coastguard Worker * Copyright 2019 Google LLC 3*14675a02SAndroid Build Coastguard Worker * 4*14675a02SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*14675a02SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*14675a02SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*14675a02SAndroid Build Coastguard Worker * 8*14675a02SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*14675a02SAndroid Build Coastguard Worker * 10*14675a02SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*14675a02SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*14675a02SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*14675a02SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*14675a02SAndroid Build Coastguard Worker * limitations under the License. 15*14675a02SAndroid Build Coastguard Worker */ 16*14675a02SAndroid Build Coastguard Worker #ifndef FCP_CLIENT_EVENT_PUBLISHER_H_ 17*14675a02SAndroid Build Coastguard Worker #define FCP_CLIENT_EVENT_PUBLISHER_H_ 18*14675a02SAndroid Build Coastguard Worker 19*14675a02SAndroid Build Coastguard Worker #include <cstdint> 20*14675a02SAndroid Build Coastguard Worker #include <string> 21*14675a02SAndroid Build Coastguard Worker 22*14675a02SAndroid Build Coastguard Worker #include "absl/container/flat_hash_map.h" 23*14675a02SAndroid Build Coastguard Worker #include "absl/status/status.h" 24*14675a02SAndroid Build Coastguard Worker #include "absl/strings/string_view.h" 25*14675a02SAndroid Build Coastguard Worker #include "absl/time/time.h" 26*14675a02SAndroid Build Coastguard Worker #include "fcp/client/stats.h" 27*14675a02SAndroid Build Coastguard Worker 28*14675a02SAndroid Build Coastguard Worker namespace fcp { 29*14675a02SAndroid Build Coastguard Worker namespace client { 30*14675a02SAndroid Build Coastguard Worker 31*14675a02SAndroid Build Coastguard Worker class SecAggEventPublisher; 32*14675a02SAndroid Build Coastguard Worker 33*14675a02SAndroid Build Coastguard Worker // An interface for publishing events that occur during training. This is a 34*14675a02SAndroid Build Coastguard Worker // separate interface from LogManager because the reported events will typically 35*14675a02SAndroid Build Coastguard Worker // be both reported to a cloud monitoring backend and to the Federated server as 36*14675a02SAndroid Build Coastguard Worker // part of publishing results. 37*14675a02SAndroid Build Coastguard Worker // All methods in here either succeed with OK, or fail with INVALID_ARGUMENT. 38*14675a02SAndroid Build Coastguard Worker class EventPublisher { 39*14675a02SAndroid Build Coastguard Worker public: 40*14675a02SAndroid Build Coastguard Worker virtual ~EventPublisher() = default; 41*14675a02SAndroid Build Coastguard Worker 42*14675a02SAndroid Build Coastguard Worker // Publishes that the device is about to issue an eligibility eval check in 43*14675a02SAndroid Build Coastguard Worker // with the server. 44*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalCheckin() = 0; 45*14675a02SAndroid Build Coastguard Worker 46*14675a02SAndroid Build Coastguard Worker // Publishes that the device has finished its eligibility eval checkin with 47*14675a02SAndroid Build Coastguard Worker // the server, and received the URIs to download the eligibility eval plan 48*14675a02SAndroid Build Coastguard Worker // with, but hasn't actually downloaded them yet, along with information 49*14675a02SAndroid Build Coastguard Worker // how much data was transferred up to this point and how long that took. 50*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalPlanUriReceived( 51*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, absl::Duration phase_duration) = 0; 52*14675a02SAndroid Build Coastguard Worker 53*14675a02SAndroid Build Coastguard Worker // Publishes that the device has finished its eligibility eval checkin with 54*14675a02SAndroid Build Coastguard Worker // the server, and received an eligibility eval plan, along with information 55*14675a02SAndroid Build Coastguard Worker // how much data was transferred and how long that took. 56*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalPlanReceived( 57*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, absl::Duration phase_duration) = 0; 58*14675a02SAndroid Build Coastguard Worker 59*14675a02SAndroid Build Coastguard Worker // Publishes that the server did not return an eligibility eval task to the 60*14675a02SAndroid Build Coastguard Worker // client, along with information how much data was transferred and how long 61*14675a02SAndroid Build Coastguard Worker // that took. 62*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalNotConfigured( 63*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, absl::Duration phase_duration) = 0; 64*14675a02SAndroid Build Coastguard Worker 65*14675a02SAndroid Build Coastguard Worker // Publishes that the server rejected the device's eligibility eval checkin, 66*14675a02SAndroid Build Coastguard Worker // along with information how much data was downloaded and how long that took. 67*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalRejected( 68*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, absl::Duration phase_duration) = 0; 69*14675a02SAndroid Build Coastguard Worker 70*14675a02SAndroid Build Coastguard Worker // Publishes that the device is about to check in with the server. 71*14675a02SAndroid Build Coastguard Worker virtual void PublishCheckin() = 0; 72*14675a02SAndroid Build Coastguard Worker 73*14675a02SAndroid Build Coastguard Worker // Publishes that the device has finished checking in with the server, along 74*14675a02SAndroid Build Coastguard Worker // with information how much data was downloaded and how long that took. 75*14675a02SAndroid Build Coastguard Worker virtual void PublishCheckinFinished(const NetworkStats& network_stats, 76*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 77*14675a02SAndroid Build Coastguard Worker 78*14675a02SAndroid Build Coastguard Worker // Publishes that the server rejected the device. 79*14675a02SAndroid Build Coastguard Worker virtual void PublishRejected() = 0; 80*14675a02SAndroid Build Coastguard Worker 81*14675a02SAndroid Build Coastguard Worker // Publishes that the device is about to report the results of a federated 82*14675a02SAndroid Build Coastguard Worker // computation to the server. 83*14675a02SAndroid Build Coastguard Worker virtual void PublishReportStarted(int64_t report_size_bytes) = 0; 84*14675a02SAndroid Build Coastguard Worker 85*14675a02SAndroid Build Coastguard Worker // Publishes that the device has successfully reported its results to the 86*14675a02SAndroid Build Coastguard Worker // server and received instructions on when to reconnect. 87*14675a02SAndroid Build Coastguard Worker virtual void PublishReportFinished(const NetworkStats& network_stats, 88*14675a02SAndroid Build Coastguard Worker absl::Duration report_duration) = 0; 89*14675a02SAndroid Build Coastguard Worker 90*14675a02SAndroid Build Coastguard Worker // Publishes that plan execution has started. 91*14675a02SAndroid Build Coastguard Worker virtual void PublishPlanExecutionStarted() = 0; 92*14675a02SAndroid Build Coastguard Worker 93*14675a02SAndroid Build Coastguard Worker // Publishes a TensorFlow error that happened in the given ClientExecution. 94*14675a02SAndroid Build Coastguard Worker virtual void PublishTensorFlowError(int example_count, 95*14675a02SAndroid Build Coastguard Worker absl::string_view error_message) = 0; 96*14675a02SAndroid Build Coastguard Worker 97*14675a02SAndroid Build Coastguard Worker // Publishes an I/O error (e.g. disk, network) that happened in the given 98*14675a02SAndroid Build Coastguard Worker // ClientExecution. 99*14675a02SAndroid Build Coastguard Worker virtual void PublishIoError(absl::string_view error_message) = 0; 100*14675a02SAndroid Build Coastguard Worker 101*14675a02SAndroid Build Coastguard Worker // Publishes an ExampleSelector error from the given ClientExecution. 102*14675a02SAndroid Build Coastguard Worker virtual void PublishExampleSelectorError(int example_count, 103*14675a02SAndroid Build Coastguard Worker absl::string_view error_message) = 0; 104*14675a02SAndroid Build Coastguard Worker 105*14675a02SAndroid Build Coastguard Worker // Publishes an interruption event for the given client execution. 106*14675a02SAndroid Build Coastguard Worker virtual void PublishInterruption(const ExampleStats& example_stats, 107*14675a02SAndroid Build Coastguard Worker absl::Time start_time) = 0; 108*14675a02SAndroid Build Coastguard Worker 109*14675a02SAndroid Build Coastguard Worker // Publishes an event that plan execution is complete. 110*14675a02SAndroid Build Coastguard Worker virtual void PublishPlanCompleted(const ExampleStats& example_stats, 111*14675a02SAndroid Build Coastguard Worker absl::Time start_time) = 0; 112*14675a02SAndroid Build Coastguard Worker // Publishes that the task didn't start. 113*14675a02SAndroid Build Coastguard Worker virtual void PublishTaskNotStarted(absl::string_view error_message) = 0; 114*14675a02SAndroid Build Coastguard Worker 115*14675a02SAndroid Build Coastguard Worker // Publishes that the federated compute runtime failed to initialize a 116*14675a02SAndroid Build Coastguard Worker // noncritical component, but execution continued. 117*14675a02SAndroid Build Coastguard Worker virtual void PublishNonfatalInitializationError( 118*14675a02SAndroid Build Coastguard Worker absl::string_view error_message) = 0; 119*14675a02SAndroid Build Coastguard Worker // Publishes that the federated compute runtime failed to initialize a 120*14675a02SAndroid Build Coastguard Worker // component, and execution was halted. 121*14675a02SAndroid Build Coastguard Worker virtual void PublishFatalInitializationError( 122*14675a02SAndroid Build Coastguard Worker absl::string_view error_message) = 0; 123*14675a02SAndroid Build Coastguard Worker 124*14675a02SAndroid Build Coastguard Worker // Publish that an IO error was encountered during eligibility eval check-in. 125*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalCheckinIoError( 126*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const NetworkStats& network_stats, 127*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 128*14675a02SAndroid Build Coastguard Worker // Publish that the eligibility eval check-in is interrupted by the client. 129*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalCheckinClientInterrupted( 130*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const NetworkStats& network_stats, 131*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 132*14675a02SAndroid Build Coastguard Worker // Publish that the eligibility eval check-in is aborted by the server. 133*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalCheckinServerAborted( 134*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const NetworkStats& network_stats, 135*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 136*14675a02SAndroid Build Coastguard Worker // Publish that the eligibility eval check-in returned an invalid payload. 137*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalCheckinErrorInvalidPayload( 138*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const NetworkStats& network_stats, 139*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 140*14675a02SAndroid Build Coastguard Worker // Publish an eligibility eval task starts computation. 141*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalComputationStarted() = 0; 142*14675a02SAndroid Build Coastguard Worker // Publish that the eligibility eval task is invalid. 143*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalComputationInvalidArgument( 144*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const ExampleStats& example_stats, 145*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 146*14675a02SAndroid Build Coastguard Worker // Publish an example iterator error occurred during eligibility eval task. 147*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalComputationExampleIteratorError( 148*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const ExampleStats& example_stats, 149*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 150*14675a02SAndroid Build Coastguard Worker // Publish that a tensorflow error occurred during eligibility eval task. 151*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalComputationTensorflowError( 152*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const ExampleStats& example_stats, 153*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 154*14675a02SAndroid Build Coastguard Worker // Publish that the client has interrupted the eligibility eval task. 155*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalComputationInterrupted( 156*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const ExampleStats& example_stats, 157*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 158*14675a02SAndroid Build Coastguard Worker // Publish an eligibility eval task finished. 159*14675a02SAndroid Build Coastguard Worker virtual void PublishEligibilityEvalComputationCompleted( 160*14675a02SAndroid Build Coastguard Worker const ExampleStats& example_stats, absl::Duration phase_duration) = 0; 161*14675a02SAndroid Build Coastguard Worker // Publish an IO error occurred during regular check-in. 162*14675a02SAndroid Build Coastguard Worker virtual void PublishCheckinIoError(absl::string_view error_message, 163*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, 164*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 165*14675a02SAndroid Build Coastguard Worker // Publish that the client interrupted the regular check-in. 166*14675a02SAndroid Build Coastguard Worker virtual void PublishCheckinClientInterrupted( 167*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const NetworkStats& network_stats, 168*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 169*14675a02SAndroid Build Coastguard Worker // Publish that the server aborted the regular check-in. 170*14675a02SAndroid Build Coastguard Worker virtual void PublishCheckinServerAborted(absl::string_view error_message, 171*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, 172*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 173*14675a02SAndroid Build Coastguard Worker // Publish that an invalid payload was downloaded from the regular check-in. 174*14675a02SAndroid Build Coastguard Worker virtual void PublishCheckinInvalidPayload(absl::string_view error_message, 175*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, 176*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 177*14675a02SAndroid Build Coastguard Worker // Publishes that the server rejected the device, also logs network stats and 178*14675a02SAndroid Build Coastguard Worker // duration. 179*14675a02SAndroid Build Coastguard Worker virtual void PublishRejected(const NetworkStats& network_stats, 180*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 181*14675a02SAndroid Build Coastguard Worker 182*14675a02SAndroid Build Coastguard Worker // Publishes that the device has finished checking in with the server and 183*14675a02SAndroid Build Coastguard Worker // received URIs to download the plan and checkpoint with, but hasn't yet 184*14675a02SAndroid Build Coastguard Worker // downloaded those, along with information how much data was transferred up 185*14675a02SAndroid Build Coastguard Worker // to this point and how long that took. 186*14675a02SAndroid Build Coastguard Worker virtual void PublishCheckinPlanUriReceived(const NetworkStats& network_stats, 187*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 188*14675a02SAndroid Build Coastguard Worker // Publishes that the device has finished checking in with the server, along 189*14675a02SAndroid Build Coastguard Worker // with information how much data was transferred and how long that took. 190*14675a02SAndroid Build Coastguard Worker virtual void PublishCheckinFinishedV2(const NetworkStats& network_stats, 191*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 192*14675a02SAndroid Build Coastguard Worker // Publishes that plan execution has started. 193*14675a02SAndroid Build Coastguard Worker virtual void PublishComputationStarted() = 0; 194*14675a02SAndroid Build Coastguard Worker // Publish that the task is invalid. 195*14675a02SAndroid Build Coastguard Worker virtual void PublishComputationInvalidArgument( 196*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const ExampleStats& example_stats, 197*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, absl::Duration phase_duration) = 0; 198*14675a02SAndroid Build Coastguard Worker // Publish that an IO error occurred during computation. 199*14675a02SAndroid Build Coastguard Worker virtual void PublishComputationIOError(absl::string_view error_message, 200*14675a02SAndroid Build Coastguard Worker const ExampleStats& example_stats, 201*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, 202*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 203*14675a02SAndroid Build Coastguard Worker // Publish that an example iterator error occurred during computation. 204*14675a02SAndroid Build Coastguard Worker virtual void PublishComputationExampleIteratorError( 205*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const ExampleStats& example_stats, 206*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, absl::Duration phase_duration) = 0; 207*14675a02SAndroid Build Coastguard Worker // Publish that an tensorflow error occurred during computation. 208*14675a02SAndroid Build Coastguard Worker virtual void PublishComputationTensorflowError( 209*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const ExampleStats& example_stats, 210*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, absl::Duration phase_duration) = 0; 211*14675a02SAndroid Build Coastguard Worker // Publish that the task computation is interrupted. 212*14675a02SAndroid Build Coastguard Worker virtual void PublishComputationInterrupted(absl::string_view error_message, 213*14675a02SAndroid Build Coastguard Worker const ExampleStats& example_stats, 214*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, 215*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 216*14675a02SAndroid Build Coastguard Worker // Publishes an event that plan execution is complete. 217*14675a02SAndroid Build Coastguard Worker virtual void PublishComputationCompleted(const ExampleStats& example_stats, 218*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, 219*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 220*14675a02SAndroid Build Coastguard Worker // Publish that the client starts to upload result. 221*14675a02SAndroid Build Coastguard Worker virtual void PublishResultUploadStarted() = 0; 222*14675a02SAndroid Build Coastguard Worker // Publish that an IO error occurred during result upload. 223*14675a02SAndroid Build Coastguard Worker virtual void PublishResultUploadIOError(absl::string_view error_message, 224*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, 225*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 226*14675a02SAndroid Build Coastguard Worker // Publish that the client has interrupted the result upload. 227*14675a02SAndroid Build Coastguard Worker virtual void PublishResultUploadClientInterrupted( 228*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const NetworkStats& network_stats, 229*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 230*14675a02SAndroid Build Coastguard Worker // Publish hat the server has aborted the result upload. 231*14675a02SAndroid Build Coastguard Worker virtual void PublishResultUploadServerAborted( 232*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const NetworkStats& network_stats, 233*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 234*14675a02SAndroid Build Coastguard Worker // Publish that the result upload is completed. 235*14675a02SAndroid Build Coastguard Worker virtual void PublishResultUploadCompleted(const NetworkStats& network_stats, 236*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 237*14675a02SAndroid Build Coastguard Worker // Publish that the task computation has failed, and the client starts to 238*14675a02SAndroid Build Coastguard Worker // upload the failure to the server. 239*14675a02SAndroid Build Coastguard Worker virtual void PublishFailureUploadStarted() = 0; 240*14675a02SAndroid Build Coastguard Worker // Publish that an IO error occurred during failure upload. 241*14675a02SAndroid Build Coastguard Worker virtual void PublishFailureUploadIOError(absl::string_view error_message, 242*14675a02SAndroid Build Coastguard Worker const NetworkStats& network_stats, 243*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 244*14675a02SAndroid Build Coastguard Worker // Publish that the client has interrupted the failure upload. 245*14675a02SAndroid Build Coastguard Worker virtual void PublishFailureUploadClientInterrupted( 246*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const NetworkStats& network_stats, 247*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 248*14675a02SAndroid Build Coastguard Worker // Publish that the server has aborted the failure upload. 249*14675a02SAndroid Build Coastguard Worker virtual void PublishFailureUploadServerAborted( 250*14675a02SAndroid Build Coastguard Worker absl::string_view error_message, const NetworkStats& network_stats, 251*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 252*14675a02SAndroid Build Coastguard Worker // Publish that the failure upload completed. 253*14675a02SAndroid Build Coastguard Worker virtual void PublishFailureUploadCompleted(const NetworkStats& network_stats, 254*14675a02SAndroid Build Coastguard Worker absl::Duration phase_duration) = 0; 255*14675a02SAndroid Build Coastguard Worker 256*14675a02SAndroid Build Coastguard Worker // After calling this function, all subsequently published events will be 257*14675a02SAndroid Build Coastguard Worker // annotated with the specified model_identifier. This value is typically 258*14675a02SAndroid Build Coastguard Worker // provided by the federated server and used on events resulting from 259*14675a02SAndroid Build Coastguard Worker // PublishEligibilityEvalCheckinFinished(), PublishCheckinFinished() and 260*14675a02SAndroid Build Coastguard Worker // later. 261*14675a02SAndroid Build Coastguard Worker // 262*14675a02SAndroid Build Coastguard Worker // Note that this method may be called multiple times with different values, 263*14675a02SAndroid Build Coastguard Worker // if over the course of a training session multiple models are executed. 264*14675a02SAndroid Build Coastguard Worker virtual void SetModelIdentifier(const std::string& model_identifier) = 0; 265*14675a02SAndroid Build Coastguard Worker 266*14675a02SAndroid Build Coastguard Worker // Returns a pointer to a publisher which records secure aggregation protocol 267*14675a02SAndroid Build Coastguard Worker // events. The returned value must not be nullptr. 268*14675a02SAndroid Build Coastguard Worker virtual SecAggEventPublisher* secagg_event_publisher() = 0; 269*14675a02SAndroid Build Coastguard Worker }; 270*14675a02SAndroid Build Coastguard Worker 271*14675a02SAndroid Build Coastguard Worker } // namespace client 272*14675a02SAndroid Build Coastguard Worker } // namespace fcp 273*14675a02SAndroid Build Coastguard Worker 274*14675a02SAndroid Build Coastguard Worker #endif // FCP_CLIENT_EVENT_PUBLISHER_H_ 275