Egg: 修改文件后 work reload 但请求pendding

Created on 16 Aug 2017  ·  21Comments  ·  Source: eggjs/egg

  • Node Version: v7.6.0
  • Egg Version: 1.7.0
  1. 使用egg-init的 simple 模式初始化一个项目

  2. npm run dev的方式启动,在修改文件后work进程重启,但之后所有的请求被pendding
    日志如下:

2017-08-16 12:21:00,512 WARN 12476 [agent:development] reload worker because D:\workSpace\selfPr
o\egg-example2\app\controller\home.js change
2017-08-16 12:21:00,514 INFO 14148 [master] reload workers...
2017-08-16 12:21:00,549 INFO 14148 [master] app_worker#2:5312 start, state: none, current worker
s: ["1","2"]
2017-08-16 12:21:01,897 INFO 14148 [master] app_worker#2:5312 started at 7001, remain 0 (22938ms
)
[Wed Aug 16 2017 12:21:02 GMT+0800 (中国标准时间)] [cfork:master:14148] worker:15808 disconnect
(exitedAfterDisconnect: true, state: disconnected, isDead: false)
[Wed Aug 16 2017 12:21:02 GMT+0800 (中国标准时间)] [cfork:master:14148] don't fork new work (ref
ork: false)
2017-08-16 12:21:02,013 INFO 14148 [master] app_worker#1:15808 disconnect, suicide: true, state:
 disconnected, current workers: ["2"]
2017-08-16 12:21:02,013 WARN 12476 [ClusterClient:Connection] socket is closed by other side whi
le there were still unhandled data in the socket buffer
[Wed Aug 16 2017 12:21:02 GMT+0800 (中国标准时间)] [cfork:master:14148] worker:15808 exit (code:
 null, exitedAfterDisconnect: true, state: dead, isDead: true, isExpected: true)

在已有issue中搜索发现跟 #684 #1130 很相似,但在重新安装依赖且只用一个work的情况下仍没有解决问题

bug

All 21 comments

2017-08-16 12:21:02,013 WARN 12476 [ClusterClient:Connection] socket is closed by other side while there were still unhandled data in the socket buffer

@gxcsoccer 这个 warn 是啥情况会出现?

@leoDreamer 重启后试过 curl 请求么? PS: node 升 8 吧

@atian25 已在8.0的环境下用curl试过,还是有问题,但同样的代码跑在同事电脑上就没问题,

防火墙? 还是其他什么配置? 此类只在某个电脑上复现的问题, 无能为力...

@atian25 今天有空又来探索了这个问题,
首先我在cluster-reload的reset()里打印了firstWorker.statenewWorker.state,从第二次reload开始,每一次更改文件都会打印两次,第一次两个listening,第二次两个dead,这应该是newWorker没有成功启动的原因吧,然后我的更改是在fork newWorker前就把firstWorker kill 掉,然后就解决这个问题了.

不能 kill ,要等待优雅退出。 开发期好像可以.

cc @gxcsoccer

没看懂呢?请求被pedding是指什么?

2017-08-16 12:21:02,013 WARN 12476 [ClusterClient:Connection] socket is closed by other side while there were still unhandled data in the socket buffer

这个就是 app 和 agent 还在数据通信时,app 被 kill 掉,在 agent 上报的错

@atian25 我也和无奈啊,我这边的环境已经和同事一模一样了,但修改代码后还是不能正常reload work,这个开发着很痛苦的.目前这样操作还没有发现有什么副作用.
@gxcsoccer 请求被pendding,可能我描述的不准确,就是当修改代码reload work 后,所有的请求都是pendding状态,而且日志上也没有打印任何东西.

我的也是一样的问题 诶 感觉进了深坑...

@AloneWeb 提供最小可复现方式

和上面的差不多
windows 10
node v8.9.1

2017-11-26 22:55:09,045 WARN 1628 [agent:development] reload worker because F:\MyWeb\Projects\gshop_egg\app\router.js change
[2017-11-26 22:55:09.450] [cfork:master:6924] worker:1164 disconnect (exitedAfterDisconnect: true, state: disconnected, isDead:
false, worker.disableRefork: false)
[2017-11-26 22:55:09.452] [cfork:master:6924] don't fork new work (refork: false)
2017-11-26 22:55:09,452 INFO 6924 [master] app_worker#10:1164 disconnect, suicide: true, state: disconnected, current workers: ["11","12"]
2017-11-26 22:55:09,456 WARN 1628 [ClusterClient:Connection] socket is closed by other side while there were still unhandled data in the socket buffer

@gxcsoccer 会不会是 win 的锅?

关闭了防火墙 重新安装了依赖还是这样

image
router.get('/user/create', user.create); 这行代码运行不了 只有把这个放在 router.get('/user/:id', user.info); 前面才行

@AloneWeb 不要把不同问题放在一个 issue 里面,很容易被遗漏掉

哦哦

@atian25
image

Windows 下 reload workers 失效

@leoDreamer @fengmk2
放弃egg的reload,定义一个启动文件,使用nodemon启动,
需要做如下代码处理:
cluster-client/lib/connection.js

_handleSocketError(err) {  
    // 返回true,不触发任何错误  
    return true;  
    this._lastError = err;  
    if (err.code === 'ECONNRESET') {
      this.logger.warn('[ClusterClient:Connection] socket is closed by other side while there were still unhandled data in the socket buffer');
    } else {
      this.emit('error', err);
    }
  }

cluster-client/lib/client.js

function reloadWorker(info) {
    if (!config.reloadOnDebug) {
      return;
    }
    if (isAssetsDir(info.path) || info.isDirectory) {
      return;
    }
    // don't reload if don't match
    if (config.reloadPattern && multimatch(info.path, config.reloadPattern).length === 0) {
      return;
    }
    logger.warn(`[agent:development] reload worker because ${info.path} ${info.event}`);
    // 注释掉这部分代码,不刷新worker
    // process.send({
    //   to: 'master',
    //   action: 'reload-worker',
    // });
  }

同遇到了这个问题,只有我这台电脑出现
解决方案:换一个端口号 就解决了
好像和电脑里某程序有冲突 被kill掉了

Was this page helpful?
0 / 5 - 0 ratings