【问题标题】:Appengine runs a stale version of the code -- and stack traces don't match source codeAppengine 运行的是旧版本的代码——堆栈跟踪与源代码不匹配
【发布时间】:2019-07-18 04:36:14
【问题描述】:

我有一个 python27 appengine 应用程序。我的应用程序在代码初始化早期生成了 500 错误,我可以在 GCP 控制台的 StackDriver 调试器中检查堆栈跟踪。

我已经修补了代码,并在相同的服务名称和版本名称(即gcloud app deploy --version=SAME)下重新部署。不幸的是,旧错误仍然出现,堆栈跟踪中的行号反映了错误部署中的文件。如果我使用代码查看器来调试错误,我会被带到在线查看器中更新的修补代码——并且存在不匹配。它的行为就像应用程序实例正在保留代码的先前快照一样。

我对 GAE 的新鲜度和最终一致性保证很模糊。我是否必须等待一切才能为最新部署的版本提供服务?我可以强制它立即使用更新的代码吗?

我尝试过的事情:

我最初认为问题与版本控制有关,即可能请求在具有相同版本的实例之间进行负载平衡,但每个实例的代码略有不同。我对管理为新请求选择哪个 GAE 实例的实际规则有点模糊(尤其是 GAE 是否尝试基于源 IP 重用以前的实例)。当以相同的版本名称重新部署不同的代码时,我也不清楚活动实例是否会立即被销毁。

为了排除这种可能性,我尝试推送到新版本名称,然后删除所有以前的版本(使用gcloud app versions list 获取列表)。但这无济于事——尽管源代码在 GCP 控制台调试器中是最新的,但我仍然从旧代码中获得堆栈跟踪。等待几个小时也无济于事。

【问题讨论】:

  • 您希望通过不更改版本来实现(或避免)什么?
  • 谢谢。我已经添加了一些说明。这似乎是一件容易尝试的事情。我对版本控制的一致性保证很模糊,并希望涵盖更多的基础。我不太熟悉 GAE 如何将实例分配给传入请求,我也不确定 GAE 是否允许具有相同版本 ID 但不同代码的活动实例在任何给定时间共存。现在我知道actual cause,我意识到这些测试可能是不必要的。

标签: google-app-engine


【解决方案1】:

我尝试了两件事:

  1. 在 GAE->设置中禁用和重新启用应用程序
  2. 我还注意到快照中上传了一些 .pyc 文件,因此我删除了这些文件并重新部署。

我发现 (1) 是停止所有正在运行的 appengine 实例的一种非常有效的方法。当您部署项目的新版本时,会创建流量拆分(即旧版本为 0%,新版本为 100%),但根据我的经验,如果最近使用过旧实例,它们可能仍在运行(尽管它们被配置为接收 0% 的流量)。切换会立即杀死他们。不幸的是,我发现我的旧代码在重新启用后仍在使用。

(2) 成功了。 .pyc 被上传并不明显。我通过查看GCP->StackDriver->Debug 发现了它,并且在树快照中看到了 .pyc 文件。

我最近更新了我的 .gitignore 以忽略项目本地安装的 pip 运行时依赖项(pip install -t lib requirements.txt 的输出)。我不想要 git 中的那些,但它们确实需要作为我的 appengine 项目的一部分发布。我从.gcloudignore 中删除了#!.gitignore 特殊包含行。但是,我忘记将*.pyc 重新添加到我的.gcloudignore 中。

查看应用部署中包含的完整文件集的另一种方法是在 gcloud app deploy 命令上将详细程度增加到 info - 您会看到带有校验和的巨大 json 清单。我通常不会打开它,因为它很难目视检查,但我会在那里发现 .pyc。

【讨论】:

  • 您可能希望将skip_files app.yaml 选项中的默认模式添加到.gcloudignore 文件中(我不知道.gcloudignore 的记录默认值)。他们会覆盖.pyc 文件。
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 2020-10-25
  • 1970-01-01
  • 2015-05-25
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多