macos - 使用多个 get 时,node.js 上的 Couchbase 2.0 会崩溃

标签 macos node.js crash couchbase

我正在 Mac OS X Mountain Lion 10.8.2 上使用 Couchbase 2.0、node.js 0.8.19、couchbase 模块 0.0.11 和 libcouchbase 2.0.3 制作一个项目原型(prototype)。

如果 Couchbase 存储桶为空(这两个文档不存在),下面的代码将导致 Node 进程崩溃,如下所示。我用 debug 构建了 Node,并使用 gdb 进行回溯。

node_g(96149,0x7fff75619180) malloc: *** error for object 0x10300fb7f: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

Program received signal SIGABRT, Aborted.
0x00007fff8bbf7212 in __pthread_kill ()
(gdb) backtrace
#0  0x00007fff8bbf7212 in __pthread_kill ()
#1  0x00007fff8cd6eaf4 in pthread_kill ()
#2  0x00007fff8cdb2dce in abort ()
#3  0x00007fff8cd86959 in free ()
#4  0x0000000101e91c33 in lcb_server_purge_implicit_responses ()
#5  0x0000000101e89f09 in lcb_server_event_handler ()
#6  0x0000000101adebab in maybe_callout [inlined] () at :34
#7  0x0000000101adebab in async_cb (handle=<value temporarily unavailable, due to optimizations>, status=0) at ../io/common.c:68
#8  0x00000001000442ea in uv__async_io (loop=<value temporarily unavailable, due to optimizations>, handle=0x1c042a000000000, events=1060378680) at ../deps/uv/src/unix/async.c:117
#9  0x0000000100049c24 in ev_invoke_pending (loop=0x10082bd68) at ../deps/uv/src/unix/ev/ev.c:2145
#10 0x00000001000445e8 in uv__run (loop=0x10082b420) at ../deps/uv/src/unix/core.c:248
#11 0x0000000100044517 in uv_run (loop=0x10082b420) at ../deps/uv/src/unix/core.c:265
#12 0x0000000100008d9b in node::Start (argc=<value temporarily unavailable, due to optimizations>, argv=0x7fff5fbffb98) at ../src/node.cc:2974
#13 0x0000000100000cb4 in start ()

如果这两个文档已经存在,则此方法有效。仅当文档不存在时才会崩溃。 如果我不使用多重获取(例如 View )来检查文档是否存在 - 它可以工作。如果你问为什么我明确检查是否存在并且不依赖 CAS - 大多数文档已经存在,所以我无论如何都必须在更新之前提取它们。

相同的代码在具有相同版本的 Node.js 和库的(Amazon 托管的)CentOS 6 镜像上运行良好。

我做错了什么或者 Mac OS X 上有问题吗? 这是一个简单的例子来说明问题。完整的代码将现有数据与新文档合并,并进行 CAS 检查,这里省略所有这些。

我找不到报告 Couchbase 错误的位置。 JIRA未开放且 forum有点蹩脚。

var async = require("async");
var couchBase = require("couchbase");

var json = {
  "id1": {
    "id": "id1",
    "name": "Name 1"
  },

  "id2": {
    "id": "id2",
    "name": "Name 2"
  }
};

var config = {
  "host": "localhost",
  "port": 8091,
  "username": "Administrator",
  "password": "password",
  "bucket": "requests"
};

couchBase.connect(config, function(err, bucket) {
  if (err) {
    console.log("Unable to connect to Couchbase bucket [" + config.bucket + "]", err);
    process.exit(1);
  }

  console.log("Connected to Couchbase");

  var ids = [];
  var jsonDocs = [];
  for (var key in json) {
    if (json.hasOwnProperty(key)) {
      var jsonDoc = json[key];
      var id = jsonDoc.id;

      jsonDocs.push(jsonDoc);
      ids.push(id);
    }
  }

  bucket.get(ids, null, function(err, docs, metas) {
    if (err) {
      for (var j = 0; j < err.length; j++) {
        if (err[j].code != 13) {
          console.log({ err: err }, "Unable to get existing entries using multiple get. Error in element [" + j + "]");
          process.exit(1);
        }
      }
    }
    console.log("Checked all docs for existance");

    async.map(jsonDocs, function(doc, callback) {
      bucket.set(doc.id, doc, {}, function(err) {
        callback(err);
      });
    }, function(err, results) {
      if (err) {
        console.log("Unable to save all entries", err);
        process.exit(1);
      }

      console.log("Saved all entries");
      process.exit(0);
    });
  });
});

最佳答案

我在我的应用程序和您的示例代码中遇到了同样的问题。我将记录一个错误并将其放入下一版本 SDK 的修复列表中。

JIRA 是: http://www.couchbase.com/issues/browse/JSCBC-16

您无法记录错误?

我也在关注论坛,刚刚也在那里回答了你的问题。

关于macos - 使用多个 get 时,node.js 上的 Couchbase 2.0 会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14829946/

相关文章:

node.js - 如何配置 OpsWorks 以部署不受官方支持的 Node.js 版本?

objective-c - UIButton:单击时崩溃

c# - 当 GC 执行垃圾收集时我的程序崩溃

objective-c - 如何在具有 NSAttributedStrings 的 NSComboBox 中添加自动完成功能

python - 如何清除终端(Mac osx)回滚?

c++ - Rcpp错误,在mac上学习Rcpp和C++

javascript - 无法读取机器人框架中未定义错误的属性 'length'

javascript - 理解javascript继承和node.js util继承函数示例

android - 图像作为按钮背景-崩溃和工作

objective-c - 如何快速编写这段代码?