Class: Zold::SpreadEntrance
- Inherits:
-
Object
- Object
- Zold::SpreadEntrance
- Defined in:
- lib/zold/node/spread_entrance.rb
Overview
The entrance
Instance Method Summary collapse
-
#initialize(entrance, wallets, remotes, address, log: Log::Quiet.new, ignore_score_weakeness: false) ⇒ SpreadEntrance
constructor
A new instance of SpreadEntrance.
- #push(id, body) ⇒ Object
- #start ⇒ Object
- #to_json ⇒ Object
Constructor Details
#initialize(entrance, wallets, remotes, address, log: Log::Quiet.new, ignore_score_weakeness: false) ⇒ SpreadEntrance
Returns a new instance of SpreadEntrance.
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/zold/node/spread_entrance.rb', line 42 def initialize(entrance, wallets, remotes, address, log: Log::Quiet.new, ignore_score_weakeness: false) raise 'Entrance can\'t be nil' if entrance.nil? @entrance = entrance raise 'Wallets can\'t be nil' if wallets.nil? raise 'Wallets must implement the contract of Wallets: method #find is required' unless wallets.respond_to?(:find) @wallets = wallets raise 'Remotes can\'t be nil' if remotes.nil? raise 'Remotes must be of type Remotes' unless remotes.is_a?(Remotes) @remotes = remotes raise 'Address can\'t be nil' if address.nil? @address = address raise 'Log can\'t be nil' if log.nil? @log = log @ignore_score_weakeness = ignore_score_weakeness end |
Instance Method Details
#push(id, body) ⇒ Object
98 99 100 101 102 103 104 105 106 107 |
# File 'lib/zold/node/spread_entrance.rb', line 98 def push(id, body) mods = @entrance.push(id, body) (mods + [id]).each do |m| next if @seen.include?(m) @seen << m @modified.push(m) @log.debug("Push scheduled for #{m}, queue size is #{@modified.size}") end mods end |
#start ⇒ Object
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/zold/node/spread_entrance.rb', line 65 def start @entrance.start do @seen = Set.new @modified = Queue.new @push = Thread.start do Thread.current.abort_on_exception = true Thread.current.name = 'push' VerboseThread.new(@log).run(true) do loop do id = @modified.pop if @remotes.all.empty? @log.info("There are no remotes, won\'t spread #{id}") else Push.new(wallets: @wallets, remotes: @remotes, log: @log).run( ['push', "--ignore-node=#{@address}", id.to_s] + (@ignore_score_weakeness ? ['--ignore-score-weakness'] : []) ) end @seen.delete(id) end end end begin yield(self) ensure @log.info('Waiting for spread entrance to finish...') @modified.clear @push.exit @log.info('Spread entrance finished, thread killed') end end end |
#to_json ⇒ Object
58 59 60 61 62 63 |
# File 'lib/zold/node/spread_entrance.rb', line 58 def to_json @entrance.to_json.merge( 'modified': @modified.size, 'push': @push.status ) end |