cloudi 1.3.3 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data.tar.gz.sig +0 -0
  2. data/lib/cloudi.rb +81 -42
  3. metadata +78 -63
  4. metadata.gz.sig +0 -0
data.tar.gz.sig CHANGED
Binary file
@@ -78,7 +78,7 @@ module CloudI
78
78
  @callbacks = Hash.new
79
79
  @timeout_terminate = 1000 # TIMEOUT_TERMINATE_MIN
80
80
  send(Erlang.term_to_binary(:init))
81
- poll_request(false)
81
+ poll_request(nil, false)
82
82
  end
83
83
  attr_reader :process_index
84
84
  attr_reader :process_count
@@ -108,7 +108,7 @@ module CloudI
108
108
 
109
109
  def subscribe_count(pattern)
110
110
  send(Erlang.term_to_binary([:subscribe_count, pattern]))
111
- return poll_request(false)
111
+ return poll_request(nil, false)
112
112
  end
113
113
 
114
114
  def unsubscribe(pattern)
@@ -137,7 +137,7 @@ module CloudI
137
137
  OtpErlangBinary.new(request_info),
138
138
  OtpErlangBinary.new(request),
139
139
  timeout, priority]))
140
- return poll_request(false)
140
+ return poll_request(nil, false)
141
141
  end
142
142
 
143
143
  def send_sync(name, request,
@@ -155,7 +155,7 @@ module CloudI
155
155
  OtpErlangBinary.new(request_info),
156
156
  OtpErlangBinary.new(request),
157
157
  timeout, priority]))
158
- return poll_request(false)
158
+ return poll_request(nil, false)
159
159
  end
160
160
 
161
161
  def mcast_async(name, request,
@@ -173,7 +173,7 @@ module CloudI
173
173
  OtpErlangBinary.new(request_info),
174
174
  OtpErlangBinary.new(request),
175
175
  timeout, priority]))
176
- return poll_request(false)
176
+ return poll_request(nil, false)
177
177
  end
178
178
 
