signalapp/Signal-Server · warning · CallQualityInvalidArgumentsException
End timestamp not specified
Error message
End timestamp not specified
What it means
validateRequest in CallQualitySurveyManager rejects survey submissions whose endTimestamp is 0. A survey without a call end time is considered incomplete, so the manager throws CallQualityInvalidArgumentsException naming the endTimestamp field. This is a client-input validation failure, not a server error.
Solutions
- Include a valid endTimestamp in the survey request body
- Only submit the survey after the call has actually terminated and the end time is known
- Check that the client serializes the field as endTimestamp so it deserializes correctly server-side
Example fix
// before
{"startTimestamp": 1699999400, "callType": "audio"}
// after
{"startTimestamp": 1699999400, "callType": "audio", "endTimestamp": 1700000000} Defensive patterns
Strategy: validation
Validate before calling
if (!request.endTimestamp || request.endTimestamp === 0) { throw new Error('endTimestamp is required before submitting a call quality survey'); } Type guard
const hasEndTimestamp = (r) => typeof r.endTimestamp === 'number' && r.endTimestamp > 0;
Try / catch
try { await submitCallQualitySurvey(request); } catch (CallQualityInvalidArgumentsException e) { if ('endTimestamp'.equals(e.getField())) { setEndTimestamp(Date.now()) ; resubmit(); } } Prevention
- Only submit the survey after the call teardown completes and end time is known
- Persist call end time in all teardown paths, including error/crash recovery
- Add a client-side pre-submit check for all required fields
When it happens
Trigger: submitCallQualitySurvey invoked with a request whose getEndTimestamp() returns 0, i.e. the JSON body omitted endTimestamp or set it to 0.
Common situations: Clients that crash or are killed before the call ends and submit a partial survey; test harnesses constructing minimal request objects; field-name mismatches leaving the long defaulted to 0.
Understand the failure class
Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.
Related errors
- Start timestamp not specified
- Call type not specified
- Call end reason not specified
- invalid captcha action
- Blank header
AI-assisted analysis of signalapp/Signal-Server@100ab61c82 (2026-09-09).
Data as JSON: /api/errors/ee517244ed38acc6.
Report an issue: GitHub.
Appendix: source
Thrown at service/src/main/java/org/whispersystems/textsecuregcm/metrics/CallQualitySurveyManager.java:165
.build()), pubSubCallbackExecutor)
.whenComplete((_, throwable) -> {
if (throwable != null) {
logger.warn("Failed to publish call quality survey pub/sub message", throwable);
}
Metrics.counter(PUB_SUB_MESSAGE_COUNTER_NAME, "success", String.valueOf(throwable == null))
.increment();
});
}
@VisibleForTesting
static void validateRequest(final SubmitCallQualitySurveyRequest request) throws CallQualityInvalidArgumentsException {
if (request.getStartTimestamp() == 0) {
throw new CallQualityInvalidArgumentsException("Start timestamp not specified", "startTimestamp");
}
if (request.getEndTimestamp() == 0) {
throw new CallQualityInvalidArgumentsException("End timestamp not specified", "endTimestamp");
}
if (StringUtils.isBlank(request.getCallType())) {
throw new CallQualityInvalidArgumentsException("Call type not specified", "callType");
}
if (StringUtils.isBlank(request.getCallEndReason())) {
throw new CallQualityInvalidArgumentsException("Call end reason not specified", "callEndReason");
}
}
}
View on GitHub (pinned to 100ab61c82)