Cloudant在文档更新时返回500个function_clause错误,但实际上成功

时间:2015-04-23 17:13:39

标签: java couchdb cloudant ibm-cloud

我有一个在Bluemix中运行的Java / Liberty应用程序,它使用Cloudant数据库作为Bluemix服务。

应用程序对Cloudant中的文档进行更新。在夜间,其中一个更新失败,出现500“function_clause”错误。遗憾的是,我们没有记录提交的确切数据,但在这种情况下,我认为这并不重要,因为请求似乎实际上已经成功(这意味着提交的数据没有任何实际错误)。我们的日志显示几分钟前同一文档的成功更新:

[4/23/15 6:02:47:790 UTC] 00011bf6 CloudantDBCon I   Storing object: <mydoc> revision: 28786-84dc6b5f33dc3c54041bd430ecfd3db7
[4/23/15 6:02:47:844 UTC] 00011bf6 CloudantDBCon I   RESTResponse:201:{"ok":true,"id":"<mydoc>","rev":"28787-f932d7d249fd6d36d8b0e692f6e77abd"}

请注意,下一个版本应为28787.然后在不到一分钟后发生错误。没有其他尝试在其间更新此文档,因此不存在冲突:

[4/23/15 6:03:03:215 UTC] 00011cc9 CloudantDBCon I   Storing object: <mydoc> revision: 28787-f932d7d249fd6d36d8b0e692f6e77abd
[4/23/15 6:03:10:171 UTC] 00011cc9 CloudantDBCon I   RESTResponse:500:{"error":"function_clause","reason":null,"ref":1199554705}

然而,在那之后几分钟又有另一次成功的更新:

[4/23/15 6:05:39:605 UTC] 00011b5e CloudantDBCon I   Storing object: <mydoc> revision: 28788-306b2753e972f9d664d22cfadd9b0f3d
[4/23/15 6:05:40:368 UTC] 00011b5e CloudantDBCon I   RESTResponse:201:{"ok":true,"id":"<mydoc>","rev":"28789-0325241da136f39780ff4b2f97438182"}

请注意,此成功更新是修订版28788,这意味着实际执行了收到错误的28787更新。事实上,我从日志中的其他信息中了解到28787修订版试图完成的内容,当我手动检查数据库时,我可以看出28787中所做的更改实际上是在数据库中进行的。所以错误似乎不正确。

这是一个问题,因为我们的应用程序向我们的用户返回了一个错误,因为这表明没有进行更新,实际上是这样。

所以我的问题具体是a)这个错误意味着什么(我找不到任何在任何地方解释的东西)和b)我们可能做错了导致这个,或者它只是一个错误?

我想我们可以在看到500错误后再次获取文档并验证数据是否实际写入,但这是一个非常难看的解决方案。

编辑:

我无法发布与此相关的所有代码,但生成问题中引用的跟踪语句的直接部分是:

public void storeObject(String id, JSONObject obj) {
    try {
        String rev = null;
        try {
            rev = obj.getString("_rev");
        } catch (JSONException jse) {
            rev = "none";
        }
        log.info("Storing object: " + id + " revision: " + rev);
        RESTResponse response = RESTClient.RESTRequestWithRetry(REQUEST_METHOD_PUT,
                                                                URL + "/" + id,
                                                                obj.toString(),
                                                                username,
                                                                password,
                                                                RETRY_INTERVAL);
        log.info("storeObject: " + response.toString());
        ...

您至少可以看到它与trace语句的匹配情况,即对象中的修订是否正确。

基本问题是为什么Cloudant执行更新但声称它没有返回500?

0 个答案:

没有答案