4

У меня есть приложение Django на Python, запущенное на экземпляре Google Compute. Он использует gcloudoem для взаимодействия с Django в Google Datastore. gcloudoem использует один и тот же базовый код для связи с Datastore как gcloud-python 0.5.xОшибки Google Datastore SSL в Python из экземпляров Google Compute

В то, что кажется совершенно случайным временем, я получу ошибки SSL при попытке поговорить с Datastore. В моем коде приложения нет шаблонов. Это просто во время случайного звонка в Datastore. Вот две разновидности ошибок:

ERROR:django.request:Internal Server Error: /complete/google-oauth2/ 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/cache.py", line 52, in _wrapped_view_func 
    response = view_func(request, *args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/csrf.py", line 57, in wrapped_view 
    return view_func(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/social/apps/django_app/utils.py", line 51, in wrapper 
    return func(request, backend, *args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/social/apps/django_app/views.py", line 28, in complete 
    redirect_name=REDIRECT_FIELD_NAME, *args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/social/actions.py", line 43, in do_complete 
    user = backend.complete(user=user, *args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/social/backends/base.py", line 41, in complete 
    return self.auth_complete(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/social/utils.py", line 229, in wrapper 
    return func(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/social/backends/oauth.py", line 387, in auth_complete 
    *args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/social/utils.py", line 229, in wrapper 
    return func(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/social/backends/oauth.py", line 396, in do_auth 
    return self.strategy.authenticate(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/social/strategies/django_strategy.py", line 96, in authenticate 
    return authenticate(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/__init__.py", line 60, in authenticate 
    user = backend.authenticate(**credentials) 
    File "/usr/local/lib/python2.7/dist-packages/social/backends/base.py", line 82, in authenticate 
    return self.pipeline(pipeline, *args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/social/backends/base.py", line 85, in pipeline 
    out = self.run_pipeline(pipeline, pipeline_index, *args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/social/backends/base.py", line 112, in run_pipeline 
    result = func(*args, **out) or {} 
    File "/usr/local/lib/python2.7/dist-packages/social/pipeline/social_auth.py", line 20, in social_user 
    social = backend.strategy.storage.user.get_social_auth(provider, uid) 
    File "./social_gc/storage.py", line 105, in get_social_auth 
    return cls.objects.get(provider=provider, uid=uid) 
    File "/usr/local/lib/python2.7/dist-packages/gcloudoem/queryset/__init__.py", line 162, in get 
    num = len(clone) 
    File "/usr/local/lib/python2.7/dist-packages/gcloudoem/queryset/__init__.py", line 126, in __len__ 
    self._fetch_all() 
    File "/usr/local/lib/python2.7/dist-packages/gcloudoem/queryset/__init__.py", line 370, in _fetch_all 
    self._result_cache = list(self.iterator()) 
    File "/usr/local/lib/python2.7/dist-packages/gcloudoem/datastore/query.py", line 480, in __iter__ 
    self.next_page() 
    File "/usr/local/lib/python2.7/dist-packages/gcloudoem/datastore/query.py", line 452, in next_page 
    transaction_id=transaction and transaction.id, 
    File "/usr/local/lib/python2.7/dist-packages/gcloudoem/datastore/connection.py", line 249, in run_query 
    response = self._rpc('runQuery', request, datastore_pb.RunQueryResponse) 
    File "/usr/local/lib/python2.7/dist-packages/gcloudoem/datastore/connection.py", line 159, in _rpc 
    data=request_pb.SerializeToString() 
    File "/usr/local/lib/python2.7/dist-packages/gcloudoem/datastore/connection.py", line 134, in _request 
    body=data 
    File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 589, in new_request 
    redirections, connection_type) 
    File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1609, in request 
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey) 
    File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1351, in _request 
    (response, content) = self._conn_request(conn, request_uri, method, body, headers) 
    File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1307, in _conn_request 
    response = conn.getresponse() 
    File "/usr/lib/python2.7/httplib.py", line 1127, in getresponse 
    response.begin() 
    File "/usr/lib/python2.7/httplib.py", line 453, in begin 
    version, status, reason = self._read_status() 
    File "/usr/lib/python2.7/httplib.py", line 409, in _read_status 
    line = self.fp.readline(_MAXLINE + 1) 
    File "/usr/lib/python2.7/socket.py", line 480, in readline 
    data = self._sock.recv(self._rbufsize) 
    File "/usr/lib/python2.7/ssl.py", line 734, in recv 
    return self.read(buflen) 
    File "/usr/lib/python2.7/ssl.py", line 621, in read 
    v = self._sslobj.read(len or 1024) 
SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1752) 

К сожалению, для второй, у меня нет полной StackTrace под рукой:

[SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decryption failed or bad record mac (_ssl.c:1752) 

Эти ошибки не происходят, когда я использую НОД инструмент. Кто-нибудь знает, что здесь происходит? Это какая-то сетевая проблема?

ответ

0

Приходят на ум две вещи, которые могут привести к этому. Извините, это не супер специфично; пытаясь помочь!

  1. Тема - есть объекты, разделяемые между потоками как-то, который является причиной проблемы
  2. Соединение - Есть слишком много установлений соединений, что приводит к неудаче (особенно для второй ошибки)
5

Я также получаю ошибку [SSL: WRONG_VERSION_NUMBER] при попытке использовать хранилище данных, однако я могу повторить ошибку по требованию. Как предложил Джеймс, я получаю эту ошибку, как только я представляю другой поток, запрашивающий Datastore. Они используют совершенно отдельные объекты уровня приложения, но я бы предположил, что по мере того, как они становятся ниже в библиотеке gcloud или ниже, все еще происходит какое-то событие совместного использования объектов, которое вызывает эту проблему.

UPDATE: С тех пор я нашел следующий очень полезный поток (https://github.com/GoogleCloudPlatform/gcloud-python/issues/1214), который идентифицирует проблему через api gcloud python из-за общей зависимости от библиотеки httplib2, которая, как оказалось, не является потокобезопасной.

Кто-то написал оболочку для пакета gcloud, которая будет использовать библиотеку запросов вместо httplib2 (gcloud requests), но она построена для Python 2.7. Я не пытался преобразовать его для моего проекта Python3 и вместо этого использовал очень простую библиотеку httplib2shim для обезьяны-патча httplib2 с urllib3.

Это было так же просто, как добавление этого:

import httplib2shim 
httplib2shim.patch() 

Я теперь делать звонки из нескольких потоков без проблем.

:)

+0

httplib2shim хорошо работает в python3. Благодарю. – deepelement