ujihisa / neco-look

A neocomplcache plugin for English, using look command

Home Page:http://www.vim.org/scripts/script.php?script_id=3440

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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は閉じます. ありがとうございました.

解決力