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

  1. Include a valid endTimestamp in the survey request body
  2. Only submit the survey after the call has actually terminated and the end time is known
  3. 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

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


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)