goat 0.3.47 → 0.3.48

Sign up to get free protection for your applications and to get access to all the features.
@@ -155,7 +155,7 @@ def usage
155
155
  end
156
156
 
157
157
  OptionParser.new do |opts|
158
- opts.on('-pMANDATORY', Integer) {|p| $port = p}
158
+ opts.on('-pMANDATORY', Integer) {|p| $port = r}
159
159
  opts.on('-HMANDATORY', String) {|h| $host = h}
160
160
  opts.on('-SMANDATORY', String) {|h| $statesrv_host = h}
161
161
  opts.on('-sMANDATORY', Integer) {|p| $statesrv_port = p}
@@ -13,6 +13,7 @@ $:.unshift(File.join(File.dirname(__FILE__), '../lib'))
13
13
 
14
14
  require 'goat/common'
15
15
  require 'goat/net-common'
16
+ require 'goat/extn'
16
17
 
17
18
  module Goat
18
19
  module StateSrv
@@ -190,7 +191,8 @@ module Goat
190
191
  end
191
192
 
192
193
  def memusage
193
- $stderr.puts "Components in memory: #{@components_by_id.values.count}"
194
+ Goat.logd "Components in memory: #{@components_by_id.values.count}"
195
+ @components_by_id.values.map(&:cls).tally.sort.each {|k, v| Goat.logd "#{k} - #{v}"}
194
196
  end
195
197
  end
196
198
 
@@ -236,6 +238,10 @@ module Goat
236
238
  updates.map(&:removed).flatten.each{|c| @registry.delete_component(c)}
237
239
 
238
240
  updates.each {|u| handle_component_update(txn, u)}
241
+ if txn
242
+ txn_complete_update(pgid, txn)
243
+ end
244
+
239
245
  send_updates(pgid)
240
246
 
241
247
  {'type' => 'update_ack', 'components' => updates.map{|u| u.skel.id}}
@@ -260,7 +266,8 @@ module Goat
260
266
  if c = @registry.find_id(msg['id'])
261
267
  c.to_hash
262
268
  else
263
- raise "Couldn't find component #{msg['id']}"
269
+ Goat.logw "Couldn't find component #{msg['id']}"
270
+ {} # if we return nil, no resp will be sent
264
271
  end
265
272
  end
266
273
 
@@ -289,17 +296,18 @@ module Goat
289
296
  msgs = []
290
297
 
291
298
  need.each do |u|
292
- msgs << {
293
- 'pgid' => pgid,
294
- 'class' => u.skel.cls,
295
- 'id' => u.skel.id,
296
- 'type' => 'component_updated',
297
- 'updates' => u.mutations,
298
- 'version' => u.version
299
- }
300
-
301
- txn = vers[u.version]
302
- msgs << {'type' => 'txn_complete', 'txn' => txn} if txn
299
+ if u.is_a?(ComponentUpdate)
300
+ msgs << {
301
+ 'pgid' => pgid,
302
+ 'class' => u.skel.cls,
303
+ 'id' => u.skel.id,
304
+ 'type' => 'component_updated',
305
+ 'updates' => u.mutations,
306
+ 'version' => u.version
307
+ }
308
+ elsif u.is_a?(TxnCompleteUpdate)
309
+ msgs << {'type' => 'txn_complete', 'txn' => u.txn, 'version' => u.version}
310
+ end
303
311
  end
304
312
 
305
313
  send_message(chsrv_id, 'page_updated', {'pgid' => pgid, 'messages' => msgs}) unless msgs.empty?
@@ -329,6 +337,11 @@ module Goat
329
337
  end
330
338
  end
331
339
 
340
+ def txn_complete_update(pgid, txn)
341
+ @registry.incr_page_version(pgid)
342
+ @registry.add_update(pgid, txn, TxnCompleteUpdate.new(@registry.page_version(pgid), txn))
343
+ end
344
+
332
345
  def page_connected(msg)
333
346
  ensure_keys(msg, %w{pgid chsrv version})
334
347
 
@@ -401,6 +414,16 @@ module Goat
401
414
  if ObjectSpace.respond_to?(:live_objects)
402
415
  Goat.logd "Done. Live objects: #{ObjectSpace.live_objects}"
403
416
  end
417
+
418
+ maybe_print_statistics
419
+ end
420
+
421
+ def maybe_print_statistics
422
+ @last_printed ||= Time.now
423
+ if Time.now - @last_printed > 2
424
+ Delegate.registry.memusage
425
+ end
426
+ @last_printed = Time.now
404
427
  end
405
428
  end
406
429
 
@@ -428,16 +451,6 @@ module Goat
428
451
  else
429
452
  $stderr.puts "Delegate doesn't respond to #{type.inspect}"
430
453
  end
431
-
432
- maybe_print_statistics
433
- end
434
-
435
- def maybe_print_statistics
436
- @last_printed ||= Time.now
437
- if Time.now - @last_printed > 10
438
- Delegate.registry.memusage
439
- end
440
- @last_printed = Time.now
441
454
  end
442
455
 
443
456
  def unbind
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'goat'
3
- s.version = '0.3.47'
3
+ s.version = '0.3.48'
4
4
  s.summary = 'Pre-release beta version of Goat'