179
179
  def forward_(command, name, request_info, request,
@@ -298,7 +298,7 @@ module CloudI
298
298
  send(Erlang.term_to_binary([:recv_async, timeout,
299
299
  OtpErlangBinary.new(trans_id),
300
300
  consume]))
301
- return poll_request(false)
301
+ return poll_request(nil, false)
302
302
  end
303
303
 
304
304
  def callback(command, name, pattern, request_info, request,
@@ -331,6 +331,12 @@ module CloudI
331
331
  if not response.kind_of?(String)
332
332
  response = ''
333
333
  end
334
+ rescue InvalidInputException => e
335
+ raise e
336
+ rescue MessageDecodingException => e
337
+ raise e
338
+ rescue TerminateException => e
339
+ raise e
334
340
  rescue ReturnAsyncException
335
341
  return
336
342
  rescue ForwardAsyncException
@@ -374,6 +380,12 @@ module CloudI
374
380
  if not response.kind_of?(String)
375
381
  response = ''
376
382
  end
383
+ rescue InvalidInputException => e
384
+ raise e
385
+ rescue MessageDecodingException => e
386
+ raise e
387
+ rescue TerminateException => e
388
+ raise e
377
389
  rescue ReturnSyncException
378
390
  return
379
391
  rescue ForwardSyncException
@@ -430,6 +442,8 @@ module CloudI
430
442
  when MESSAGE_KEEPALIVE
431
443
  send(Erlang.term_to_binary(:keepalive))
432
444
  i += j
445
+ else
446
+ raise MessageDecodingException
433
447
  end
434
448
  if i > data_size
435
449
  raise MessageDecodingException
@@ -441,29 +455,35 @@ module CloudI
441
455
  end
442
456
  end
443
457
 
444
- def poll_request(external)
458
+ def poll_request(timeout, external)
445
459
  if @terminate
446
- return nil
460
+ return false
447
461
  elsif external and not @initialization_complete
448
462
  send(Erlang.term_to_binary(:polling))
449
463
  @initialization_complete = true
450
464
  end
451
465
 
452
- ready = false
453
- while ready == false
454
- result = IO.select([@s], nil, [@s])
455
- if result[2].length > 0
456
- return nil
457
- end
458
- if result[0].length > 0
459
- ready = true
460
- end
466
+ poll_timer = nil
467
+ if timeout.nil? or timeout < 0
468
+ timeout_value = nil
469
+ elsif timeout == 0
470
+ timeout_value = 0
471
+ elsif timeout > 0
472
+ poll_timer = Time.now
473
+ timeout_value = timeout * 0.001
461
474
  end
462
-
475
+ result = IO.select([@s], nil, [@s], timeout_value)
476
+ if result.nil?
477
+ return true
478
+ end
479
+ if result[2].length > 0
480
+ return false
481
+ end
482
+
463
483
  data = recv('')
464
484
  data_size = data.bytesize
465
485
  if data_size == 0
466
- return nil
486
+ return false
467
487
  end
468
488
  i = 0; j = 4
469
489
 
@@ -511,22 +531,22 @@ module CloudI
511
531
  i += j; j = request_size + 1 + 4 + 1 + 16 + 4
512
532
  tmp = data[i, j].unpack("a#{request_size}xLca16L")
513
533
  request = tmp[0]
514
- timeout = tmp[1]
534
+ request_timeout = tmp[1]
515
535
  priority = tmp[2]
516
536
  trans_id = tmp[3]
517
537
  pid_size = tmp[4]
518
538
  i += j; j = pid_size
519
- pid = data[i, j].unpack("a#{pid_size}")[0]
539
+ pid = data[i, j]
520
540
  i += j
521
541
  if i != data_size
522
542
  API.assert{external == true}
523
543
  if not handle_events(external, data, data_size, i)
524
- return nil
544
+ return false
525
545
  end
526
546
  end
527
547
  data.clear()
528
548
  callback(command, name, pattern, request_info, request,
529
- timeout, priority, trans_id,
549
+ request_timeout, priority, trans_id,
530
550
  Erlang.binary_to_term(pid))
531
551
  when MESSAGE_RECV_ASYNC, MESSAGE_RETURN_SYNC
532
552
  i += j; j = 4
@@ -547,7 +567,7 @@ module CloudI
547
567
  return [response_info, response, trans_id]
548
568
  when MESSAGE_RETURN_ASYNC
549
569
  i += j; j = 16
550
- trans_id = data[i, j].unpack('a16')[0]
570
+ trans_id = data[i, j]
551
571
  i += j
552
572
  if i != data_size
553
573
  API.assert{external == false}
@@ -576,7 +596,7 @@ module CloudI
576
596
  return count
577
597
  when MESSAGE_TERM
578
598
  if not handle_events(external, data, data_size, i, command)
579
- return nil
599
+ return false
580
600
  end
581
601
  API.assert{false}
582
602
  when MESSAGE_REINIT
@@ -604,33 +624,52 @@ module CloudI
604
624
  raise MessageDecodingException
605
625
  end
606
626
 
607
- ready = false
608
- while ready == false
609
- result = IO.select([@s], nil, [@s])
610
- if result[2].length > 0
611
- return nil
627
+ if not poll_timer.nil?
628
+ poll_timer_new = Time.now
629
+ elapsed = [0,
630
+ ((poll_timer_new -
631
+ poll_timer) * 1000.0).floor].max
632
+ poll_timer = poll_timer_new
633
+ if elapsed >= timeout
634
+ timeout = 0
635
+ else
636
+ timeout -= elapsed
612
637
  end
613
- if result[0].length > 0
614
- ready = true
638
+ end
639
+ if not timeout_value.nil?
640
+ if timeout == 0
641
+ return true
642
+ elsif timeout > 0
643
+ timeout_value = timeout * 0.001
615
644
  end
616
645
  end
646
+ result = IO.select([@s], nil, [@s], timeout_value)
647
+ if result.nil?
648
+ return true
649
+ end
650
+ if result[2].length > 0
651
+ return false
652
+ end
617
653
 
618
654
  data = recv(data)
619
655
  data_size = data.bytesize
620
656
  if data_size == 0
621
- return nil
657
+ return false
622
658
  end
623
659
  i = 0; j = 4
624
660
  end
625
661
  end
626
662
 
627
- def poll
628
- poll_request(true)
663
+ def poll(timeout=nil)
664
+ if timeout.nil?
665
+ timeout = -1
666
+ end
667
+ return poll_request(timeout, true)
629
668
  end
630
669
 
631
- def binary_key_value_parse(binary)
670
+ def text_key_value_parse(text)
632
671
  result = {}
633
- data = binary.split(NULL.chr)
672
+ data = text.split(NULL.chr)
634
673
  (0...(data.length)).step(2).each do |i|
635
674
  value = result[data[i]]
636
675
  if value == nil
@@ -641,15 +680,15 @@ module CloudI
641
680
  result[data[i]] = [value, data[i + 1]]
642
681
  end
643
682
  end
644
- result
683
+ return result
645
684
  end
646
685
 
647
686
  def request_http_qs_parse(request)
648
- binary_key_value_parse(request)
687
+ return text_key_value_parse(request)
649
688
  end
650
689
 
651
690
  def info_key_value_parse(message_info)
652
- binary_key_value_parse(message_info)
691
+ return text_key_value_parse(message_info)
653
692
  end
654
693
 
655
694
  def self.assert
@@ -659,7 +698,7 @@ module CloudI
659
698
  private :callback
660
699
  private :handle_events
661
700
  private :poll_request
662
- private :binary_key_value_parse
701
+ private :text_key_value_parse
663
702
  private
664
703
 
665
704
  def send(data)
@@ -693,7 +732,7 @@ module CloudI
693
732
  end
694
733
  end
695
734
  end
696
- data
735
+ return data
697
736
  end
698
737
 
699
738
  MESSAGE_INIT = 1
metadata CHANGED
@@ -1,117 +1,132 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: cloudi
3
- version: !ruby/object:Gem::Version
4
- version: 1.3.3
3
+ version: !ruby/object:Gem::Version
4
+ hash: 7
5
5
  prerelease:
6
+ segments:
7
+ - 1
8
+ - 4
9
+ - 0
10
+ version: 1.4.0
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Michael Truog
9
14
  autorequire:
10
15
  bindir: bin
11
- cert_chain:
12
- - ! '-----BEGIN CERTIFICATE-----
13
-
16
+ cert_chain:
17
+ - |
18
+ -----BEGIN CERTIFICATE-----
14
19
  MIIDMDCCAhigAwIBAgIBADANBgkqhkiG9w0BAQUFADA+MRAwDgYDVQQDDAdtanRy
15
-
16
20
  dW9nMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNjb20w
17
-
18
21
  HhcNMTQwNjI0MjAzMDQ2WhcNMTUwNjI0MjAzMDQ2WjA+MRAwDgYDVQQDDAdtanRy
19
-
20
22
  dW9nMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNjb20w
21
-
22
23
  ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBOoI/CUuwOhXjks02cT58
23
-
24
24
  jLxgsOQ412Xzu4eEKqzNsWMoj/3+qYdb5CR4+51EHtuJHZ8hndL5DTYIO8ylcG11
25
-
26
25
  EvyxqOzU+gqC53gCEBhJLivlyMXvGqL8qHPuSKGEMc1Vpzh0WicwNnaT7z3X6aQP
27
-
28
26
  UE6qWd1yE9jT7TX+GKcKayBJTufxcBMjtwvzMH4IiVaNjUBHBq2LbeNO1yDPYVzV
29
-
30
27
  HWnZCv75vIXdUruFrSZcJgNRYRwzMfHEbf+BcvqqGVV6p3PJgJMrjI8FZ7roIJNf
31
-
32
28
  D7ZO96x4ItjGazoTntAZe3EM9QB5Wjsd1cv2IEOISQ6jyvVX5E84Al+MEKhhhFuL
33
-
34
29
  AgMBAAGjOTA3MAkGA1UdEwQCMAAwHQYDVR0OBBYEFACw0UcBaNl2dQWwgg/Qzeyf
35
-
36
30
  cKG7MAsGA1UdDwQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAHjLn+8F8yeOFcKst
37
-
38
31
  mKA3m28OIoICMefZOiJfTC9UkVkW+554IXNBu3vVxLc0nlCqmuf/aQGaFBUm9MLA
39
-
40
32
  oD5CmlrU9OrEl2fPxqTHAwFgLNre8e2EWtm2OhBg73JTHRVVyBLpSK5GRUDzhJtZ
41
-
42
33
  7a2ocAE2AgFKpISNxIUe4Zz9O2thg3iryLh9prjETJTUfxDjBmHdx+YkNAblRa2w
43
-
44
34
  k9A+nCZzZECcR5ZZYSeaK6MCugGmXUhAkDbuWumCzu/RAghlVC9RFFQt7o1SwGQp
45
-
46
35
  LdvYOeJbviyiH1q1rC3NAJNC4P7Q41zx1OYa8S9M5qn+JpE0ZsomnZyGunWaya9Q
47
-
48
36
  bTD/aw==
49
-
50
37
  -----END CERTIFICATE-----
51
38
 
52
- '
53
- date: 2014-09-30 00:00:00.000000000 Z
54
- dependencies:
55
- - !ruby/object:Gem::Dependency
39
+ date: 2014-12-20 00:00:00 Z
40
+ dependencies:
41
+ - !ruby/object:Gem::Dependency
56
42
  name: erlang_rb
57
- requirement: &15927380 !ruby/object:Gem::Requirement
43
+ prerelease: false
44
+ requirement: &id001 !ruby/object:Gem::Requirement
58
45
  none: false
59
- requirements:
46
+ requirements:
60
47
  - - ~>
61
- - !ruby/object:Gem::Version
62
- version: '1.3'
63
- - - ! '>='
64
- - !ruby/object:Gem::Version
65
- version: 1.3.3
48
+ - !ruby/object:Gem::Version
49
+ hash: 7
50
+ segments:
51
+ - 1
52
+ - 4
53
+ version: "1.4"
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 7
57
+ segments:
58
+ - 1
59
+ - 4
60
+ - 0
61
+ version: 1.4.0
66
62
  type: :runtime
67
- prerelease: false
68
- version_requirements: *15927380
69
- - !ruby/object:Gem::Dependency
63
+ version_requirements: *id001
64
+ - !ruby/object:Gem::Dependency
70
65
  name: erlang_rb
71
- requirement: &15925360 !ruby/object:Gem::Requirement
66
+ prerelease: false
67
+ requirement: &id002 !ruby/object:Gem::Requirement
72
68
  none: false
73
- requirements:
69
+ requirements:
74
70
  - - ~>
75
- - !ruby/object:Gem::Version
76
- version: '1.3'
77
- - - ! '>='
78
- - !ruby/object:Gem::Version
79
- version: 1.3.3
71
+ - !ruby/object:Gem::Version
72
+ hash: 7
73
+ segments:
74
+ - 1
75
+ - 4
76
+ version: "1.4"
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ hash: 7
80
+ segments:
81
+ - 1
82
+ - 4
83
+ - 0
84
+ version: 1.4.0
80
85
  type: :development
81
- prerelease: false
82
- version_requirements: *15925360
86
+ version_requirements: *id002
83
87
  description: Ruby CloudI API
84
88
  email: mjtruog@gmail.com
85
89
  executables: []
90
+
86
91
  extensions: []
87
- extra_rdoc_files:
92
+
93
+ extra_rdoc_files:
88
94
  - README.markdown
89
- files:
95
+ files:
90
96
  - lib/cloudi.rb
91
97
  - README.markdown
92
98
  homepage: http://cloudi.org
93
- licenses:
99
+ licenses:
94
100
  - BSD
95
101
  post_install_message:
96
102
  rdoc_options: []
97
- require_paths:
103
+
104
+ require_paths:
98
105
  - lib
99
- required_ruby_version: !ruby/object:Gem::Requirement
106
+ required_ruby_version: !ruby/object:Gem::Requirement
100
107
  none: false
101
- requirements:
102
- - - ! '>='
103
- - !ruby/object:Gem::Version
104
- version: '0'
105
- required_rubygems_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ hash: 3
112
+ segments:
113
+ - 0
114
+ version: "0"
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
116
  none: false
107
- requirements:
108
- - - ! '>='
109
- - !ruby/object:Gem::Version
110
- version: '0'
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ hash: 3
121
+ segments:
122
+ - 0
123
+ version: "0"
111
124
  requirements: []
125
+
112
126
  rubyforge_project:
113
- rubygems_version: 1.8.11
127
+ rubygems_version: 1.8.15
114
128
  signing_key:
115
129
  specification_version: 3
116
130
  summary: CloudI API
117
131
  test_files: []
132
+
metadata.gz.sig CHANGED
Binary file