From 968cbe34ece986d4d0f072117cf5e278823dfae9 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 15 Oct 2008 18:34:32 -0700 Subject: [PATCH] mog: retry on Backend::NoDevicesError I seem to hit this quite often under heavy load... --- bin/mog | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/bin/mog b/bin/mog index 5e515a2..40b0a6f 100755 --- a/bin/mog +++ b/bin/mog @@ -97,6 +97,17 @@ cfg[:timeout] ||= 30 # longer timeout for interactive use include MogileFS::Util mg = MogileFS::MogileFS.new(cfg) +def store_file_retry(mg, key, storage_class, filepath) + tries = 0 + begin + mg.store_file(key, storage_class, filepath) + rescue MogileFS::Backend::NoDevicesError => err + retry if ((tries += 1) < 10) + STDERR.puts "no devices available: #{err}" + exit 1 + end +end + begin case cmd when 'cp' @@ -104,7 +115,7 @@ begin key = ARGV.shift or raise ArgumentError, ' ' ARGV.shift and raise ArgumentError, ' ' cfg[:class] or raise ArgumentError, 'E: --class must be specified' - mg.store_file(key, cfg[:class], filename) + store_file_retry(mg, key, cfg[:class], filename) when 'cat' ARGV.empty? and raise ArgumentError, ' [ ...]' ARGV.each { |key| mg.get_file_data(key) { |fp| sysrwloop(fp, STDOUT) } } @@ -165,7 +176,7 @@ begin at_exit { tmp.unlink } begin sysrwloop(STDIN, tmp) - mg.store_file(key, cfg[:class], tmp.path) + store_file_retry(mg, key, cfg[:class], tmp.path) ensure tmp.close end -- 2.11.4.GIT