According to the documentation the rcl_send_response function can return a RCL_RET_CLIENT_INVALID.
* \return RCL_RET_OK if the response was sent successfully, or
* RCL_RET_INVALID_ARGUMENT if any arguments are invalid, or
* RCL_RET_CLIENT_INVALID if the service is invalid, or
* RCL_RET_ERROR if an unspecified error occurs.
*/
RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_send_response(
const rcl_service_t * service,
rmw_request_id_t * response_header,
void * ros_response);
Shouldn't this be a RCL_RET_SERVICE_INVALID ?