Class: Zold::SpreadEntrance

Inherits:
Object
  • Object
show all
Defined in:
lib/zold/node/spread_entrance.rb

Overview

The entrance

Instance Method Summary collapse

Constructor Details

#initialize(entrance, wallets, remotes, address, log: Loog::NULL, ignore_score_weakeness: false, tolerate_edges: false) ⇒ SpreadEntrance

Returns a new instance of SpreadEntrance.



27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/zold/node/spread_entrance.rb', line 27

def initialize(entrance, wallets, remotes, address, log: Loog::NULL,
  ignore_score_weakeness: false, tolerate_edges: false)
  @entrance = entrance
  @wallets = wallets
  @remotes = remotes
  @address = address
  @log = log
  @ignore_score_weakeness = ignore_score_weakeness
  @tolerate_edges = tolerate_edges
  @mutex = Mutex.new
  @push = ThreadPool.new('spread-entrance')
end

Instance Method Details

#push(id, body) ⇒ Object

This method is thread-safe



80
81
82
83
84
85
86
87
88
89
90
# File 'lib/zold/node/spread_entrance.rb', line 80

def push(id, body)
  mods = @entrance.push(id, body)
  return mods if @remotes.all.empty?
  mods.each do |m|
    next if @seen.include?(m)
    @mutex.synchronize { @seen << m }
    @modified.push(m)
    @log.debug("Spread-push scheduled for #{m}, queue size is #{@modified.size}")
  end
  mods
end

#startObject



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/zold/node/spread_entrance.rb', line 47

def start
  raise 'Block must be given to start()' unless block_given?
  @entrance.start do
    @seen = Set.new
    @modified = Queue.new
    @push.add do
      Endless.new('push', log: @log).run do
        id = @modified.pop
        if @remotes.all.empty?
          @log.info("There are no remotes, won't spread #{id}")
        elsif @wallets.acq(id) { |w| Tax.new(w).in_debt? }
          @log.info("The wallet #{id} is in debt, won't spread")
        else
          Thread.current.thread_variable_set(:wallet, id.to_s)
          Push.new(wallets: @wallets, remotes: @remotes, log: @log).run(
            ['push', "--ignore-node=#{Shellwords.escape(@address)}", id.to_s, '--tolerate-quorum=1'] +
            (@ignore_score_weakeness ? ['--ignore-score-weakness'] : []) +
            (@tolerate_edges ? ['--tolerate-edges'] : [])
          )
        end
        @mutex.synchronize { @seen.delete(id) }
      end
    end
    begin
      yield(self)
    ensure
      @modified.clear
      @push.kill
    end
  end
end

#to_jsonObject



40
41
42
43
44
45
# File 'lib/zold/node/spread_entrance.rb', line 40

def to_json
  @entrance.to_json.merge(
    modified: @modified.size,
    push: @push.to_json
  )
end