Просмотр исходного кода

Retry in case of timeout (#35)

while gradually increasing the time limit
Junegunn Choi 11 лет назад
Родитель
Сommit
3323163e04
2 измененных файлов с 12 добавлено и 6 удалено
  1. 5 4
      README.md
  2. 7 2
      plug.vim

+ 5 - 4
README.md

@@ -84,10 +84,11 @@ before the call.
 
 ### Options for parallel installer
 
-| Flag             | Default | Description                        |
-| ---------------- | ------- | ---------------------------------  |
-| `g:plug_threads` | 16      | Default number of threads to use   |
-| `g:plug_timeout` | 60      | Time limit of each task in seconds |
+| Flag             | Default | Description                          |
+| ---------------- | ------- | ------------------------------------ |
+| `g:plug_threads` | 16      | Default number of threads to use     |
+| `g:plug_timeout` | 60      | Time limit of each task in seconds   |
+| `g:plug_retries` | 2       | Number of retries in case of timeout |
 
 ### Keybindings
 

+ 7 - 2
plug.vim

@@ -610,6 +610,7 @@ function! s:update_parallel(pull, todo, threads)
   base  = VIM::evaluate('g:plug_home')
   all   = VIM::evaluate('copy(a:todo)')
   limit = VIM::evaluate('get(g:, "plug_timeout", 60)')
+  tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1
   nthr  = VIM::evaluate('a:threads').to_i
   maxy  = VIM::evaluate('winheight(".")').to_i
   cd    = iswin ? 'cd /d' : 'cd'
@@ -652,11 +653,14 @@ function! s:update_parallel(pull, todo, threads)
     end
   }
   bt = proc { |cmd, name, type|
+    tried = timeout = 0
     begin
+      tried += 1
+      timeout += limit
       fd = nil
       data = ''
       if iswin
-        Timeout::timeout(limit) do
+        Timeout::timeout(timeout) do
           tmp = VIM::evaluate('tempname()')
           system("#{cmd} > #{tmp}")
           data = File.read(tmp).chomp
@@ -666,7 +670,7 @@ function! s:update_parallel(pull, todo, threads)
         fd = IO.popen(cmd).extend(PlugStream)
         first_line = true
         log_prob = 1.0 / nthr
-        while line = Timeout::timeout(limit) { fd.get_line }
+        while line = Timeout::timeout(timeout) { fd.get_line }
           data << line
           log.call name, line.chomp, type if name && (first_line || rand < log_prob)
           first_line = false
@@ -689,6 +693,7 @@ function! s:update_parallel(pull, todo, threads)
         pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
         fd.close
       end
+      retry if e.is_a?(Timeout::Error) && tried < tries
       [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"]
     end
   }