Missing submissions in Kobotoolbox that were definitely submitted by Kobocollect

In extreme rare cases, I have seen some missing submissions. What happened today is we lost 6 submissions from 2 different users. They have been definitely submitted from Kobocollect, but somehow there’s no trace of them on the server.

Going through the kobocat uwsgi logs, I notice these exceptions:

First:

ERROR 2022-09-20 02:24:32,069 log 12966 140655028680576 Internal Server Error: /api/v1/data/66
Traceback (most recent call last):
  File "/opt/venv/lib/python3.8/site-packages/pymongo/pool.py", line 1184, in _get_socket_no_auth
    sock_info = self.sockets.popleft()
IndexError: pop from an empty deque

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/venv/lib/python3.8/site-packages/pymongo/pool.py", line 1089, in connect
    sock = _configured_socket(self.address, self.opts)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/pool.py", line 895, in _configured_socket
    sock = _create_connection(address, options)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/pool.py", line 876, in _create_connection
    raise err
  File "/opt/venv/lib/python3.8/site-packages/pymongo/pool.py", line 869, in _create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/opt/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/opt/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python3.8/contextlib.py", line 75, in inner
    return func(*args, **kwds)
  File "/opt/venv/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/viewsets.py", line 114, in view
    return self.dispatch(request, *args, **kwargs)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
    raise exc
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)
  File "./onadata/apps/api/viewsets/data_viewset.py", line 686, in list
    res = super().list(request, *args, **kwargs)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/mixins.py", line 46, in list
    return Response(serializer.data)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 760, in data
    ret = super().data
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 260, in data
    self._data = self.to_representation(self.instance)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 677, in to_representation
    return [
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 678, in <listcomp>
    self.child.to_representation(item) for item in iterable
  File "./onadata/libs/serializers/data_serializer.py", line 73, in to_representation
    return [MongoHelper.to_readable_dict(record) for record in cursor]
  File "./onadata/libs/serializers/data_serializer.py", line 73, in <listcomp>
    return [MongoHelper.to_readable_dict(record) for record in cursor]
  File "/opt/venv/lib/python3.8/site-packages/pymongo/cursor.py", line 1156, in next
    if len(self.__data) or self._refresh():
  File "/opt/venv/lib/python3.8/site-packages/pymongo/cursor.py", line 1073, in _refresh
    self.__send_message(q)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/cursor.py", line 953, in __send_message
    response = client._run_operation_with_response(
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1342, in _run_operation_with_response
    return self._retryable_read(
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1457, in _retryable_read
    with self._slaveok_for_server(read_pref, server, session,
  File "/usr/local/lib/python3.8/contextlib.py", line 113, in __enter__
    return next(self.gen)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1282, in _slaveok_for_server
    with self._get_socket(server, session, exhaust=exhaust) as sock_info:
  File "/usr/local/lib/python3.8/contextlib.py", line 113, in __enter__
    return next(self.gen)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1221, in _get_socket
    with server.get_socket(
  File "/usr/local/lib/python3.8/contextlib.py", line 113, in __enter__
    return next(self.gen)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/pool.py", line 1135, in get_socket
    sock_info = self._get_socket_no_auth()
  File "/opt/venv/lib/python3.8/site-packages/pymongo/pool.py", line 1187, in _get_socket_no_auth
    sock_info = self.connect()
  File "/opt/venv/lib/python3.8/site-packages/pymongo/pool.py", line 1098, in connect
    _raise_connection_failure(self.address, error)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/pool.py", line 290, in _raise_connection_failure
    raise AutoReconnect(msg)
pymongo.errors.AutoReconnect: mongo.mydomain.private:27017: [Errno 111] Connection refused
ERROR 2022-09-20 02:24:32,636 log 12697 140655028680576 Internal Server Error: /api/v1/data/56
Traceback (most recent call last):
  File "/opt/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/opt/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/opt/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python3.8/contextlib.py", line 75, in inner
    return func(*args, **kwds)
  File "/opt/venv/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/viewsets.py", line 114, in view
    return self.dispatch(request, *args, **kwargs)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
    raise exc
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)
  File "./onadata/apps/api/viewsets/data_viewset.py", line 686, in list
    res = super().list(request, *args, **kwargs)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/mixins.py", line 46, in list
    return Response(serializer.data)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 760, in data
    ret = super().data
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 260, in data
    self._data = self.to_representation(self.instance)
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 677, in to_representation
    return [
  File "/opt/venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 678, in <listcomp>
    self.child.to_representation(item) for item in iterable
  File "./onadata/libs/serializers/data_serializer.py", line 73, in to_representation
    return [MongoHelper.to_readable_dict(record) for record in cursor]
  File "./onadata/libs/serializers/data_serializer.py", line 73, in <listcomp>
    return [MongoHelper.to_readable_dict(record) for record in cursor]
  File "/opt/venv/lib/python3.8/site-packages/pymongo/cursor.py", line 1156, in next
    if len(self.__data) or self._refresh():
  File "/opt/venv/lib/python3.8/site-packages/pymongo/cursor.py", line 1093, in _refresh
    self.__send_message(g)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/cursor.py", line 953, in __send_message
    response = client._run_operation_with_response(
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1342, in _run_operation_with_response
    return self._retryable_read(
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1464, in _retryable_read
    return func(session, server, sock_info, slave_ok)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1334, in _cmd
    return server.run_operation_with_response(
  File "/opt/venv/lib/python3.8/site-packages/pymongo/server.py", line 117, in run_operation_with_response
    reply = sock_info.receive_message(request_id)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/pool.py", line 646, in receive_message
    self._raise_connection_failure(error)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/pool.py", line 643, in receive_message
    return receive_message(self.sock, request_id,
  File "/opt/venv/lib/python3.8/site-packages/pymongo/network.py", line 196, in receive_message
    _receive_data_on_socket(sock, 16))
  File "/opt/venv/lib/python3.8/site-packages/pymongo/network.py", line 261, in _receive_data_on_socket
    raise AutoReconnect("connection closed")
pymongo.errors.AutoReconnect: connection closed

Second:

Traceback (most recent call last):
  File "/opt/venv/lib/python3.8/site-packages/django/db/models/query.py", line 538, in get_or_create
    return self.get(**kwargs), False
  File "/opt/venv/lib/python3.8/site-packages/django/db/models/query.py", line 406, in get
    raise self.model.DoesNotExist(
onadata.apps.viewer.models.parsed_instance.ParsedInstance.DoesNotExist: ParsedInstance matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./onadata/apps/viewer/models/parsed_instance.py", line 60, in update_mongo_instance
    xform_instances.replace_one({'_id': record['_id']}, record, upsert=True)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/collection.py", line 926, in replace_one
    self._update_retryable(
  File "/opt/venv/lib/python3.8/site-packages/pymongo/collection.py", line 854, in _update_retryable
    return self.__database.client._retryable_write(
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1490, in _retryable_write
    with self._tmp_session(session) as s:
  File "/usr/local/lib/python3.8/contextlib.py", line 113, in __enter__
    return next(self.gen)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1823, in _tmp_session
    s = self._ensure_session(session)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1810, in _ensure_session
    return self.__start_session(True, causal_consistency=False)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1763, in __start_session
    server_session = self._get_server_session()
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1796, in _get_server_session
    return self._topology.get_server_session()
  File "/opt/venv/lib/python3.8/site-packages/pymongo/topology.py", line 482, in get_server_session
    self._select_servers_loop(
  File "/opt/venv/lib/python3.8/site-packages/pymongo/topology.py", line 208, in _select_servers_loop
    raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: No servers found yet
Submission could not be saved to Mongo.
Traceback (most recent call last):
  File "/opt/venv/lib/python3.8/site-packages/django/db/models/query.py", line 538, in get_or_create
    return self.get(**kwargs), False
  File "/opt/venv/lib/python3.8/site-packages/django/db/models/query.py", line 406, in get
    raise self.model.DoesNotExist(
onadata.apps.viewer.models.parsed_instance.ParsedInstance.DoesNotExist: ParsedInstance matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./onadata/apps/viewer/models/parsed_instance.py", line 60, in update_mongo_instance
    xform_instances.replace_one({'_id': record['_id']}, record, upsert=True)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/collection.py", line 926, in replace_one
    self._update_retryable(
  File "/opt/venv/lib/python3.8/site-packages/pymongo/collection.py", line 854, in _update_retryable
    return self.__database.client._retryable_write(
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1490, in _retryable_write
    with self._tmp_session(session) as s:
  File "/usr/local/lib/python3.8/contextlib.py", line 113, in __enter__
    return next(self.gen)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1823, in _tmp_session
    s = self._ensure_session(session)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1810, in _ensure_session
    return self.__start_session(True, causal_consistency=False)
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1763, in __start_session
    server_session = self._get_server_session()
  File "/opt/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1796, in _get_server_session
    return self._topology.get_server_session()
  File "/opt/venv/lib/python3.8/site-packages/pymongo/topology.py", line 482, in get_server_session
    self._select_servers_loop(
  File "/opt/venv/lib/python3.8/site-packages/pymongo/topology.py", line 208, in _select_servers_loop
    raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: No servers found yet

I found hundreds of instances of the second error.
As a first step, I ran python3 run.py to restart all containers, and all submissions since then seem fine and no exceptions have been noted.

@jnm sorry for tagging you, but it’s a bit urgent and critical as the data for this was collected in a remote location and submitted later, so there’s no option to go back and get the data.

  1. Is there any way to retrieve these submissions? The user had set the option in Kobocollect to delete the submission from the device after sending due to storage space issues.
  2. Am I right in assuming that this is a server load issue and such future issues could be prevented by adding more workers? If so, isn’t there a fallback to not accept submissions when the server is overloaded?

Thanks a lot.