2

「ロック解除されたロックの解放」エラーがGoogleAppEngine(gqueues)のアプリのログにときどき表示され、その理由を理解できません(以下の完全なスタックトレース)。このエラーが発生する理由を誰かが知っていますか?

興味深いことに、このアプリはpython2.7でthreadsafe=NOを使用しているため、ロックが発生したり、ロックエラーが発生したりするのは奇妙に思えます。

裏話:GQueuesはpython2.5にあり、4月の初めに2.7に移行し、threadsafe=Trueに設定しました。1週間はすべて正常に機能しました。その後、4月9日の朝、アプリ全体にアクセスできなくなり、500個のエラーが発生しました。30秒を超えるレイテンシを持つ新しいサーバーインスタンスを生成し続けました。ログに「ロック解除されたロックをロック解除できません」というエラーが表示されていることに気付きました。移行中にコードにロックメカニズムを追加しなかったため、これはエラーが参照しているアプリエンジンのロックであると想定しました。とにかく、私はアプリを以前のバージョンにロールバックしましたが、それはまだPython 2.5にあり、すべてが再び機能し始めました。

4月の後半にAppEngineDowntimeNotifyは、Python2.7アプリで問題を引き起こしている4月9日の終わりに問題があったことを明らかにしました。 https://groups.google.com/d/topic/google-appengine-downtime-notify/QL8TmRn6Ay4/discussion

私はGoogleのChristinaIlventoにフォローアップしましたが、彼女は今すぐPython 2.7に戻って、threadsafe=Trueに変更しても問題ないと考えました。2.7に戻しましたが、threadsafe = Falseのままにしました。これは、スレッドを再度オンにする前に、2.7ですべてが正常に機能することを確認するために数週間かかると考えたためです(これが問題の原因であると想定しました)。数週間はすべて正常に機能しましたが、スレッドが無効になっている場合でも、この「ロック解除されたロックの解放」エラーが表示されます。誰かがここで何が起こっているのか知っていますか?

Christinaは、ここに投稿するとAppEngineチームがフォローアップすることを提案しました。

ロック解除されたロックを解除する
トレースバック(最後の最後の呼び出し):
  ファイル"/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py"、行545、ディスパッチ中
    return method(* args、** kwargs)
  ファイル「/base/data/home/apps/s~gqueues-hrd/gq3-7-5.358902352474055782/controllers/util.py」、69行目、check_login
    handler_method(self、* args)
  ファイル"/base/data/home/apps/s~gqueues-hrd/gq3-7-5.358902352474055782/controllers/main.py"、行297、get
    self.generate('main.html'、template_values)
  ファイル"/base/data/home/apps/s~gqueues-hrd/gq3-7-5.358902352474055782/controllers/baserequest.py"、257行目
    self.response.out.write(template.render(path、values))
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/webapp/template.py"、92行目、レンダリング
    t.render(Context(template_dict))を返します
  wrap_renderのファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/webapp/template.py"、行172
    orig_render(context)を返す
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行173、レンダリング
    self._render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、167行目、_render
    self.nodelist.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行794、レンダリング
    bits.append(self.render_node(node、context))
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行807、render_node
    node.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/loader_tags.py"、139行目、レンダリング
    self.template.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行173、レンダリング
    self._render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、167行目、_render
    self.nodelist.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行794、レンダリング
    bits.append(self.render_node(node、context))
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行807、render_node
    node.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/defaulttags.py"、行173、レンダリング
    nodelist.append(node.render(context))
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/defaulttags.py"、257行目、レンダリング
    self.nodelist_true.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行794、レンダリング
    bits.append(self.render_node(node、context))
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行807、render_node
    node.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/loader_tags.py"、139行目、レンダリング
    self.template.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行173、レンダリング
    self._render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、167行目、_render
    self.nodelist.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行794、レンダリング
    bits.append(self.render_node(node、context))
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行807、render_node
    node.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/loader_tags.py"、139行目、レンダリング
    self.template.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行173、レンダリング
    self._render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、167行目、_render
    self.nodelist.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行794、レンダリング
    bits.append(self.render_node(node、context))
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行807、render_node
    node.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/defaulttags.py"、行173、レンダリング
    nodelist.append(node.render(context))
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/loader_tags.py"、139行目、レンダリング
    self.template.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行173、レンダリング
    self._render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、167行目、_render
    self.nodelist.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行794、レンダリング
    bits.append(self.render_node(node、context))
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行807、render_node
    node.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/loader_tags.py"、139行目、レンダリング
    self.template.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行173、レンダリング
    self._render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、167行目、_render
    self.nodelist.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行794、レンダリング
    bits.append(self.render_node(node、context))
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/__init__.py"、行807、render_node
    node.render(context)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/_internal/django/template/defaulttags.py"、行136、レンダリング
    値=リスト(値)
  次のファイル「/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py」、2312行目
    self .__ model_class.from_entity(self .__ iterator.next())を返します
  次のファイル「/base/python27_runtime/python27_lib/versions/1/google/appengine/datastore/datastore_query.py」、2809行目
    next_batch = self .__ batcher.next()
  次のファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/datastore/datastore_query.py"、行2671
    self.next_batch(self.AT_LEAST_ONE)を返します
  next_batchのファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/datastore/datastore_query.py"、2708行
    バッチ=self.__ next_batch.get_result()
  get_resultのファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py"、行592
    self .__ get_result_hook(self)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/datastore/datastore_query.py"、2450行目、__ query_result_hook
    self._batch_shared.conn.check_rpc_success(rpc)
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/datastore/datastore_rpc.py"、

