sbsm 1.3.4 → 1.3.5

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.
@@ -1,22 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
- #--
4
- # DRb::DRbObject -- fix bug respond_to argument -- 22.08.2011 -- mhatakeyama@ywesee.com
5
- # DRb::DRbObject -- fix bug in ruby -- 23.09.2005 -- hwyss@ywesee.com
6
- #++
7
- require 'drb'
8
-
9
- module DRb
10
- class DRbObject
11
- def respond_to?(msg_id, *args)
12
- case msg_id
13
- when :_dump
14
- true
15
- when :marshal_dump
16
- false
17
- else
18
- method_missing(:respond_to?, msg_id)
19
- end
20
- end
21
- end
22
- end
@@ -1,167 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
- #--
4
- #
5
- # State Based Session Management
6
- # Copyright (C) 2004 Hannes Wyss
7
- #
8
- # This library is free software; you can redistribute it and/or
9
- # modify it under the terms of the GNU Lesser General Public
10
- # License as published by the Free Software Foundation; either
11
- # version 2.1 of the License, or (at your option) any later version.
12
- #
13
- # This library is distributed in the hope that it will be useful,
14
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
- # Lesser General Public License for more details.
17
- #
18
- # You should have received a copy of the GNU Lesser General Public
19
- # License along with this library; if not, write to the Free Software
20
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
- #
22
- # ywesee - intellectual capital connected, Winterthurerstrasse 52, CH-8006 Zürich, Switzerland
23
- # hwyss@ywesee.com
24
- #
25
- # DrbServer -- sbsm -- hwyss@ywesee.com
26
- #++
27
-
28
- require 'delegate'
29
- require 'sbsm/drb'
30
- require 'sbsm/session'
31
- require 'sbsm/user'
32
- require 'thread'
33
- require 'digest/md5'
34
- require 'sbsm/logger'
35
- require 'sbsm/validator'
36
-
37
- module SBSM
38
- class DRbServer < SimpleDelegator
39
- include DRbUndumped
40
- CLEANING_INTERVAL = 30
41
- CAP_MAX_THRESHOLD = 120
42
- ENABLE_ADMIN = false
43
- MAX_SESSIONS = 100
44
- RUN_CLEANER = true
45
- SESSION = Session
46
- UNKNOWN_USER = UnknownUser
47
- VALIDATOR = nil
48
- attr_reader :cleaner, :updater
49
- def initialize(persistence_layer=nil)
50
- @sessions = {}
51
- @mutex = Mutex.new
52
- @cleaner = run_cleaner if(self.class.const_get(:RUN_CLEANER))
53
- @admin_threads = ThreadGroup.new
54
- @async = ThreadGroup.new
55
- @system = persistence_layer
56
- super(persistence_layer)
57
- end
58
- def _admin(src, result, priority=0)
59
- raise "admin interface disabled" unless(self::class::ENABLE_ADMIN)
60
- t = Thread.new {
61
- Thread.current.abort_on_exception = false
62
- result << begin
63
- response = begin
64
- instance_eval(src)
65
- rescue NameError => e
66
- e
67
- end
68
- str = response.to_s
69
- if(str.length > 200)
70
- response.class
71
- else
72
- str
73
- end
74
- rescue StandardError => e
75
- e.message
76
- end.to_s
77
- }
78
- t[:source] = src
79
- t.priority = priority
80
- @admin_threads.add(t)
81
- t
82
- end
83
- def async(&block)
84
- @async.add(Thread.new(&block))
85
- end
86
- def cap_max_sessions(now = Time.now)
87
- if(@sessions.size > self::class::CAP_MAX_THRESHOLD)
88
- SBSM.info "too many sessions! Keeping only #{self::class::MAX_SESSIONS}"
89
- sess = nil
90
- sorted = @sessions.values.sort
91
- sorted[0...(-self::class::MAX_SESSIONS)].each { |sess|
92
- sess.__checkout
93
- @sessions.delete(sess.key)
94
- }
95
- if(sess)
96
- age = sess.age(now)
97
- SBSM.info sprintf("deleted all sessions that had not been accessed for more than %im %is", age / 60, age % 60)
98
- end
99
- end
100
- end
101
- def clean
102
- now = Time.now
103
- @sessions.delete_if { |key, s|
104
- begin
105
- if s.respond_to?(:expired?)
106
- if s.expired?(now)
107
- s.__checkout
108
- true
109
- else
110
- s.cap_max_states
111
- false
112
- end
113
- else
114
- true
115
- end
116
- rescue
117
- true
118
- end
119
- }
120
- #cap_max_sessions(now)
121
- end
122
- def clear
123
- @sessions.each_value { |sess| sess.__checkout }
124
- @sessions.clear
125
- end
126
- def delete_session(key)
127
- if(sess = @sessions.delete(key))
128
- sess.__checkout
129
- end
130
- end
131
- def reset
132
- @mutex.synchronize {
133
- @sessions.clear
134
- }
135
- end
136
- def run_cleaner
137
- # puts "running cleaner thread"
138
- Thread.new {
139
- Thread.current.abort_on_exception = true
140
- #Thread.current.priority = 1
141
- loop {
142
- sleep self::class::CLEANING_INTERVAL
143
- @mutex.synchronize {
144
- clean()
145
- }
146
- }
147
- }
148
- end
149
- def unknown_user
150
- self::class::UNKNOWN_USER.new
151
- end
152
- def [](key)
153
- @mutex.synchronize {
154
- unless((s = @sessions[key]) && !s.expired?)
155
- args = [key, self]
156
- if(klass = self::class::VALIDATOR)
157
- args.push(klass.new)
158
- end
159
- s = @sessions[key] = self::class::SESSION.new(*args.compact)
160
- end
161
- s.reset()
162
- s.touch()
163
- s
164
- }
165
- end
166
- end
167
- end
@@ -1,84 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
- #
4
- # State Based Session Management
5
- # Copyright (C) 2004 Hannes Wyss
6
- #
7
- # This library is free software; you can redistribute it and/or
8
- # modify it under the terms of the GNU Lesser General Public
9
- # License as published by the Free Software Foundation; either
10
- # version 2.1 of the License, or (at your option) any later version.
11
- #
12
- # This library is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
- # Lesser General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU Lesser General Public
18
- # License along with this library; if not, write to the Free Software
19
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
- # ywesee - intellectual capital connected, Winterthurerstrasse 52, CH-8006 Zürich, Switzerland
22
- # hwyss@ywesee.com
23
- #
24
- # TestDRbServer -- ODDB -- 27.11.2003 -- hwyss@ywesee.com
25
-
26
-
27
- $: << File.dirname(__FILE__)
28
- $: << File.expand_path('../lib', File.dirname(__FILE__))
29
-
30
- require 'minitest/autorun'
31
- require 'sbsm/drbserver'
32
-
33
- class TestDRbServer < Minitest::Test
34
- class DRbServer < ::SBSM::DRbServer
35
- attr_reader :sessions
36
- CAP_MAX_THRESHOLD = 3
37
- MAX_SESSIONS = 3
38
- end
39
- def setup
40
- @server = DRbServer.new
41
- end
42
- def test_session
43
- ses1 = @server['test1']
44
- assert_instance_of(SBSM::Session, ses1)
45
- assert_equal({'test1'=>ses1}, @server.sessions)
46
- ses2 = @server['test2']
47
- assert_instance_of(SBSM::Session, ses2)
48
- refute_equal(ses1, ses2)
49
- expected = {
50
- 'test1' => ses1,
51
- 'test2' => ses2,
52
- }
53
- assert_equal(expected, @server.sessions)
54
- ses3 = @server['test3']
55
- assert_instance_of(SBSM::Session, ses3)
56
- refute_equal(ses1, ses3)
57
- refute_equal(ses2, ses3)
58
- expected = {
59
- 'test1' => ses1,
60
- 'test2' => ses2,
61
- 'test3' => ses3,
62
- }
63
- assert_equal(expected, @server.sessions)
64
- ses4 = @server['test4']
65
- assert_instance_of(SBSM::Session, ses4)
66
- refute_equal(ses1, ses4)
67
- refute_equal(ses2, ses4)
68
- expected = {
69
- 'test2' => ses2,
70
- 'test3' => ses3,
71
- 'test4' => ses4,
72
- }
73
- @server.cap_max_sessions
74
- assert_equal(expected, @server.sessions)
75
- ses2.touch
76
- ses5 = @server['test5']
77
- assert_instance_of(SBSM::Session, ses5)
78
- expected = {
79
- 'test2' => ses2,
80
- 'test4' => ses4,
81
- 'test5' => ses5,
82
- }
83
- end
84
- end