lib/zold/commands/remote.rb in zold-0.16.16 vs lib/zold/commands/remote.rb in zold-0.16.17

- old
+ new

@@ -94,10 +94,13 @@ 'The maximum amount of election winners the election (default: 1)', default: 1 o.bool '--skip-ping', 'Don\'t ping back the node when adding it (not recommended)', default: false + o.integer '--depth', + 'The amount of update cycles to run, in order to fetch as many nodes as possible (default: 2)', + default: 2 o.string '--network', "The name of the network we work in (default: #{Wallet::MAIN_NETWORK}", required: true, default: Wallet::MAIN_NETWORK o.bool '--reboot', @@ -137,11 +140,10 @@ elect(opts) when 'trim' trim(opts) when 'update' update(opts) - update(opts, false) when 'select' select(opts) else raise "Unknown command '#{command}'" end @@ -155,12 +157,13 @@ @log.info(r[:host] + Rainbow(":#{r[:port]}").gray + score) end end def clean + before = @remotes.all.count @remotes.clean - @log.debug('All remote nodes deleted') + @log.debug("All #{before} remote nodes deleted") end def reset clean defaults @@ -215,57 +218,66 @@ def trim(opts) all = @remotes.all all.each do |r| next if r[:errors] <= opts['tolerate'] - remove(r[:host], r[:port], opts) + @remotes.remove(r[:host], r[:port]) @log.info("#{r[:host]}:#{r[:port]} removed because of #{r[:errors]} errors (over #{opts['tolerate']})") end @log.info("The list of #{all.count} remotes trimmed, #{@remotes.all.count} nodes left there") end - def update(opts, deep = true) + def update(opts) + st = Time.now capacity = [] - @remotes.iterate(@log, farm: @farm) do |r| - start = Time.now - uri = '/remotes' - res = r.http(uri).get - r.assert_code(200, res) - json = JsonPage.new(res.body, uri).to_hash - score = Score.parse_json(json['score']) - r.assert_valid_score(score) - r.assert_score_ownership(score) - r.assert_score_strength(score) unless opts['ignore-score-weakness'] - @remotes.rescore(score.host, score.port, score.value) - gem = Zold::Gem.new - if Semantic::Version.new(VERSION) < Semantic::Version.new(json['version']) || - Semantic::Version.new(VERSION) < Semantic::Version.new(gem.last_version) - if opts['reboot'] - @log.info("#{r}: their version #{json['version']} is higher than mine #{VERSION}, reboot! \ -(use --never-reboot to avoid this from happening)") - terminate + opts['depth'].times do |cycle| + @remotes.iterate(@log, farm: @farm) do |r| + start = Time.now + uri = '/remotes' + res = r.http(uri).get + r.assert_code(200, res) + json = JsonPage.new(res.body, uri).to_hash + score = Score.parse_json(json['score']) + r.assert_valid_score(score) + r.assert_score_ownership(score) + r.assert_score_strength(score) unless opts['ignore-score-weakness'] + @remotes.rescore(score.host, score.port, score.value) + gem = Zold::Gem.new + if Semantic::Version.new(VERSION) < Semantic::Version.new(json['version']) || + Semantic::Version.new(VERSION) < Semantic::Version.new(gem.last_version) + if opts['reboot'] + @log.info("#{r}: their version #{json['version']} is higher than mine #{VERSION}, reboot! \ + (use --never-reboot to avoid this from happening)") + terminate + end + @log.debug("#{r}: their version #{json['version']} is higher than mine #{VERSION}, \ + it's recommended to reboot, but I don't do it because of --never-reboot") end - @log.debug("#{r}: their version #{json['version']} is higher than mine #{VERSION}, \ -it's recommended to reboot, but I don't do it because of --never-reboot") - end - if deep - json['all'].each do |s| - add(s['host'], s['port'], opts) - @log.info("#{s['host']}:#{s['port']} found at #{r} and added") + if cycle.positive? + json['all'].each do |s| + if opts['ignore-node'].include?("#{s['host']}:#{s['port']}") + @log.debug("#{s['host']}:#{s['port']}, which is found at #{r} \ + won't be added since it's in the --ignore-node list") + next + end + next if @remotes.exists?(s['host'], s['port']) + @remotes.add(s['host'], s['port']) + @log.info("#{s['host']}:#{s['port']} found at #{r} and added to the list of #{@remotes.all.count}") + end end + capacity << { host: score.host, port: score.port, count: json['all'].count } + @log.info("#{r}: the score is #{Rainbow(score.value).green} (#{json['version']}) in #{Age.new(start)}") end - capacity << { host: score.host, port: score.port, count: json['all'].count } - @log.info("#{r}: the score is #{Rainbow(score.value).green} (#{json['version']}) in #{Age.new(start)}") end max_capacity = capacity.map { |c| c[:count] }.max || 0 capacity.each do |c| @remotes.error(c[:host], c[:port]) if c[:count] < max_capacity end total = @remotes.all.size if total.zero? @log.info("The list of remotes is #{Rainbow('empty').red}, run 'zold remote reset'!") else - @log.info("There are #{total} known remotes") + @log.info("There are #{total} known remotes after update in #{Age.new(st)}") end end def select(opts) selected = @remotes.all.sort_by { |r| r[:score] }.reverse.first(opts['max-nodes'])