4

我有一个在Google Compute实例上运行的Python Django应用程序。它使用gcloudoem从Django接口到Google数据存储。 gcloudoem使用相同的底层代码与数据存储进行通信,因为gcloud-python 0.5.x来自Google计算实例的Google数据存储区中的Python错误

在似乎完全随机的时候,我会在尝试与Datastore对话时发生SSL错误。在我的应用程序代码中发生这种情况的地方没有任何模式。这只是在随机调用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) 

不幸的是,第二,我没有一个完整的堆栈跟踪方便:

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

当我使用GCD这些错误不会发生工具。有没有人知道这里发生了什么?这是一些网络问题?

回答

0

想到两件事可能会导致这种情况。对不起,这不是超级特定的;试图帮助!

  1. 线程 - 有跨越不知何故线程所共享的对象,这是造成问题
  2. 连接 - 有正在取得过多的连接,在故障发生(尤其对于第二错误)
5

尝试使用数据存储时,我也收到[SSL:WRONG_VERSION_NUMBER]错误,但是,我可以按需重复该错误。正如James所建议的,只要我引入另一个查询数据存储的线程,就会收到此错误。他们正在使用完全独立的应用程序级别的对象,但我会想象,因为它们在gcloud库中变得更低或者降低了仍然存在导致此问题的某种对象共享发生。

更新:自那之后我发现了以下非常有帮助的线程(https://github.com/GoogleCloudPlatform/gcloud-python/issues/1214),它识别了gcloud python apis中的一个问题,这是由于httplib2库的公共依赖关系导致不是线程安全的。

有人为gcloud套件编写了一个包装,它将使用请求库而不是httplib2(gcloud requests),但它是为Python 2.7构建的。我没有尝试将其转换为我的Python3项目,而是使用非常简单的httplib2shim库来将httplib2与urllib3一起修补。

这是因为添加此简单:

import httplib2shim 
httplib2shim.patch() 

我现在没有问题使得从多个线程调用。

:)

+0

的httplib2shim在python3效果很好。谢谢。 – deepelement

相关问题