aliyun / aliyun-tablestore-nodejs-sdk

Aliyun TableStore(原OTS) SDK for Node.js
Apache License 2.0
88 stars 33 forks source link

sdk中各个操作对 callback的调用经常会遇到循环调用的情况 #2

Closed yi closed 7 years ago

yi commented 7 years ago

遇到的问题大致是这样的。当使用这个sdk对OTS进行操作的时候,如果在所传入的 callback 内的执行代码发生异常,那么这个 callback 会被无限执行下去直到 。

这个问题 100% 可以重现。抱歉暂时没有时间深挖。 但是感觉可能和 tablestore 的内部实现有关系,因为没有在其他 npm 模块上遇到这个情况。

举个例子:

被执行代码:

  listExistingTables = function(next) {
    debuglog("[listExistingTables]");
    OtsClient.listTable(function(err, result) {
      debuglog("[OtsClient.listTable] result:", result);
      throw(new Error(“Errr....”))
    });
  };

执行结果:

  mdd:scripts:db_reset [listExistingTables] +4ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1s
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +3ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +8ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +1ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
  mdd:scripts:db_reset [OtsClient.listTable] result: { table_names: [ 'test1', 'test2' ],
  RequestId: '00055605-a6e0-01ce-32e9-970aca4e7897' } +0ms
/Users/ty/workspaces/mdd/node_modules/tablestore/lib/request.js:98
      if (this._hardError) throw err;
                           ^

Error: Errrr......
yi commented 7 years ago

貌似是这个地方的问题: https://github.com/aliyun/aliyun-tablestore-nodejs-sdk/blob/master/lib/request.js#L97

boxiaowpl commented 7 years ago

这个地方,我觉得最好还是自己在callback中捕获异常,因为如果sdk把错误捕获住了,用户不好记录日志。 此外,如果想自己修改SDK,让异常不无限循环,可以改https://github.com/aliyun/aliyun-tablestore-nodejs-sdk/blob/master/lib/request.js#L164,这里不throw 出来就可以了。

yi commented 7 years ago

| 我觉得最好还是自己在callback中捕获异常 这样好吗?

| 这里不throw 出来就可以了。 不太理解这段实现代码的目的。我的理解 uncaughtException 叫给开发者通过 process.on('uncaughtException', 来捕捉处理比较合理。

  1. 为什么 会无限调用?
boxiaowpl commented 7 years ago

暂没找到好办法捕获callback中异常,通过回调参数中的err返回。 去除了uncaughtException这个状态,以后如果callback中有错误会直接抛出来,可以使用process.on('uncaughtException' 来捕获异常,或者参考https://github.com/aliyun/aliyun-tablestore-nodejs-sdk/blob/master/samples/domainError.js 使用domain。

yi commented 7 years ago

ok, I close this ticket for now.