我们的团队进行了大量快速迭代和部署,并且我试图让部署更安全(知道你不会关闭网站)。我已经实施了常规测试,但有一件事困扰了我们几次是网站部署了基于其他人刚刚部署的新索引的查询(但索引尚未完成构建,因此任何使用它们的页面都会失败一个NeedIndexError)。
我正在寻找一种在我们的部署脚本中实施检查的方法,如果尝试部署之前,如果任何索引仍在构建,它将响应。
有人知道您是否可以通过终端或某些API查看此信息?我没有找到任何运气,我希望不必沿着刮掉App Engine控制台索引页面的路线来检查“建筑”这个词。
答案 0 :(得分:2)
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()