Skip to content
This repository has been archived by the owner on May 7, 2024. It is now read-only.

Broken pipe when push to master #22

Open
itxx00 opened this issue Feb 18, 2014 · 16 comments
Open

Broken pipe when push to master #22

itxx00 opened this issue Feb 18, 2014 · 16 comments
Labels

Comments

@itxx00
Copy link

itxx00 commented Feb 18, 2014

Hello,在创建了第一个repo之后,我按照步骤进行git push origin master操作,但是等待一段时间后失败,在服务端看到的错误输出信息如下:

Unpacking objects: 100% (3/3), done.
2014-02-18 15:03:31 [5079] [CRITICAL] WORKER TIMEOUT (pid:5105) 
2014-02-18 15:03:31 [5128] [INFO] Booting worker with pid: 5128
Did not install docutils
fatal: write error: Broken pipe

在客户端看到的信息如下:

]$ git push origin master
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 261 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
error: RPC failed; result=52, HTTP code = 0
@xtao
Copy link
Contributor

xtao commented Feb 18, 2014

@itxx00 能在详细一点么,比如说你的code代码的版本,执行的命令是什么?

@xtao xtao added the bug label Feb 18, 2014
@itxx00
Copy link
Author

itxx00 commented Feb 18, 2014

我使用的code是master分支commit 648a635 ,服务端启动命令:gunicorn -w 1 -b 0.0.0.0:80 app:app
客户端操作命令:git push -u origin master

@itxx00
Copy link
Author

itxx00 commented Feb 18, 2014

@xtao 另外我还修改了code/config.py中的DOMAIN为DOMAIN = "http://0.0.0.0:80/"

@xtao
Copy link
Contributor

xtao commented Feb 18, 2014

应该是 DOMAIN = "http://0.0.0.0:80/" 的问题,你改为 DOMAIN = "http://127.0.0.1:80/" 吧

@qingfeng
Copy link

8080之类大于8000的端口号是不是好些?80还得sudo
2014/02/18 15:29 "xingxing" [email protected]:

@xtao https://github.com/xtao 另外我还修改了code/config.py中的DOMAIN为DOMAIN = "
http://0.0.0.0:80/"


Reply to this email directly or view it on GitHubhttps://github.com//issues/22#issuecomment-35359099
.

@itxx00
Copy link
Author

itxx00 commented Feb 18, 2014

2014-02-18 15:49 GMT+08:00 Xu Tao [email protected]:

应该是 DOMAIN = "http://0.0.0.0:80/" 的问题,你改为 DOMAIN = "http://127.0.0.1:80/"


Reply to this email directly or view it on GitHubhttps://github.com//issues/22#issuecomment-35360134
.

我修改成了默认的设置127.0.0.1:8000,然后另外安装了一个nginx来反向代理到code的8000端口,再另外一台机器上做push操作时仍然是这个问题。

@dongweiming
Copy link
Contributor

是因为你的项目太大了, 第一次commit把整个项目推上去(默认好像是1M), 试一试涨到500M:

git config --global http.postBuffer 524288000

@itxx00
Copy link
Author

itxx00 commented Feb 18, 2014

@小明 项目不大啊,只有一个README.md ,我也设置过了buffer大小的,还是不行啊。
这是我的操作记录,https://asciinema.org/a/7700 ,不知道是哪里弄错了啊。

@dongweiming
Copy link
Contributor

@xtao @itxx00 @qingfeng 这确实是个问题. 我观察了下,大概原因是gunicorn默认的worker_class是sync, 刚才研究下是在POST /USER/XXX.git/git-receive-pack和执行git服务器的hook post_receive之间发生的阻塞.

@dongweiming
Copy link
Contributor

@itxx00 你可以尝试:

gunicorn -b 0.0.0.0:8000 app:app  -k gevent 
#或者
gunicorn -b 0.0.0.0:8000 app:app -k eventlet

PS:当然需要你先安装gevent.

@dongweiming
Copy link
Contributor

@xtao @qingfeng worker默认超时30s, 所以worker卡了一会就死掉换了新的.刚才试了一下tornado类型也是阻塞的.具体原因可能你们更了解,我把hook移走就没事了. 我想是urllib2.urlopen是阻塞操作的原因

@xtao
Copy link
Contributor

xtao commented Feb 18, 2014

@dongweiming 是在git push的时候,会有一个2个并发请求,我的理解2个worker可以handle的了这个并发,所以后来gunicorn加了一个-w 2的参数,我之前的测试是可以实现的。

@dongweiming
Copy link
Contributor

@xtao 额 是这样的.可以再README里面有个说明, 然后我觉得这个问题还是问题:解决并发处理为非阻塞模式

@dongweiming
Copy link
Contributor

@xutao 现在sina解决了这个问题么

@xtao
Copy link
Contributor

xtao commented Dec 8, 2015

@dongweiming 这个不是 sina 的问题,是 worker 的并发模型的问题,默认开启一个 sync worker 处理请求时,这个 worker 再访问同一个 worker 的时候会有问题,(其实就是自己访问了自己),增加 worker 或者改成 async 会有改善。

这个访问是写在了 post-receive hook 里面,这个机制没有改过,所以 push 的时候,会在有一次的访问。
之前 async 的时候是阻塞的,因为 subprocess 没有用 gevent patch 过的,后来修了一下这个问题,已经使用的是 gevent patch 的了。理论上应该修正了,但是我没有测试过。

@xtao
Copy link
Contributor

xtao commented Dec 8, 2015

看了眼代码,sina 还是旧的版本,我来升级一下。

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

No branches or pull requests

4 participants