更新:エラーの1つの完全なバックトレースは次のとおりです

46.231.181.199-sandra.martin [15 / May / 2012:03:28:44 -0700] "POST / items / HTTP / 1.1" 500 1306 "http://www.gqueues.com/main?q=ag1zfmdxdWV1ZXMtaHJkciILEgdBY2NvdW50GL- psgYMCxILU2hhcmVkUXVldWUYkU4M ";;;; "Mozilla / 5.0(Windows NT 6.1; rv:12.0)Gecko / 20100101 Firefox / 12.0" "www.gqueues.com" ms = 59858 cpu_ms = 154948 api_cpu_ms = 112433 cpm_usd = 4.305925 instance = 00c61b117cfbf1818fa4b0f779eacc7f4a9030
D 2012-05-15 05:27:45.121
postAction:並べ替え
E 2012-05-15 05:28:44.714
ロック解除されたロックを解除する
トレースバック(最後の最後の呼び出し):
  ファイル"/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py"、行545、ディスパッチ中
    return method(* args、** kwargs)
  ファイル"/base/data/home/apps/s~gqueues-hrd/gq3-7-5.358902352474055782/controllers/util.py"、139行目、check_login
    handler_method(self、* args)
  ファイル"/base/data/home/apps/s~gqueues-hrd/gq3-7-5.358902352474055782/controllers/items.py"、371行目、投稿
    self.reorder()
  ファイル"/base/data/home/apps/s~gqueues-hrd/gq3-7-5.358902352474055782/controllers/items.py"、行856、並べ替え
    QueueSyncHandler.syncQueueViewers(clientId、itemQueue)
  syncQueueViewersのファイル"/base/data/home/apps/s~gqueues-hrd/gq3-7-5.358902352474055782/controllers/queuesync.py"、行197
    jsonObj ['items'] = util.getJSONItems(queueItems、filter、queueViewer.type、accountObj)
  getJSONItemsのファイル"/base/data/home/apps/s~gqueues-hrd/gq3-7-5.358902352474055782/controllers/util.py"、行1536
    jsonItem ['subitems'] = getJSONItems(subItems、filter、type、accountObj、assignmentCompleted = AssignmentCompleted、accountEmail = accountEmail)
  getJSONItemsのファイル"/base/data/home/apps/s~gqueues-hrd/gq3-7-5.358902352474055782/controllers/util.py"、行1536
    jsonItem ['subitems'] = getJSONItems(subItems、filter、type、accountObj、assignmentCompleted = AssignmentCompleted、accountEmail = accountEmail)
  getJSONItemsのファイル"/base/data/home/apps/s~gqueues-hrd/gq3-7-5.358902352474055782/controllers/util.py"、行1536
    jsonItem ['subitems'] = getJSONItems(subItems、filter、type、accountObj、assignmentCompleted = AssignmentCompleted、accountEmail = accountEmail)
  getJSONItemsのファイル"/base/data/home/apps/s~gqueues-hrd/gq3-7-5.358902352474055782/controllers/util.py"、行1481
    item.hasAssignments()の場合:
  hasAssignmentsのファイル"/base/data/home/apps/s~gqueues-hrd/gq3-7-5.358902352474055782/models.py"、行1512
    itemAssignments = Assignment.all(keys_only = True).filter('item ='、self).fetch(1)
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py"、2143行目、フェッチ
    リターンリスト(self.run(limit = limit、offset = offset、** kwargs))
  次のファイル「/base/python27_runtime/python27_lib/versions/1/google/appengine/datastore/datastore_query.py」、2809行目
    next_batch = self .__ batcher.next()
  次のファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/datastore/datastore_query.py"、行2671
    self.next_batch(self.AT_LEAST_ONE)を返します
  next_batchのファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/datastore/datastore_query.py"、2708行
    バッチ=self.__ next_batch.get_result()
  get_resultのファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py"、行592
    self .__ get_result_hook(self)を返します
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/datastore/datastore_query.py"、2450行目、__ query_result_hook
    self._batch_shared.conn.check_rpc_success(rpc)
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/datastore/datastore_rpc.py"、行1206、check_rpc_success
    rpc.wait()
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py"、行533、待機中
    self .__ rpc.Wait()
  ファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/api/apiproxy_rpc.py"、行119、待機中
    rpc_completed = self._WaitImpl()
  _WaitImplのファイル"/base/python27_runtime/python27_lib/versions/1/google/appengine/runtime/apiproxy.py"、行134
    self .__ done_event.wait()
  ファイル"/base/python27_runtime/python27_dist/lib/python2.7/threading.py"、行407、待機中
    self .__ cond.release()
エラー:ロック解除されたロックを解放します

4

1 に答える 1

2

報告ありがとうございます。私たち(GAE pythonチーム)はこのバグを認識しています。おそらく何が起こっているのかというと、ハンドラーがリクエストの期限に達していて、https: //developers.google.com/appengine/docs/python/runtime#The_Request_Timerで警告する問題が発生している可能性があります。

いくつか確認していただけますか。1。例外トレースが不完全なようです。可能であれば、完全なバックトレースを投稿できますか。2.これにヒットしているリクエストのリクエスト時間を(ログで)確認して、ここに投稿できますか。

編集:私がリンクしたページの警告は最近投稿されました。

于 2012-05-16T05:41:25.377 に答える