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'])