private void HandleTimeSyncResponses(IBeaconSendingContext context, TimeSyncRequestsResponse response) { // time sync requests were *not* successful // -OR- // time sync requests are not supported by the server (e.g. AppMon) // -> use 0 as cluster time offset if (response.timeSyncOffsets.Count < TIME_SYNC_REQUESTS) { HandleErroneousTimeSyncRequest(context, response.response); return; } //sanity check to catch case with div/0 var calculatedOffset = ComputeClusterTimeOffset(response.timeSyncOffsets); if (calculatedOffset < 0) { return; } // initialize time provider with cluster time offset context.InitializeTimeSync(calculatedOffset, true); // update the last sync time context.LastTimeSyncTime = context.CurrentTimestamp; // perform transition to next state SetNextState(context); }
private TimeSyncRequestsResponse ExecuteTimeSyncRequests(IBeaconSendingContext context) { var response = new TimeSyncRequestsResponse(); var retry = 0; var sleepTimeInMillis = INITIAL_RETRY_SLEEP_TIME_MILLISECONDS; // no check for shutdown here, time sync has to be completed while (response.timeSyncOffsets.Count < TIME_SYNC_REQUESTS && !context.IsShutdownRequested) { // doExecute time-sync request and take timestamps var requestSendTime = context.CurrentTimestamp; var timeSyncResponse = context.GetHTTPClient().SendTimeSyncRequest(); var responseReceiveTime = context.CurrentTimestamp; if (BeaconSendingResponseUtil.IsSuccessfulResponse(timeSyncResponse)) { var requestReceiveTime = timeSyncResponse.RequestReceiveTime; var responseSendTime = timeSyncResponse.ResponseSendTime; // check both timestamps for being > 0 if ((requestReceiveTime > 0) && (responseSendTime > 0)) { // if yes -> continue time-sync var offset = ((requestReceiveTime - requestSendTime) + (responseSendTime - responseReceiveTime)) / 2; response.timeSyncOffsets.Add(offset); retry = 0; // on successful response reset the retry count & initial sleep time sleepTimeInMillis = INITIAL_RETRY_SLEEP_TIME_MILLISECONDS; } else { // if no -> stop time sync, it's not supported context.DisableTimeSyncSupport(); break; } } else if (retry >= TIME_SYNC_RETRY_COUNT) { // retry limit reached break; } else if (BeaconSendingResponseUtil.IsTooManyRequestsResponse(timeSyncResponse)) { // special handling for too many requests // clear all time sync offsets captured so far and store the response, which is handled later response.timeSyncOffsets.Clear(); response.response = timeSyncResponse; break; } else { context.Sleep(sleepTimeInMillis); sleepTimeInMillis *= 2; retry++; } } return(response); }