5
5
  s.author = 'Patrick Collison'
6
6
  s.email = 'patrick@collison.ie'
@@ -32,15 +32,16 @@ require 'goat/dynamic'
32
32
 
33
33
  $verbose ||= ARGV.include?('-v')
34
34
 
35
- class Profile
36
- # TODO make sure not already defined
37
- def self.in(*args); end
38
- def self.out(*args); end
39
- def self.request_start(*args); end
40
- def self.request_end(*args); end
35
+ unless defined?(Profile)
36
+ class Profile
37
+ # TODO make sure not already defined
38
+ def self.in(*args); end
39
+ def self.out(*args); end
40
+ def self.request_start(*args); end
41
+ def self.request_end(*args); end
42
+ end
41
43
  end
42
44
 
43
-
44
45
  class String
45
46
  def prefix_ns(ns)
46
47
  self.gsub(/^%(.+)$/, "#{ns}_\\1")
@@ -53,9 +53,21 @@ module Goat
53
53
  end
54
54
  end
55
55
 
56
- class ComponentUpdate
57
- attr_reader :skel, :mutations, :added, :removed
56
+ class PageUpdate
58
57
  attr_accessor :version
58
+ end
59
+
60
+ class TxnCompleteUpdate < PageUpdate
61
+ attr_reader :txn
62
+
63
+ def initialize(version, txn)
64
+ @version = version
65
+ @txn = txn
66
+ end
67
+ end
68
+
69
+ class ComponentUpdate < PageUpdate
70
+ attr_reader :skel, :mutations, :added, :removed
59
71
 
60
72
  def initialize(skel, mutations, added, removed)
61
73
  @skel = skel
@@ -30,6 +30,16 @@ class String
30
30
  end
31
31
  end
32
32
 
33
+ module Enumerable
34
+ def tally
35
+ h = {}
36
+ self.each do |elt|
37
+ h[elt] = h.fetch(elt, 0) + 1
38
+ end
39
+ h
40
+ end
41
+ end
42
+
33
43
  class Object
34
44
  def self.superclasses(upto=Object)
35
45
  cs = []
@@ -130,18 +130,23 @@ Goat.RT = {
130
130
  Goat.loadComponents();
131
131
  }
132
132
 
133
- function updateReceived(m) {
134
- var id = m.id;
135
- var version = m.version;
136
- var updates = m.updates;
137
-
138
- if(m.version == rt.version + 1) {
139
- $(updates).each(function(_,u) {
140
- rt.consecutiveFailures = 0;
141
- applyUpdate(u);
142
- });
133
+ function updateReceived(u, t) {
134
+ var version = u.version;
135
+ var updates = u.updates;
136
+ var txn = u.txn;
137
+
138
+ if(u.version == rt.version + 1) {
139
+ if(t == 'component_updated') {
140
+ $(updates).each(function(_,up) {
141
+ rt.consecutiveFailures = 0;
142
+ applyUpdate(up);
143
+ });
144
+ } else if(t == 'txn_complete') {
145
+ completeTxn(txn);
146
+ }
147
+
143
148
  rt.version++;
144
- } else if(m.version <= rt.version) {
149
+ } else if(u.version <= rt.version) {
145
150
  rt.consecutiveFailures = 0;
146
151
  // fine, we already have this
147
152
  } else {
@@ -399,8 +404,8 @@ $.extend(Goat, {
399
404
  Goat.log('messageReceived', m.type, m);
400
405
 
401
406
  var t = m['type'];
402
- if(t == 'component_updated') {
403
- Goat.RT.updateReceived(m);
407
+ if(t == 'component_updated' || t == 'txn_complete') {
408
+ Goat.RT.updateReceived(m, t);
404
409
  } else if(t == 'redirect') {
405
410
  if(m["location"]) {
406
411
  Goat.log('Redirecting to ' + m['location']);
@@ -412,8 +417,6 @@ $.extend(Goat, {
412
417
  } else if(t == 'page_expired') {
413
418
  alert("Due to inactivity, you'll need to refresh this page.");
414
419
  Goat.setPageDead();
415
- } else if(t == 'txn_complete') {
416
- Goat.RT.completeTxn(m['txn']);
417
420
  } else if(t == 'alert') {
418
421
  this.showAlert(m);
419
422
  } else {
@@ -37,7 +37,8 @@ module Goat
37
37
 
38
38
  def self.fetch_component(id)
39
39
  resp = send_message('fetch_component', {'id' => id}, true)
40
- ComponentSkeleton.from_hash(JSON.load(resp)['response'])
40
+ skelhash = JSON.load(resp)['response']
41
+ skelhash.empty? ? nil : ComponentSkeleton.from_hash(skelhash)
41
42
  end
42
43
 
43
44
  def self.component_updated(txn, pgid, update)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: goat
3
3
  version: !ruby/object:Gem::Version
4
- hash: 77
4
+ hash: 115
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 47
10
- version: 0.3.47
9
+ - 48
10
+ version: 0.3.48
11
11
  platform: ruby
12
12
  authors:
13
13
  - Patrick Collison
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-09 00:00:00 +00:00
18
+ date: 2011-03-17 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency