1

我们的团队进行了很多快速迭代和部署,我正在努力使其部署更安全(知道您不会关闭站点)。我已经实施了常规测试,但困扰我们几次的一件事是该站点正在部署基于其他人刚刚部署的新索引的查询(但索引尚未完成构建,因此任何使用它们的页面都会失败需要索引错误)。

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

有谁知道您是否可以从终端或通过某些 API 进行检查?我没有找到任何运气,我希望不必去爬App Engine控制台的索引页面来检查“建筑”这个词。

4

2 回答 2

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 年就询问过以编程方式获取索引的定义,尼克约翰逊提醒我注意这种能力。查看群组帖子https://groups.google.com/forum/#!searchin/google-appengine/defined$20indexes/google-appengine/nCzSLJkoZuQ/X4GQ0GMBI0gJ

于 2013-05-09T09:10:22.520 回答
1

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

(要点形式: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()
于 2013-05-25T19:31:23.467 回答