有没有办法以编程方式(或从终端)检查是否有任何应用程序引擎索引正在构建?

时间:2013-05-09 00:42:30

标签: google-app-engine deployment indexing

我们的团队进行了大量快速迭代和部署,并且我试图让部署更安全(知道你不会关闭网站)。我已经实施了常规测试,但有一件事困扰了我们几次是网站部署了基于其他人刚刚部署的新索引的查询(但索引尚未完成构建,因此任何使用它们的页面都会失败一个NeedIndexError)。

我正在寻找一种在我们的部署脚本中实施检查的方法,如果尝试部署之前,如果任何索引仍在构建,它将响应。

有人知道您是否可以通过终端或某些API查看此信息?我没有找到任何运气,我希望不必沿着刮掉App Engine控制台索引页面的路线来检查“建筑”这个词。

2 个答案:

答案 0 :(得分:2)

好吧,我记得暗淡的黑暗过去的一些东西。 (你还没有说过你使用的是python还是java,所以这里可以试试python)。

google.appengine.api.datastore_admin有许多与索引相关信息相关的方法。 特别是GetIndices调用。我目前没有任何建筑物索引,所以我无法确切地看到建筑物指数处于什么状态。但是看看下面你会得到这个想法。

以下是来自remote_api_shell会话。

s~xxxx> from google.appengine.api import datastore_admin
s~xxxx> x=datastore_admin.GetIndices()
s~xxxx> x[0]
<google.appengine.datastore.entity_pb.CompositeIndex instance at 0x926fa2c>

s~xxxx> x[0].has_state()
1
s~xxxx> x[0].state()
2
s~xxxx> x[0].State_Name(x[0].state())
'READ_WRITE'


s~xxxx> print str(x[0])
app_id: "s~xxxx"
id: 1
definition <
  entity_type: "Plant"
  ancestor: false
  Property {
    name: "class"
    direction: 1
  }
  Property {
    name: "family"
    direction: 1
  }
  Property {
    name: "name"
    direction: 1
  }
>
state: 2

s~xxxx> 

所以稍微探讨一下你可能会看到索引何时停止构建。此时,您可以使用appcfg将特定版本提升为默认版本,或者为新部署启动某些测试等....

让我们知道您对建筑物索引的索引状态所看到的内容。

为了完整起见,我实际上已经问过在2009年以编程方式获取索引的定义,而Nick Johnson提醒我这个功能。请参阅帖子https://groups.google.com/forum/#!searchin/google-appengine/defined$20indexes/google-appengine/nCzSLJkoZuQ/X4GQ0GMBI0gJ

答案 1 :(得分:1)

以下代码段将阻止,直到所有索引都构建完成。我在运行update之前使用它。

(以gist形式:https://gist.github.com/jgeewax/5650457

#!/usr/bin/env python

# Need to import and fix the sys path before importing other things.
import remote_api_shell
remote_api_shell.fix_sys_path()

import time

from google.appengine.api import datastore_admin
from google.appengine.ext.remote_api import remote_api_stub
from google.appengine.tools import appengine_rpc


def configure_remote_api():
  def auth_func():
    return ('<YOUR_EMAIL>', '<APP_SPECIFIC_PASSWORD>')

  remote_api_stub.ConfigureRemoteApi(
      '<APP_ID>', '/_ah/remote_api', auth_func,
      servername='<APP_ID>.appspot.com',
      save_cookies=True, secure=False,
      rpc_server_factory=appengine_rpc.HttpRpcServer)
  remote_api_stub.MaybeInvokeAuthentication()


def main():
  print 'Checking indexes...'

  configure_remote_api()

  interval = 10  # seconds.
  building = True

  while building:
    # Start with a fresh run: maybe we're done building?
    building = False

    for index in datastore_admin.GetIndices('s~<APP_ID>'):
      # If any single index is building, we're not done.
      # Sleep for a bit and then this cycle should repeat.
      if not index.has_state() or index.state() != index.READ_WRITE:
        building = True
        print 'Indexes are still building... Waiting %s seconds.' % interval
        time.sleep(interval)
        break

  print 'All indexes are up to date.'


if __name__ == '__main__':
  main()