vimproc: vp_pipe_open: ['pipe() error: Too many open files'] エラーが起きたら, その後[look]の補完が効かなくなる
itchyny opened this issue · comments
OS: Mac OS X
Vim: 7.3 1-960
neocomplcache, neco-lookは最新.
lookコマンドのある状況です.
完全な再現方法は, 難しいです.
neco-lookの補完が効く状態で, 英語の文章を素早く打ち込むと, vimproc: vp_pipe_open: ['pipe() error: Too many open files']
というエラーが出た後, その後neco-lookの補完ができなくなります.
エラーは次のようになっています.
Error occured in source's gather_candidates()!
function neocomplcache#complete#auto_complete..neocomplcache#complete#manual_complete..neocomplcache#complete#_get_results..neocomplcache#complete#_set_results_words..258..neocomplcache#util#system..<SNR>151_system..vimproc#system..<SNR>131_system..vimproc#pgroup_open..<SNR>131_pgroup_open..vimproc#plineopen3..<SNR>131_plineopen..<SNR>131_convert_args..vimproc#get_command_name, line 15
function neocomplcache#complete#auto_complete..neocomplcache#complete#manual_complete..neocomplcache#complete#_get_results..neocomplcache#complete#_set_results_words..258..neocomplcache#util#system..<SNR>151_system..vimproc#system..<SNR>131_system..vimproc#pgroup_open..<SNR>131_pgroup_open..vimproc#plineopen3..<SNR>131_plineopen..<SNR>131_vp_pipe_open..<SNR>131_libcall, line 16
vimproc: vp_pipe_open: ['pipe() error: Too many open files']
Source name is look
vimproc#get_command_name: File "look" is not found.
Source name is look
Error occured in source's gather_candidates()!
match 1 of 5
function neocomplcache#complete#auto_complete..neocomplcache#complete#manual_complete..neocomplcache#complete#_get_results..neocomplcache#complete#_set_results_words..258..neocomplcache#util#system..<SNR>151_system..vimproc#system..<SNR>131_system..vimproc#pgroup_open..<SNR>131_pgroup_open..vimproc#plineopen3..<SNR>131_plineopen..<SNR>131_convert_args..vimproc#get_command_name, line 15
vimproc#get_command_name: File "look" is not found.
Back at original
vimproc#get_command_name: File "look" is not found.
Source name is look
neocomplcacheの設定は以下の通りですが, g:neocomplcache_auto_completion_start_length
を1にしているのが効いていると思われます.
let g:neocomplcache_enable_at_startup = 1
let g:neocomplcache_enable_smart_case = 1
let g:neocomplcache_enable_underbar_completion = 1
let g:neocomplcache_enable_camel_case_completion = 1
let g:neocomplcache_enable_cursor_hold_i = 0
let g:neocomplcache_max_list = 500
let g:neocomplcache_skip_auto_completion_time = "0.50"
let g:neocomplcache_enable_auto_close_preview = 1
let g:neocomplcache_auto_completion_start_length = 1
let g:neocomplcache_max_menu_width = 20
let g:neocomplcache_max_keyword_width = 50
neocomplcache案件でしょうか.
そのエラーが発生したあとでps x | grep look
するなどしてlook
コマンドが居残り続けているかどうかちょっと確認してほしいです
いや、このエラーはWindows環境でも起こったことがあります。
直すのは難しいです。
完全な再現方法は, 難しいです.
neco-lookの補完が効く状態で, 英語の文章を素早く打ち込むと, vimproc: vp_pipe_open: ['pipe() error: Too many open files']というエラーが出た後, その後neco-lookの補完ができなくなります.
再現方法が難しいのは、このエラーはVimのパイプリソースを使い切らないと出ないからです。
私のWindows環境では一つのVimで連続500回ほどvimproc#system()
やsystem()
を読んだ時に再現しました。
使用後にリソースはちゃんと解放しているので(確認済み)、対処方法はよくわかりません。
ちょっと調べてみたところ、プロセスで開けるファイルの上限値を増やすしかないようです。
ulimit -n
私の環境では1024でした。
リソースリークチェッカーを作りました。これを:so %
で読み込んでみてください。どこかでリークしていれば途中でエラーになるはず。
for i in range(1, 4096)
redraw
echo i
call vimproc#system('look foo')
endfor
私が試したところ、上記のスクリプトにリークはないです(Unix環境)。
ただし、:NeoBundleUpdate
にはリソースリークがあることが判明しています。
ちょっと原因を調べます。
そのエラーが発生したあとでps x | grep lookするなどしてlookコマンドが居残り続けているかどうかちょっと確認してほしいです
/usr/bin/look un
というプロセスが残っていました.
私の環境では1024でした。
ulimit -n
の結果は, 256でした.
リソースリークチェッカーを作りました。これを:so %で読み込んでみてください。どこかでリークしていれば途中でエラーになるはず。
エラーは出ませんでした. 4096まできちんとカウントアップできました.
リソースチェッカー パターン2
for i in range(1, 4096)
redraw
echo i
let process = vimproc#pgroup_open('ls')
while !process.stdout.eof
call process.stdout.read(-1, 300)
endwhile
let [_, status] = process.waitpid()
endfor
リソースリークがあったため、修正したものをコミットしました。vimproc, neobundleの両方を更新してください。
あまり良くわからないのですが, その修正でこのlookの問題が解決されるのですか?
はい。このエラーはリソースがリークしていたために起こるエラーです。上記の変更でリソースリークがなくなったことを確認しています。
なるほどなるほど. それではこのissueは閉じます. ありがとうございました.
解決力