higgs 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +208 -0
- data/LICENSE +26 -0
- data/README +2 -0
- data/Rakefile +75 -0
- data/bin/higgs_backup +67 -0
- data/bin/higgs_dump_index +43 -0
- data/bin/higgs_dump_jlog +42 -0
- data/bin/higgs_verify +37 -0
- data/lib/cgi/session/higgs.rb +72 -0
- data/lib/higgs/block.rb +192 -0
- data/lib/higgs/cache.rb +117 -0
- data/lib/higgs/dbm.rb +55 -0
- data/lib/higgs/exceptions.rb +31 -0
- data/lib/higgs/flock.rb +77 -0
- data/lib/higgs/index.rb +164 -0
- data/lib/higgs/jlog.rb +159 -0
- data/lib/higgs/lock.rb +189 -0
- data/lib/higgs/storage.rb +1086 -0
- data/lib/higgs/store.rb +228 -0
- data/lib/higgs/tar.rb +390 -0
- data/lib/higgs/thread.rb +370 -0
- data/lib/higgs/tman.rb +513 -0
- data/lib/higgs/utils/bman.rb +285 -0
- data/lib/higgs/utils.rb +22 -0
- data/lib/higgs/version.rb +21 -0
- data/lib/higgs.rb +59 -0
- data/misc/cache_bench/cache_bench.rb +43 -0
- data/misc/dbm_bench/.strc +8 -0
- data/misc/dbm_bench/Rakefile +78 -0
- data/misc/dbm_bench/dbm_multi_thread.rb +199 -0
- data/misc/dbm_bench/dbm_rnd_delete.rb +43 -0
- data/misc/dbm_bench/dbm_rnd_read.rb +44 -0
- data/misc/dbm_bench/dbm_rnd_update.rb +44 -0
- data/misc/dbm_bench/dbm_seq_read.rb +45 -0
- data/misc/dbm_bench/dbm_seq_write.rb +44 -0
- data/misc/dbm_bench/st_verify.rb +28 -0
- data/misc/io_bench/cksum_bench.rb +48 -0
- data/misc/io_bench/jlog_bench.rb +71 -0
- data/misc/io_bench/write_bench.rb +128 -0
- data/misc/thread_bench/lock_bench.rb +132 -0
- data/mkrdoc.rb +8 -0
- data/rdoc.yml +13 -0
- data/sample/count.rb +60 -0
- data/sample/dbmtest.rb +38 -0
- data/test/Rakefile +45 -0
- data/test/run.rb +32 -0
- data/test/test_block.rb +163 -0
- data/test/test_cache.rb +214 -0
- data/test/test_cgi_session.rb +142 -0
- data/test/test_flock.rb +162 -0
- data/test/test_index.rb +258 -0
- data/test/test_jlog.rb +180 -0
- data/test/test_lock.rb +320 -0
- data/test/test_online_backup.rb +169 -0
- data/test/test_storage.rb +439 -0
- data/test/test_storage_conf.rb +202 -0
- data/test/test_storage_init_opts.rb +89 -0
- data/test/test_store.rb +211 -0
- data/test/test_tar.rb +432 -0
- data/test/test_thread.rb +541 -0
- data/test/test_tman.rb +875 -0
- data/test/test_tman_init_opts.rb +56 -0
- data/test/test_utils_bman.rb +234 -0
- metadata +115 -0
@@ -0,0 +1,285 @@
|
|
1
|
+
# = backup manager
|
2
|
+
#
|
3
|
+
# Author:: $Author: toki $
|
4
|
+
# Date:: $Date: 2007-09-26 00:20:20 +0900 (Wed, 26 Sep 2007) $
|
5
|
+
# Revision:: $Revision: 559 $
|
6
|
+
#
|
7
|
+
# == license
|
8
|
+
# :include:LICENSE
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'drb'
|
12
|
+
require 'fileutils'
|
13
|
+
require 'higgs/storage'
|
14
|
+
|
15
|
+
module Higgs
|
16
|
+
module Utils
|
17
|
+
# = backup manager
|
18
|
+
# == requirements for online-backup
|
19
|
+
#
|
20
|
+
# these parameters should be required when Higgs::Storage is opened.
|
21
|
+
#
|
22
|
+
# [<tt>:jlog_rotate_max</tt>] value is <tt>0</tt>. rotated journal logs shuold be preserved.
|
23
|
+
# [<tt>:jlog_rotate_service_uri</tt>] value is <tt>"druby://localhost:<em>appropriate_port_number</em>"</tt>.
|
24
|
+
# journal log rotation remote service should be enabled.
|
25
|
+
#
|
26
|
+
# == online-backup
|
27
|
+
#
|
28
|
+
# online-backup is controlled by <tt>higgs_backup</tt> command that
|
29
|
+
# is the front end of Higgs::Utils::BackupManager.
|
30
|
+
#
|
31
|
+
# simple online-backup is like this...
|
32
|
+
#
|
33
|
+
# % higgs_backup -v -f foo -t backup_dir -u druby://localhost:17320
|
34
|
+
# 2007-09-23 03:00:08.925 [23706]: **** START BACKUP SCENARIO ****
|
35
|
+
# 2007-09-23 03:00:08.936 [23706]: start index backup.
|
36
|
+
# 2007-09-23 03:00:09.331 [23706]: completed index backup.
|
37
|
+
# 2007-09-23 03:00:09.333 [23706]: start data backup.
|
38
|
+
# 2007-09-23 03:09:16.663 [23706]: completed data backup.
|
39
|
+
# 2007-09-23 03:09:16.692 [23706]: start journal log rotation.
|
40
|
+
# 2007-09-23 03:09:17.153 [23706]: completed journal log rotation.
|
41
|
+
# 2007-09-23 03:09:17.154 [23706]: start journal logs backup.
|
42
|
+
# 2007-09-23 03:09:17.205 [23706]: completed journal logs backup.
|
43
|
+
# 2007-09-23 03:09:17.206 [23706]: start backup storage recovery.
|
44
|
+
# 2007-09-23 03:09:17.798 [23706]: completed backup storage recovery.
|
45
|
+
# 2007-09-23 03:09:17.799 [23706]: start backup storage verify.
|
46
|
+
# 2007-09-23 03:25:44.122 [23706]: completed backup storage verify.
|
47
|
+
# 2007-09-23 03:25:44.140 [23706]: start journal logs clean.
|
48
|
+
# 2007-09-23 03:25:44.541 [23706]: completed journal logs clean.
|
49
|
+
# 2007-09-23 03:25:44.542 [23706]: **** COMPLETED BACKUP SCENARIO ****
|
50
|
+
#
|
51
|
+
# online-backup scenario includes these processes.
|
52
|
+
#
|
53
|
+
# 1. index backup. see Higgs::Utils::BackupManager#backup_index.
|
54
|
+
# 2. data backup. see Higgs::Utils::BackupManager#backup_data.
|
55
|
+
# 3. journal log rotation. see Higgs::Utils::BackupManager#rotate_jlog.
|
56
|
+
# 4. journal logs backup. see Higgs::Utils::BackupManager#backup_jlog.
|
57
|
+
# 5. backup storage recovery. see Higgs::Utils::BackupManager#recover.
|
58
|
+
# 6. backup storage verify. see Higgs::Utils::BackupManager#verify.
|
59
|
+
# 7. journal logs clean. see Higgs::Utils::BackupManager#clean_jlog.
|
60
|
+
#
|
61
|
+
# == restore from online-backup
|
62
|
+
# === 0. situation
|
63
|
+
# storage name is `foo' and backup directory is `backup_dir'.
|
64
|
+
#
|
65
|
+
# === 1. recovery from last online-backup
|
66
|
+
# run these commands.
|
67
|
+
# % cp -p backup_dir/foo.idx foo.idx
|
68
|
+
# % cp -p backup_dir/foo.tar foo.tar
|
69
|
+
# % higgs_backup -t . -n foo --command recover
|
70
|
+
#
|
71
|
+
# === 2. apply last journal log
|
72
|
+
# if system is aborted then last journal log is broken.
|
73
|
+
# Higgs::Storage applies last jounal log to a readable point at
|
74
|
+
# the read-write open.
|
75
|
+
#
|
76
|
+
# <em>WARNING.</em> Higgs::Storage is normal shutdown and last
|
77
|
+
# journal log is not broken. last journal log is not applied and
|
78
|
+
# storage data is old version. <em>this situation is inconsistent.</em>
|
79
|
+
#
|
80
|
+
# == command-line options
|
81
|
+
#
|
82
|
+
# % higgs_backup --help
|
83
|
+
# Usage: higgs_backup [options]
|
84
|
+
# --command=BACKUP_COMMAND
|
85
|
+
# -f, --from=BACKUP_TARGET_STORAGE
|
86
|
+
# -t, --to-dir=DIR_TO_BACKUP
|
87
|
+
# -n, --to-name=NAME_TO_BACKUP
|
88
|
+
# -u=URI
|
89
|
+
# --jlog-rotate-service-uri
|
90
|
+
# -v, --verbose, --[no-]verbose
|
91
|
+
# --verbose-level=LEVEL
|
92
|
+
#
|
93
|
+
# === option: <tt>--command=BACKUP_COMMAND</tt>
|
94
|
+
# select a process of online-backup.
|
95
|
+
# <tt>BACKUP_COMMAND</tt>s are these.
|
96
|
+
#
|
97
|
+
# <tt>online_backup</tt>:: default. run online-backup scenario.
|
98
|
+
# see Higgs::Utils::BackupManager#online_backup.
|
99
|
+
# <tt>index</tt>:: index backup. see Higgs::Utils::BackupManager#backup_index.
|
100
|
+
# <tt>data</tt>:: data backup. see Higgs::Utils::BackupManager#backup_data.
|
101
|
+
# <tt>rotate</tt>:: journal log rotation. see Higgs::Utils::BackupManager#rotate_jlog.
|
102
|
+
# <tt>jlog</tt>:: journal logs backup. see Higgs::Utils::BackupManager#backup_jlog.
|
103
|
+
# <tt>recover</tt>:: backup storage recovery. see Higgs::Utils::BackupManager#recover.
|
104
|
+
# <tt>verify</tt>:: backup storage verify. see Higgs::Utils::BackupManager#verify.
|
105
|
+
# <tt>clean</tt>:: journal logs clean. see Higgs::Utils::BackupManager#clean_jlog.
|
106
|
+
#
|
107
|
+
# === option: <tt>--from=BACKUP_TARGET_STORAGE</tt>
|
108
|
+
# <tt>BACKUP_TARGET_STORAGE</tt> is the name of backup target storage.
|
109
|
+
#
|
110
|
+
# === option: <tt>--to-dir=DIR_TO_BACKUP</tt>
|
111
|
+
# backuped storage is copied to the directory of <tt>DIR_TO_BACKUP</tt>.
|
112
|
+
#
|
113
|
+
# === option: <tt>--to-name=NAME_TO_BACKUP</tt>
|
114
|
+
# <tt>NAME_to_BACKUP</tt> is the name of backuped storage.
|
115
|
+
# if this option is omitted then <tt>NAME_TO_BACKUP</tt> is the same
|
116
|
+
# as <tt>BACKUP_TARGET_STORAGE</tt>.
|
117
|
+
#
|
118
|
+
# === option: <tt>--jlog-rotate-service-uri=URI</tt>
|
119
|
+
# access point journal log rotation remote service.
|
120
|
+
# <tt>URI</tt> is the same as <tt>:jlog_rotate_service_uri</tt>
|
121
|
+
# when Higgs::Storage is opened.
|
122
|
+
#
|
123
|
+
# === option: <tt>--verbose</tt>
|
124
|
+
# verbose level up.
|
125
|
+
#
|
126
|
+
# === option: <tt>--verbose-level=LEVEL</tt>
|
127
|
+
# set verbose level to <tt>LEVEL</tt>.
|
128
|
+
#
|
129
|
+
class BackupManager
|
130
|
+
# for ident(1)
|
131
|
+
CVS_ID = '$Id: bman.rb 559 2007-09-25 15:20:20Z toki $'
|
132
|
+
|
133
|
+
def initialize(options={})
|
134
|
+
@from = options[:from]
|
135
|
+
to_dir = options[:to_dir]
|
136
|
+
to_name = options[:to_name] || (@from && File.basename(@from))
|
137
|
+
@to = File.join(to_dir, to_name) if (to_dir && to_name)
|
138
|
+
@jlog_rotate_service_uri = options[:jlog_rotate_service_uri]
|
139
|
+
@verbose = options[:verbose] || 0
|
140
|
+
@out = options[:out] || STDOUT
|
141
|
+
end
|
142
|
+
|
143
|
+
def log(msg)
|
144
|
+
t = Time.now
|
145
|
+
timestamp = t.strftime('%Y-%m-%d %H:%M:%S')
|
146
|
+
milli_sec = format('%03d', t.to_f * 1000 % 1000)
|
147
|
+
"#{timestamp}.#{milli_sec} [#{$$}]: #{msg}\n"
|
148
|
+
end
|
149
|
+
private :log
|
150
|
+
|
151
|
+
def connect_service
|
152
|
+
unless (@jlog_rotate_service_uri) then
|
153
|
+
raise 'required jlog_rotate_service_uri'
|
154
|
+
end
|
155
|
+
@out << log("connect to jlog_rotate_service: #{@jlog_rotate_service_uri}") if (@verbose >= 2)
|
156
|
+
@jlog_rotate_service = DRbObject.new_with_uri(@jlog_rotate_service_uri)
|
157
|
+
end
|
158
|
+
private :connect_service
|
159
|
+
|
160
|
+
def backup_index
|
161
|
+
@out << log('start index backup.') if (@verbose >= 1)
|
162
|
+
unless (@from) then
|
163
|
+
raise 'required from_storage'
|
164
|
+
end
|
165
|
+
unless (@to) then
|
166
|
+
raise 'required to_storage'
|
167
|
+
end
|
168
|
+
connect_service
|
169
|
+
@out << log("save to #{@to}.idx") if (@verbose >= 2)
|
170
|
+
@jlog_rotate_service.call(File.expand_path(@to) + '.idx')
|
171
|
+
@out << log('completed index backup.') if (@verbose >= 1)
|
172
|
+
nil
|
173
|
+
end
|
174
|
+
|
175
|
+
def backup_data
|
176
|
+
@out << log('start data backup.') if (@verbose >= 1)
|
177
|
+
unless (@from) then
|
178
|
+
raise 'required from_storage'
|
179
|
+
end
|
180
|
+
unless (@to) then
|
181
|
+
raise 'required to_storage'
|
182
|
+
end
|
183
|
+
FileUtils.cp("#{@from}.tar", "#{@to}.tar", :preserve => true, :verbose => @verbose >= 2)
|
184
|
+
@out << log('completed data backup.') if (@verbose >= 1)
|
185
|
+
nil
|
186
|
+
end
|
187
|
+
|
188
|
+
def rotate_jlog
|
189
|
+
@out << log('start journal log rotation.') if (@verbose >= 1)
|
190
|
+
connect_service
|
191
|
+
@jlog_rotate_service.call(true)
|
192
|
+
@out << log('completed journal log rotation.') if (@verbose >= 1)
|
193
|
+
nil
|
194
|
+
end
|
195
|
+
|
196
|
+
def backup_jlog
|
197
|
+
@out << log('start journal logs backup.') if (@verbose >= 1)
|
198
|
+
unless (@from) then
|
199
|
+
raise 'required from_storage'
|
200
|
+
end
|
201
|
+
unless (@to) then
|
202
|
+
raise 'required to_storage'
|
203
|
+
end
|
204
|
+
for path in Storage.rotate_entries(@from + '.jlog')
|
205
|
+
path =~ /\.jlog\.\d+$/ or raise "mismatch jlog name: #{path}"
|
206
|
+
ext = $&
|
207
|
+
FileUtils.cp(path, "#{@to}#{ext}", :preserve => true, :verbose => @verbose >= 2)
|
208
|
+
end
|
209
|
+
@out << log('completed journal logs backup.') if (@verbose >= 1)
|
210
|
+
nil
|
211
|
+
end
|
212
|
+
|
213
|
+
def recover
|
214
|
+
@out << log('start backup storage recovery.') if (@verbose >= 1)
|
215
|
+
unless (@to) then
|
216
|
+
raise 'required to_storage'
|
217
|
+
end
|
218
|
+
Storage.recover(@to, @out, @verbose - 1)
|
219
|
+
@out << log('completed backup storage recovery.') if (@verbose >= 1)
|
220
|
+
nil
|
221
|
+
end
|
222
|
+
|
223
|
+
def verify
|
224
|
+
@out << log('start backup storage verify.') if (@verbose >= 1)
|
225
|
+
unless (@to) then
|
226
|
+
raise 'required to_storage'
|
227
|
+
end
|
228
|
+
st = Storage.new(@to, :read_only => true)
|
229
|
+
begin
|
230
|
+
st.verify(@out, @verbose - 1)
|
231
|
+
ensure
|
232
|
+
st.shutdown
|
233
|
+
end
|
234
|
+
@out << log('completed backup storage verify.') if (@verbose >= 1)
|
235
|
+
nil
|
236
|
+
end
|
237
|
+
|
238
|
+
def clean_jlog
|
239
|
+
@out << log('start journal logs clean.') if (@verbose >= 1)
|
240
|
+
|
241
|
+
unless (@from) then
|
242
|
+
raise 'required from_storage'
|
243
|
+
end
|
244
|
+
unless (@to) then
|
245
|
+
raise 'required to_storage'
|
246
|
+
end
|
247
|
+
|
248
|
+
for to_jlog in Storage.rotate_entries("#{@to}.jlog")
|
249
|
+
to_jlog =~ /\.jlog\.\d+$/ or raise "mismatch jlog name: #{to_jlog}"
|
250
|
+
ext = $&
|
251
|
+
from_jlog = @from + ext
|
252
|
+
if (File.exist? from_jlog) then
|
253
|
+
FileUtils.rm(from_jlog, :verbose => @verbose >= 2)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
for to_jlog in Storage.rotate_entries("#{@to}.jlog")
|
258
|
+
FileUtils.rm(to_jlog, :verbose => @verbose >= 2)
|
259
|
+
end
|
260
|
+
|
261
|
+
@out << log('completed journal logs clean.') if (@verbose >= 1)
|
262
|
+
nil
|
263
|
+
end
|
264
|
+
|
265
|
+
# run online backup scenario
|
266
|
+
def online_backup
|
267
|
+
@out << log('**** START BACKUP SCENARIO ****') if (@verbose >= 1)
|
268
|
+
backup_index
|
269
|
+
backup_data
|
270
|
+
rotate_jlog
|
271
|
+
backup_jlog
|
272
|
+
recover
|
273
|
+
verify
|
274
|
+
clean_jlog
|
275
|
+
@out << log('**** COMPLETED BACKUP SCENARIO ****') if (@verbose >= 1)
|
276
|
+
nil
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
# Local Variables:
|
283
|
+
# mode: Ruby
|
284
|
+
# indent-tabs-mode: nil
|
285
|
+
# End:
|
data/lib/higgs/utils.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# = namespace for utilities
|
2
|
+
#
|
3
|
+
# Author:: $Author: toki $
|
4
|
+
# Date:: $Date: 2007-09-26 00:20:20 +0900 (Wed, 26 Sep 2007) $
|
5
|
+
# Revision:: $Revision: 559 $
|
6
|
+
#
|
7
|
+
# == license
|
8
|
+
# :include:LICENSE
|
9
|
+
#
|
10
|
+
|
11
|
+
module Higgs
|
12
|
+
# = namespace for command-line utilities
|
13
|
+
module Utils
|
14
|
+
# for ident(1)
|
15
|
+
CVS_ID = '$Id: utils.rb 559 2007-09-25 15:20:20Z toki $'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Local Variables:
|
20
|
+
# mode: Ruby
|
21
|
+
# indent-tabs-mode: nil
|
22
|
+
# End:
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# = version
|
2
|
+
#
|
3
|
+
# Author:: $Author: toki $
|
4
|
+
# Date:: $Date: 2007-09-29 18:06:25 +0900 (Sat, 29 Sep 2007) $
|
5
|
+
# Revision:: $Revision: 578 $
|
6
|
+
#
|
7
|
+
# == license
|
8
|
+
# :include:LICENSE
|
9
|
+
#
|
10
|
+
|
11
|
+
module Higgs
|
12
|
+
# for ident(1)
|
13
|
+
CVS_ID = '$Id: version.rb 578 2007-09-29 09:06:25Z toki $'
|
14
|
+
|
15
|
+
VERSION = '0.1.0'
|
16
|
+
end
|
17
|
+
|
18
|
+
# Local Variables:
|
19
|
+
# mode: Ruby
|
20
|
+
# indent-tabs-mode: nil
|
21
|
+
# End:
|
data/lib/higgs.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# = pure ruby transactional storage compatible with unix TAR format
|
2
|
+
#
|
3
|
+
# Author:: $Author: toki $
|
4
|
+
# Date:: $Date: 2007-09-27 00:51:39 +0900 (Thu, 27 Sep 2007) $
|
5
|
+
# Revision:: $Revision: 562 $
|
6
|
+
#
|
7
|
+
# == license
|
8
|
+
# :include:LICENSE
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'higgs/dbm'
|
12
|
+
require 'higgs/store'
|
13
|
+
require 'higgs/version'
|
14
|
+
|
15
|
+
# = pure ruby transactional storage compatible with unix TAR format
|
16
|
+
# == features
|
17
|
+
#
|
18
|
+
# * data format is compatible with unix TAR format.
|
19
|
+
# * data can have meta-data called `property'.
|
20
|
+
# * consistency of storage contents is always checked by hash value.
|
21
|
+
# * read-write transaction and read-only transaction are supported.
|
22
|
+
# * online-backup is supported.
|
23
|
+
#
|
24
|
+
# == main classes
|
25
|
+
#
|
26
|
+
# [Higgs::Store] storage like pstore
|
27
|
+
# [Higgs::DBM] storage like dbm
|
28
|
+
# [Higgs::Utils::BackupManager] online backup utility (body of <tt>higgs_backup</tt> command)
|
29
|
+
#
|
30
|
+
# == safety level
|
31
|
+
# === case of no backup
|
32
|
+
#
|
33
|
+
# [REQUIREMENTS] default
|
34
|
+
# [NORMAL SHUTDOWN] OK, no recovery
|
35
|
+
# [PROCESS ABORT] OK, automatic recovery on read-write open
|
36
|
+
# [SYSTEM ABORT (OS abort)] NG, data is <em>NOT</em> consistent
|
37
|
+
#
|
38
|
+
# === case of online backup
|
39
|
+
#
|
40
|
+
# [REQUIREMENTS] open with parameters:
|
41
|
+
# <tt>jlog_rotate_max => 0</tt>,
|
42
|
+
# <tt>jlog_rotate_service_uri => "druby://localhost:<em>appropriate_port_number</em>"</tt>,
|
43
|
+
# and execute <tt>higgs_backup</tt> (see Higgs::Utils::BackupManager)
|
44
|
+
# [NORMAL SHUTDOWN] OK, no recovery
|
45
|
+
# [PROCESS ABORT] OK, automatic recovery on read-write open
|
46
|
+
# [SYSTEM ABORT (OS abort)] OK, need for <em>MANUAL</em> recovery from backup
|
47
|
+
#
|
48
|
+
# == license
|
49
|
+
#
|
50
|
+
# BSD style license.
|
51
|
+
# :include:LICENSE
|
52
|
+
#
|
53
|
+
module Higgs
|
54
|
+
end
|
55
|
+
|
56
|
+
# Local Variables:
|
57
|
+
# mode: Ruby
|
58
|
+
# indent-tabs-mode: nil
|
59
|
+
# End:
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
|
3
|
+
# for ident(1)
|
4
|
+
CVS_ID = '$Id: cache_bench.rb 559 2007-09-25 15:20:20Z toki $'
|
5
|
+
|
6
|
+
$: << File.join(File.dirname($0), '..', '..', 'lib')
|
7
|
+
|
8
|
+
require 'benchmark'
|
9
|
+
require 'higgs/cache'
|
10
|
+
|
11
|
+
loop_count = (ARGV.shift || '100000').to_i
|
12
|
+
cache_entries = (ARGV.shift || '10000').to_i
|
13
|
+
cache_limit = (ARGV.shift || '1000').to_i
|
14
|
+
puts "#{$0}: LOOP:#{loop_count}, ENTRIES:#{cache_entries}, CACHE_LIMIT:#{cache_limit}"
|
15
|
+
|
16
|
+
def test_store(cache, count, entries)
|
17
|
+
srand(0)
|
18
|
+
count.times do
|
19
|
+
cache[rand(entries)] = rand
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_fetch(cache, count, entries)
|
24
|
+
srand(1)
|
25
|
+
key_list = cache.keys
|
26
|
+
count.times do
|
27
|
+
cache[key_list[rand(key_list.size)]]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Benchmark.bm(25) do |x|
|
32
|
+
[ Hash.new,
|
33
|
+
Higgs::LRUCache.new(cache_limit)
|
34
|
+
].each do |cache|
|
35
|
+
x.report("[store] #{cache.class}") { test_store(cache, loop_count, cache_entries) }
|
36
|
+
x.report("[fetch] #{cache.class}") { test_fetch(cache, loop_count, cache_entries) }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Local Variables:
|
41
|
+
# mode: Ruby
|
42
|
+
# indent-tabs-mode: nil
|
43
|
+
# End:
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# for idnet(1)
|
2
|
+
CVS_ID = '$Id: Rakefile 559 2007-09-25 15:20:20Z toki $'
|
3
|
+
|
4
|
+
LIB_DIR = File.join(File.dirname(__FILE__), '..', '..', 'lib')
|
5
|
+
|
6
|
+
LOOP_COUNT = ENV['LOOP_COUNT'] || '100'
|
7
|
+
DATA_COUNT = ENV['DATA_COUNT'] || '10'
|
8
|
+
MAX_DAT_LEN = ENV['MAX_DAT_LEN'] || '32768'
|
9
|
+
|
10
|
+
def run(cmd)
|
11
|
+
ruby '-I', LIB_DIR, cmd, LOOP_COUNT, DATA_COUNT, MAX_DAT_LEN
|
12
|
+
end
|
13
|
+
|
14
|
+
def prof(cmd)
|
15
|
+
ruby '-I', LIB_DIR, '-r', 'profile', cmd, LOOP_COUNT, DATA_COUNT, MAX_DAT_LEN
|
16
|
+
end
|
17
|
+
|
18
|
+
def ruby_prof(cmd)
|
19
|
+
ENV['RUBYLIB'] = [ ENV['RUBYLIB'], File.expand_path(LIB_DIR) ].join(':')
|
20
|
+
printer = ENV['PROF_PRINTER'] || 'flat'
|
21
|
+
sh 'ruby-prof', '-p', printer, cmd
|
22
|
+
end
|
23
|
+
|
24
|
+
def benchmarks
|
25
|
+
print "\n"
|
26
|
+
yield 'dbm_seq_write.rb'
|
27
|
+
run 'st_verify.rb'
|
28
|
+
yield 'dbm_seq_read.rb'
|
29
|
+
run 'st_verify.rb'
|
30
|
+
yield 'dbm_rnd_read.rb'
|
31
|
+
run 'st_verify.rb'
|
32
|
+
yield 'dbm_rnd_update.rb'
|
33
|
+
run 'st_verify.rb'
|
34
|
+
yield 'dbm_rnd_delete.rb'
|
35
|
+
run 'st_verify.rb'
|
36
|
+
#yield 'st_reorganize.rb'
|
37
|
+
#run 'st_verify.rb'
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
|
41
|
+
task :default => [ :run ]
|
42
|
+
|
43
|
+
task :run => [ :clean ] do
|
44
|
+
benchmarks do |rb|
|
45
|
+
run rb
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
task :dump_index do
|
50
|
+
ruby '-I', LIB_DIR, '../../bin/dump_index.rb', 'foo.idx'
|
51
|
+
end
|
52
|
+
|
53
|
+
task :dump_jlog do
|
54
|
+
ruby '-I', LIB_DIR, '../../bin/dump_jlog.rb', 'foo.jlog'
|
55
|
+
end
|
56
|
+
|
57
|
+
task :prof => [ :clean ] do
|
58
|
+
benchmarks do |rb|
|
59
|
+
prof rb
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
task :ruby_prof => [ :clean ] do
|
64
|
+
benchmarks do |rb|
|
65
|
+
ruby_prof rb
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
task :clean do
|
70
|
+
for db in Dir['foo.*']
|
71
|
+
rm_f db
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Local Variables:
|
76
|
+
# mode: Ruby
|
77
|
+
# indent-tabs-mode: nil
|
78
|
+
# End:
|