ood_core 0.5.1 → 0.6.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -1
- data/lib/ood_core/batch_connect/template.rb +17 -6
- data/lib/ood_core/batch_connect/templates/vnc.rb +2 -2
- data/lib/ood_core/job/adapters/drmaa.rb +1002 -0
- data/lib/ood_core/job/adapters/helper.rb +18 -0
- data/lib/ood_core/job/adapters/lsf/batch.rb +4 -3
- data/lib/ood_core/job/adapters/lsf.rb +4 -2
- data/lib/ood_core/job/adapters/pbspro.rb +19 -8
- data/lib/ood_core/job/adapters/sge/batch.rb +203 -0
- data/lib/ood_core/job/adapters/sge/helper.rb +65 -0
- data/lib/ood_core/job/adapters/sge/qstat_xml_j_r_listener.rb +116 -0
- data/lib/ood_core/job/adapters/sge/qstat_xml_r_listener.rb +138 -0
- data/lib/ood_core/job/adapters/sge.rb +163 -0
- data/lib/ood_core/job/adapters/slurm.rb +16 -5
- data/lib/ood_core/job/adapters/torque/attributes.rb +109 -0
- data/lib/ood_core/job/adapters/torque/batch.rb +470 -0
- data/lib/ood_core/job/adapters/torque/error.rb +403 -0
- data/lib/ood_core/job/adapters/torque/ffi.rb +430 -0
- data/lib/ood_core/job/adapters/torque.rb +23 -18
- data/lib/ood_core/job/status.rb +3 -13
- data/lib/ood_core/refinements/drmaa_extensions.rb +21 -0
- data/lib/ood_core/version.rb +1 -1
- data/ood_core.gemspec +3 -3
- metadata +23 -9
@@ -0,0 +1,1002 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
#########################################################################
|
4
|
+
#
|
5
|
+
# The Contents of this file are made available subject to the terms of
|
6
|
+
# the Sun Industry Standards Source License Version 1.2
|
7
|
+
#
|
8
|
+
# Sun Microsystems Inc., March, 2006
|
9
|
+
#
|
10
|
+
#
|
11
|
+
# Sun Industry Standards Source License Version 1.2
|
12
|
+
# =================================================
|
13
|
+
# The contents of this file are subject to the Sun Industry Standards
|
14
|
+
# Source License Version 1.2 (the "License"); You may not use this file
|
15
|
+
# except in compliance with the License. You may obtain a copy of the
|
16
|
+
# License at http://gridengine.sunsource.net/Gridengine_SISSL_license.html
|
17
|
+
#
|
18
|
+
# Software provided under this License is provided on an "AS IS" basis,
|
19
|
+
# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
20
|
+
# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
21
|
+
# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
22
|
+
# See the License for the specific provisions governing your rights and
|
23
|
+
# obligations concerning the Software.
|
24
|
+
#
|
25
|
+
# The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
26
|
+
#
|
27
|
+
# Copyright: 2006 by Sun Microsystems, Inc.
|
28
|
+
#
|
29
|
+
# All Rights Reserved.
|
30
|
+
#
|
31
|
+
#########################################################################
|
32
|
+
#
|
33
|
+
#
|
34
|
+
# Ruby 1.9 version of DRMAA wrapper
|
35
|
+
#
|
36
|
+
#
|
37
|
+
#
|
38
|
+
|
39
|
+
require 'fiddle/import'
|
40
|
+
require 'ffi'
|
41
|
+
require 'pp'
|
42
|
+
|
43
|
+
module FFI_DRMAA
|
44
|
+
extend FFI::Library
|
45
|
+
|
46
|
+
ffi_lib defined?(self.libdrmaa_path) ? self.libdrmaa_path : 'libdrmaa.so'
|
47
|
+
|
48
|
+
#TODO / Missing:
|
49
|
+
#
|
50
|
+
# drmaa_delete_job_template
|
51
|
+
# drmaa_strerror
|
52
|
+
|
53
|
+
attach_function 'drmaa_version', [ :pointer , :pointer , :string , :ulong ], :int
|
54
|
+
attach_function 'drmaa_init', [:string, :string, :ulong], :int
|
55
|
+
attach_function 'drmaa_allocate_job_template', [:pointer, :string, :ulong], :int
|
56
|
+
attach_function 'drmaa_get_attribute', [:pointer, :string, :pointer, :ulong, :string, :ulong], :int
|
57
|
+
attach_function 'drmaa_get_attribute_names', [:pointer, :string, :ulong], :int
|
58
|
+
attach_function 'drmaa_get_vector_attribute', [:pointer, :string, :pointer, :string, :ulong], :int
|
59
|
+
attach_function 'drmaa_get_vector_attribute_names', [:pointer, :string, :ulong], :int
|
60
|
+
|
61
|
+
attach_function 'drmaa_run_job', [:string, :ulong, :pointer, :string, :ulong], :int
|
62
|
+
attach_function 'drmaa_set_attribute', [:pointer, :string, :string, :string, :ulong], :int
|
63
|
+
attach_function 'drmaa_set_vector_attribute', [:pointer, :string, :pointer, :string, :ulong], :int
|
64
|
+
attach_function 'drmaa_get_contact', [:string, :ulong, :string, :ulong], :int
|
65
|
+
attach_function 'drmaa_get_DRM_system', [:string, :ulong, :string, :ulong], :int
|
66
|
+
attach_function 'drmaa_get_DRMAA_implementation', [:string, :ulong, :string, :ulong], :int
|
67
|
+
attach_function 'drmaa_wait', [:buffer_in,:string,:ulong,:pointer,:long,:pointer,:string,:ulong], :int
|
68
|
+
attach_function 'drmaa_wifexited', [:pointer,:int,:string,:ulong], :int
|
69
|
+
attach_function 'drmaa_wexitstatus', [:pointer,:int,:string,:ulong], :int
|
70
|
+
attach_function 'drmaa_wifsignaled', [:pointer,:int,:string,:ulong], :int
|
71
|
+
attach_function 'drmaa_wtermsig', [:string,:ulong,:int,:string,:ulong], :int
|
72
|
+
attach_function 'drmaa_wifaborted', [:pointer,:int,:string,:ulong], :int
|
73
|
+
attach_function 'drmaa_wcoredump', [:pointer,:int,:string,:ulong], :int
|
74
|
+
attach_function 'drmaa_exit', [:string, :ulong], :int
|
75
|
+
attach_function 'drmaa_run_bulk_jobs', [:pointer,:pointer,:int,:int,:int,:string,:ulong], :int
|
76
|
+
attach_function 'drmaa_get_next_job_id', [ :pointer , :string , :ulong ], :int
|
77
|
+
attach_function 'drmaa_release_job_ids', [ :pointer ], :void
|
78
|
+
attach_function 'drmaa_get_next_attr_name', [ :pointer , :string, :ulong], :int
|
79
|
+
attach_function 'drmaa_release_attr_names', [ :pointer ], :void
|
80
|
+
attach_function 'drmaa_get_next_attr_value',[ :pointer, :string, :ulong], :int
|
81
|
+
attach_function 'drmaa_release_attr_values',[ :pointer ], :void
|
82
|
+
attach_function 'drmaa_control', [:string,:int,:string,:ulong], :int
|
83
|
+
attach_function 'drmaa_job_ps', [ :string, :pointer , :string, :ulong], :int
|
84
|
+
|
85
|
+
attach_function 'drmaa_synchronize', [:pointer,:long,:int,:string,:ulong], :int
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
module DRMAA
|
90
|
+
class DRMAAException < StandardError ; end
|
91
|
+
class DRMAAInternalError < DRMAAException ; end
|
92
|
+
class DRMAACommunicationError < DRMAAException ; end
|
93
|
+
class DRMAAAuthenticationError < DRMAAException ; end
|
94
|
+
class DRMAAInvalidArgumentError < DRMAAException ; end
|
95
|
+
class DRMAANoActiveSessionError < DRMAAException ; end
|
96
|
+
class DRMAANoMemoryError < DRMAAException ; end
|
97
|
+
class DRMAAInvalidContactError < DRMAAException ; end
|
98
|
+
class DRMAADefaultContactError < DRMAAException ; end
|
99
|
+
class DRMAASessionInitError < DRMAAException ; end
|
100
|
+
class DRMAAAlreadyActiveSessionError < DRMAAException ; end
|
101
|
+
class DRMAASessionExitError < DRMAAException ; end
|
102
|
+
class DRMAAInvalidAttributeFormatError < DRMAAException ; end
|
103
|
+
class DRMAAInvalidAttributeValueError < DRMAAException ; end
|
104
|
+
class DRMAAConflictingAttributeValuesError < DRMAAException ; end
|
105
|
+
class DRMAATryLater < DRMAAException ; end
|
106
|
+
class DRMAADeniedError < DRMAAException ; end
|
107
|
+
class DRMAAInvalidJobError < DRMAAException ; end
|
108
|
+
class DRMAAResumeInconsistent < DRMAAException ; end
|
109
|
+
class DRMAASuspendInconsistent < DRMAAException ; end
|
110
|
+
class DRMAAHoldInconsistent < DRMAAException ; end
|
111
|
+
class DRMAAReleaseInconsistent < DRMAAException ; end
|
112
|
+
class DRMAATimeoutExit < DRMAAException ; end
|
113
|
+
|
114
|
+
class DRMAANoDefaultContactSelected < DRMAAException ; end
|
115
|
+
class DRMAANoMoreElements < DRMAAException ; end
|
116
|
+
|
117
|
+
# drmaa_job_ps() constants
|
118
|
+
STATE_UNDETERMINED = 0x00
|
119
|
+
STATE_QUEUED_ACTIVE = 0x10
|
120
|
+
STATE_SYSTEM_ON_HOLD = 0x11
|
121
|
+
STATE_USER_ON_HOLD = 0x12
|
122
|
+
STATE_USER_SYSTEM_ON_HOLD = 0x13
|
123
|
+
STATE_RUNNING = 0x20
|
124
|
+
STATE_SYSTEM_SUSPENDED = 0x21
|
125
|
+
STATE_USER_SUSPENDED = 0x22
|
126
|
+
STATE_USER_SYSTEM_SUSPENDED = 0x23
|
127
|
+
STATE_DONE = 0x30
|
128
|
+
STATE_FAILED = 0x40
|
129
|
+
|
130
|
+
# drmaa_control() constants
|
131
|
+
ACTION_SUSPEND = 0
|
132
|
+
ACTION_RESUME = 1
|
133
|
+
ACTION_HOLD = 2
|
134
|
+
ACTION_RELEASE = 3
|
135
|
+
ACTION_TERMINATE = 4
|
136
|
+
|
137
|
+
# placeholders for job input/output/error path and working dir
|
138
|
+
PLACEHOLDER_INCR = "$drmaa_incr_ph$"
|
139
|
+
PLACEHOLDER_HD = "$drmaa_hd_ph$"
|
140
|
+
PLACEHOLDER_WD = "$drmaa_wd_ph$"
|
141
|
+
|
142
|
+
private
|
143
|
+
ANY_JOB = "DRMAA_JOB_IDS_SESSION_ANY"
|
144
|
+
ALL_JOBS = "DRMAA_JOB_IDS_SESSION_ALL"
|
145
|
+
|
146
|
+
# need errno mapping due to errno's changed from DRMAA 0.95 to 1.0 ... sigh!
|
147
|
+
ERRNO_MAP_095 = [ [ "DRMAA_ERRNO_SUCCESS", 0 ],
|
148
|
+
[ "DRMAA_ERRNO_INTERNAL_ERROR", 1 ],
|
149
|
+
[ "DRMAA_ERRNO_DRM_COMMUNICATION_FAILURE", 2 ],
|
150
|
+
[ "DRMAA_ERRNO_AUTH_FAILURE", 3 ],
|
151
|
+
[ "DRMAA_ERRNO_INVALID_ARGUMENT", 4 ],
|
152
|
+
[ "DRMAA_ERRNO_NO_ACTIVE_SESSION", 5 ],
|
153
|
+
[ "DRMAA_ERRNO_NO_MEMORY", 6 ],
|
154
|
+
|
155
|
+
[ "DRMAA_ERRNO_INVALID_CONTACT_STRING", 7 ],
|
156
|
+
[ "DRMAA_ERRNO_DEFAULT_CONTACT_STRING_ERROR" , 8 ],
|
157
|
+
[ "DRMAA_ERRNO_DRMS_INIT_FAILED", 9 ],
|
158
|
+
[ "DRMAA_ERRNO_ALREADY_ACTIVE_SESSION", 10 ],
|
159
|
+
[ "DRMAA_ERRNO_DRMS_EXIT_ERROR", 11 ],
|
160
|
+
|
161
|
+
[ "DRMAA_ERRNO_INVALID_ATTRIBUTE_FORMAT", 12 ],
|
162
|
+
[ "DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE", 13 ],
|
163
|
+
[ "DRMAA_ERRNO_CONFLICTING_ATTRIBUTE_VALUES", 14 ],
|
164
|
+
|
165
|
+
[ "DRMAA_ERRNO_TRY_LATER", 15 ],
|
166
|
+
[ "DRMAA_ERRNO_DENIED_BY_DRM", 16 ],
|
167
|
+
|
168
|
+
[ "DRMAA_ERRNO_INVALID_JOB", 17 ],
|
169
|
+
[ "DRMAA_ERRNO_RESUME_INCONSISTENT_STATE", 18 ],
|
170
|
+
[ "DRMAA_ERRNO_SUSPEND_INCONSISTENT_STATE", 19 ],
|
171
|
+
[ "DRMAA_ERRNO_HOLD_INCONSISTENT_STATE", 20 ],
|
172
|
+
[ "DRMAA_ERRNO_RELEASE_INCONSISTENT_STATE", 21 ],
|
173
|
+
[ "DRMAA_ERRNO_EXIT_TIMEOUT", 22 ],
|
174
|
+
[ "DRMAA_ERRNO_NO_RUSAGE", 23 ] ]
|
175
|
+
|
176
|
+
ERRNO_MAP_100 = [ [ "DRMAA_ERRNO_SUCCESS", 0 ],
|
177
|
+
[ "DRMAA_ERRNO_INTERNAL_ERROR", 1 ],
|
178
|
+
[ "DRMAA_ERRNO_DRM_COMMUNICATION_FAILURE", 2 ],
|
179
|
+
[ "DRMAA_ERRNO_AUTH_FAILURE", 3 ],
|
180
|
+
[ "DRMAA_ERRNO_INVALID_ARGUMENT", 4 ],
|
181
|
+
[ "DRMAA_ERRNO_NO_ACTIVE_SESSION", 5 ],
|
182
|
+
[ "DRMAA_ERRNO_NO_MEMORY", 6 ],
|
183
|
+
|
184
|
+
[ "DRMAA_ERRNO_INVALID_CONTACT_STRING", 7 ],
|
185
|
+
[ "DRMAA_ERRNO_DEFAULT_CONTACT_STRING_ERROR", 8 ],
|
186
|
+
[ "DRMAA_ERRNO_NO_DEFAULT_CONTACT_STRING_SELECTED", 9 ],
|
187
|
+
[ "DRMAA_ERRNO_DRMS_INIT_FAILED", 10 ],
|
188
|
+
[ "DRMAA_ERRNO_ALREADY_ACTIVE_SESSION", 11 ],
|
189
|
+
[ "DRMAA_ERRNO_DRMS_EXIT_ERROR", 12 ],
|
190
|
+
|
191
|
+
[ "DRMAA_ERRNO_INVALID_ATTRIBUTE_FORMAT", 13 ],
|
192
|
+
[ "DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE", 14 ],
|
193
|
+
[ "DRMAA_ERRNO_CONFLICTING_ATTRIBUTE_VALUES", 15 ],
|
194
|
+
|
195
|
+
[ "DRMAA_ERRNO_TRY_LATER", 16 ],
|
196
|
+
[ "DRMAA_ERRNO_DENIED_BY_DRM", 17 ],
|
197
|
+
|
198
|
+
[ "DRMAA_ERRNO_INVALID_JOB", 18 ],
|
199
|
+
[ "DRMAA_ERRNO_RESUME_INCONSISTENT_STATE", 19 ],
|
200
|
+
[ "DRMAA_ERRNO_SUSPEND_INCONSISTENT_STATE", 20 ],
|
201
|
+
[ "DRMAA_ERRNO_HOLD_INCONSISTENT_STATE", 21 ],
|
202
|
+
[ "DRMAA_ERRNO_RELEASE_INCONSISTENT_STATE", 22 ],
|
203
|
+
[ "DRMAA_ERRNO_EXIT_TIMEOUT", 23 ],
|
204
|
+
[ "DRMAA_ERRNO_NO_RUSAGE", 24 ],
|
205
|
+
[ "DRMAA_ERRNO_NO_MORE_ELEMENTS", 25 ]]
|
206
|
+
|
207
|
+
def DRMAA.errno2str(drmaa_errno)
|
208
|
+
# stack = caller
|
209
|
+
# puts stack
|
210
|
+
if DRMAA.version < 1.0
|
211
|
+
s = ERRNO_MAP_095.find{ |pair| pair[1] == drmaa_errno }[0]
|
212
|
+
else
|
213
|
+
s = ERRNO_MAP_100.find{ |pair| pair[1] == drmaa_errno }[0]
|
214
|
+
end
|
215
|
+
s = "DRMAA_ERRNO_INTERNAL_ERROR" if s.nil?
|
216
|
+
puts "errno2str(" + drmaa_errno.to_s + ") = " + s
|
217
|
+
return s
|
218
|
+
end
|
219
|
+
|
220
|
+
def DRMAA.str2errno(str)
|
221
|
+
if DRMAA.version < 1.0
|
222
|
+
errno = ERRNO_MAP_095.find{ |pair| pair[0] == str }[1]
|
223
|
+
else
|
224
|
+
errno = ERRNO_MAP_100.find{ |pair| pair[0] == str }[1]
|
225
|
+
end
|
226
|
+
errno = 1 if errno.nil? # internal error
|
227
|
+
# puts "str2errno(" + str + ") = " + errno.to_s
|
228
|
+
return errno
|
229
|
+
end
|
230
|
+
|
231
|
+
# 101 character buffer constant (length is arbitrary)
|
232
|
+
ErrSize = 161
|
233
|
+
WaitSize = 15
|
234
|
+
EC = " " * ErrSize
|
235
|
+
|
236
|
+
public
|
237
|
+
# returns string specifying the DRM system
|
238
|
+
# int drmaa_get_drm_system(char *, size_t , char *, size_t)
|
239
|
+
def DRMAA.drm_system
|
240
|
+
drm = " " * 20
|
241
|
+
err = " " * ErrSize
|
242
|
+
r = FFI_DRMAA.drmaa_get_DRM_system(drm, 20, err, ErrSize)
|
243
|
+
r1 = [drm, 20, err, ErrSize]
|
244
|
+
DRMAA.throw(r, r1[2])
|
245
|
+
drm.delete! "\000"
|
246
|
+
drm.strip!
|
247
|
+
return r1[0]
|
248
|
+
end
|
249
|
+
|
250
|
+
# returns string specifying contact information
|
251
|
+
# int drmaa_get_contact(char *, size_t, char *, size_t)
|
252
|
+
def DRMAA.contact
|
253
|
+
contact = " " * ErrSize
|
254
|
+
err = " " * ErrSize
|
255
|
+
r,r1 = FFI_DRMAA.drmaa_get_contact(contact, ErrSize, err, ErrSize)
|
256
|
+
r1 = [contact, ErrSize, err, ErrSize]
|
257
|
+
contact.delete! "\000"
|
258
|
+
contact.strip!
|
259
|
+
DRMAA.throw(r, r1[2])
|
260
|
+
return r1[0]
|
261
|
+
end
|
262
|
+
|
263
|
+
# returns string specifying DRMAA implementation
|
264
|
+
# int drmaa_get_DRMAA_implementation(char *, size_t , char *, size_t)
|
265
|
+
def DRMAA.drmaa_implementation
|
266
|
+
err = " " * ErrSize
|
267
|
+
impl = " " * 30
|
268
|
+
r = FFI_DRMAA.drmaa_get_DRMAA_implementation(impl, 30, err, ErrSize)
|
269
|
+
r1 = [impl, 30, err, ErrSize]
|
270
|
+
DRMAA.throw(r, r1[2])
|
271
|
+
impl.delete! "\000"
|
272
|
+
impl.strip!
|
273
|
+
return r1[0]
|
274
|
+
end
|
275
|
+
|
276
|
+
# returns DRMAA version (e.g. 1.0 or 0.95)
|
277
|
+
# int drmaa_version(unsigned int *, unsigned int *, char *, size_t )
|
278
|
+
def DRMAA.version
|
279
|
+
err= " " * ErrSize
|
280
|
+
major = FFI::MemoryPointer.new(:int, 1)
|
281
|
+
minor = FFI::MemoryPointer.new(:int, 1)
|
282
|
+
r = FFI_DRMAA.drmaa_version major,minor, err, ErrSize
|
283
|
+
r1 = [major.read_int,minor.read_int, err, ErrSize]
|
284
|
+
DRMAA.throw(r, r1[2])
|
285
|
+
@version = r1[0] + (Float(r1[1])/100)
|
286
|
+
end
|
287
|
+
|
288
|
+
private
|
289
|
+
# const char *drmaa_strerror(int drmaa_errno)
|
290
|
+
def DRMAA.strerror(errno)
|
291
|
+
r = @drmaa_strerror.call(drmaa_errno)
|
292
|
+
return r.to_s
|
293
|
+
end
|
294
|
+
|
295
|
+
# int drmaa_job_ps( const char *, int *, char *, size_t )
|
296
|
+
def DRMAA.job_ps(job)
|
297
|
+
err = " " * ErrSize
|
298
|
+
state = FFI::MemoryPointer.new(:int,4)
|
299
|
+
r = FFI_DRMAA.drmaa_job_ps(job, state, err, ErrSize)
|
300
|
+
r1 = [job, state.read_int, err, ErrSize]
|
301
|
+
DRMAA.throw(r, r1[2])
|
302
|
+
return r1[1]
|
303
|
+
end
|
304
|
+
|
305
|
+
# int drmaa_control(const char *, int , char *, size_t )
|
306
|
+
def DRMAA.control(job, action)
|
307
|
+
err = ' ' * ErrSize
|
308
|
+
r = FFI_DRMAA.drmaa_control(job, action, err, ErrSize)
|
309
|
+
r1 = [job, action, err, ErrSize]
|
310
|
+
DRMAA.throw(r, r1[2])
|
311
|
+
end
|
312
|
+
|
313
|
+
|
314
|
+
# int drmaa_init(const char *, char *, size_t)
|
315
|
+
def DRMAA.init(contact)
|
316
|
+
err=" " * ErrSize
|
317
|
+
r = FFI_DRMAA.drmaa_init contact, err, ErrSize-1
|
318
|
+
r1 = [contact,err,ErrSize-1]
|
319
|
+
contact.delete! "\000"
|
320
|
+
contact.strip!
|
321
|
+
DRMAA.throw(r, r1[1])
|
322
|
+
end
|
323
|
+
|
324
|
+
# int drmaa_exit(char *, size_t)
|
325
|
+
def DRMAA.exit
|
326
|
+
err=" " * ErrSize
|
327
|
+
r = FFI_DRMAA.drmaa_exit err, ErrSize-1
|
328
|
+
r1 = [err,ErrSize-1]
|
329
|
+
DRMAA.throw(r, r1[0])
|
330
|
+
end
|
331
|
+
|
332
|
+
# int drmaa_allocate_job_template(drmaa_job_template_t **, char *, size_t)
|
333
|
+
def DRMAA.allocate_job_template
|
334
|
+
err=" " * ErrSize
|
335
|
+
jt = FFI::MemoryPointer.new :pointer
|
336
|
+
r = FFI_DRMAA.drmaa_allocate_job_template jt, err, ErrSize
|
337
|
+
r1 = [jt,err,ErrSize]
|
338
|
+
|
339
|
+
DRMAA.throw(r, r1[1])
|
340
|
+
return jt
|
341
|
+
end
|
342
|
+
|
343
|
+
# int drmaa_delete_job_template(drmaa_job_template_t *, char *, size_t)
|
344
|
+
def DRMAA.delete_job_template(jt)
|
345
|
+
err = EC
|
346
|
+
r,r1 = @drmaa_delete_job_template.call(jt.ptr, err, ErrSize)
|
347
|
+
DRMAA.throw(r, r1[1])
|
348
|
+
end
|
349
|
+
|
350
|
+
# int drmaa_get_vector_attribute_names(drmaa_attr_names_t **, char *, size_t)
|
351
|
+
def DRMAA.vector_attributes()
|
352
|
+
err=""
|
353
|
+
(0..100).each { |x| err << " "}
|
354
|
+
jt = FFI::MemoryPointer.new :pointer
|
355
|
+
r = FFI_DRMAA.drmaa_get_vector_attribute_names jt, err, ErrSize
|
356
|
+
r1 = [jt,err,ErrSize]
|
357
|
+
DRMAA.throw(r, r1[1])
|
358
|
+
return DRMAA.get_attr_names(jt)
|
359
|
+
end
|
360
|
+
|
361
|
+
# int drmaa_get_attribute_names(drmaa_attr_names_t **, char *, size_t)
|
362
|
+
def DRMAA.attributes()
|
363
|
+
err=""
|
364
|
+
(0..100).each { |x| err << " "}
|
365
|
+
jt = FFI::MemoryPointer.new :pointer
|
366
|
+
r = FFI_DRMAA.get_attribute_names jt, err, ErrSize
|
367
|
+
r1 = [jt,err,ErrSize]
|
368
|
+
DRMAA.throw(r, r1[1])
|
369
|
+
return DRMAA.get_attr_names(jt)
|
370
|
+
end
|
371
|
+
|
372
|
+
def DRMAA.get_all(ids, nxt, rls)
|
373
|
+
if DRMAA.version < 1.0
|
374
|
+
errno_expect = DRMAA.str2errno("DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE")
|
375
|
+
else
|
376
|
+
errno_expect = DRMAA.str2errno("DRMAA_ERRNO_NO_MORE_ELEMENTS")
|
377
|
+
end
|
378
|
+
# STDERR.puts "get_all(1)"
|
379
|
+
values = Array.new
|
380
|
+
ret = 0
|
381
|
+
while ret != errno_expect do
|
382
|
+
# STDERR.puts "get_all(2) " + DRMAA.errno2str(ret)
|
383
|
+
err=" " * ErrSize
|
384
|
+
jobid=" " * ErrSize
|
385
|
+
r = FFI_DRMAA.send(nxt,ids.get_pointer(0), jobid, ErrSize)
|
386
|
+
jobid = jobid.unpack('Z*')[0]
|
387
|
+
# unpack null-terminated string , return first value
|
388
|
+
r1 = [ids.get_pointer(0),jobid,ErrSize]
|
389
|
+
|
390
|
+
if r != errno_expect
|
391
|
+
DRMAA.throw(r, "unexpected error")
|
392
|
+
values.push(r1[1])
|
393
|
+
# puts "get_all(3) " + DRMAA.errno2str(r)
|
394
|
+
end
|
395
|
+
ret = r
|
396
|
+
end
|
397
|
+
# puts "get_all(4)"
|
398
|
+
FFI_DRMAA.send(rls,ids.get_pointer(0))
|
399
|
+
return values
|
400
|
+
end
|
401
|
+
|
402
|
+
# int drmaa_get_next_job_id(drmaa_job_ids_t*, char *, size_t )
|
403
|
+
# void drmaa_release_job_ids(drmaa_job_ids_t*)
|
404
|
+
def DRMAA.get_job_ids(ids)
|
405
|
+
return DRMAA.get_all(ids, :drmaa_get_next_job_id, :drmaa_release_job_ids)
|
406
|
+
end
|
407
|
+
|
408
|
+
|
409
|
+
# int drmaa_get_next_attr_name(drmaa_attr_names_t*, char *, size_t )
|
410
|
+
# void drmaa_release_attr_names(drmaa_attr_names_t*)
|
411
|
+
def DRMAA.get_attr_names(names)
|
412
|
+
return DRMAA.get_all(names, :drmaa_get_next_attr_name, :drmaa_release_attr_names)
|
413
|
+
end
|
414
|
+
|
415
|
+
# int drmaa_get_next_attr_value(drmaa_attr_values_t*, char *, size_t )
|
416
|
+
# void drmaa_release_attr_values(drmaa_attr_values_t*)
|
417
|
+
def DRMAA.get_attr_values(ids)
|
418
|
+
return DRMAA.get_all(ids, :drmaa_get_next_attr_value, :drmaa_release_attr_values)
|
419
|
+
end
|
420
|
+
|
421
|
+
# int drmaa_wifexited(int *, int, char *, size_t)
|
422
|
+
def DRMAA.wifexited(stat)
|
423
|
+
return DRMAA.wif(stat, :drmaa_wifexited)
|
424
|
+
end
|
425
|
+
|
426
|
+
# int drmaa_wifsignaled(int *, int, char *, size_t)
|
427
|
+
def DRMAA.wifsignaled(stat)
|
428
|
+
return DRMAA.wif(stat, :drmaa_wifsignaled)
|
429
|
+
end
|
430
|
+
|
431
|
+
# int drmaa_wifaborted(int *, int , char *, size_t)
|
432
|
+
def DRMAA.wifaborted(stat)
|
433
|
+
return DRMAA.wif(stat, :drmaa_wifaborted)
|
434
|
+
end
|
435
|
+
|
436
|
+
# int drmaa_wcoredump(int *, int , char *, size_t)
|
437
|
+
def DRMAA.wcoredump(stat)
|
438
|
+
return DRMAA.wif(stat, :drmaa_wcoredump)
|
439
|
+
end
|
440
|
+
|
441
|
+
def DRMAA.wif(stat, method)
|
442
|
+
err = " " * ErrSize
|
443
|
+
intp = FFI::MemoryPointer.new(:int,4)
|
444
|
+
r = FFI_DRMAA.send(method, intp, stat, err, ErrSize)
|
445
|
+
r1 = [intp, stat, err, ErrSize]
|
446
|
+
DRMAA.throw(r, r1[2])
|
447
|
+
boo = r1[0].read_int
|
448
|
+
if boo == 0
|
449
|
+
return false
|
450
|
+
else
|
451
|
+
return true
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
455
|
+
# int drmaa_wexitstatus(int *, int, char *, size_t)
|
456
|
+
def DRMAA.wexitstatus(stat)
|
457
|
+
err = " " * ErrSize
|
458
|
+
ret = FFI::MemoryPointer.new(:int,4)
|
459
|
+
r = FFI_DRMAA.drmaa_wexitstatus(ret, stat, err, ErrSize)
|
460
|
+
r1 = [ret, stat, err, ErrSize]
|
461
|
+
DRMAA.throw(r, r1[2])
|
462
|
+
return r1[0].read_int
|
463
|
+
end
|
464
|
+
|
465
|
+
# int drmaa_wtermsig(char *signal, size_t signal_len, int stat, char *error_diagnosis, size_t error_diag_len);
|
466
|
+
def DRMAA.wtermsig(stat)
|
467
|
+
err = " " * ErrSize
|
468
|
+
signal = " " * ErrSize
|
469
|
+
r = FFI_DRMAA.drmaa_wtermsig(signal, ErrSize, stat, err, ErrSize)
|
470
|
+
r1 = [signal, ErrSize, stat, err, ErrSize]
|
471
|
+
DRMAA.throw(r, r1[3])
|
472
|
+
return r1[0]
|
473
|
+
end
|
474
|
+
|
475
|
+
# int drmaa_wait(const char *, char *, size_t , int *, signed long ,
|
476
|
+
# drmaa_attr_values_t **, char *, size_t );
|
477
|
+
def DRMAA.wait(jobid, timeout)
|
478
|
+
errno_timeout = DRMAA.str2errno("DRMAA_ERRNO_EXIT_TIMEOUT")
|
479
|
+
errno_no_rusage = DRMAA.str2errno("DRMAA_ERRNO_NO_RUSAGE")
|
480
|
+
err = " " * ErrSize
|
481
|
+
waited = " " * WaitSize
|
482
|
+
stat = FFI::MemoryPointer.new(:int,4)
|
483
|
+
usage = FFI::MemoryPointer.new :pointer, 1
|
484
|
+
|
485
|
+
r = FFI_DRMAA.drmaa_wait jobid, waited, WaitSize, stat, timeout, usage, err, ErrSize
|
486
|
+
r1 = [jobid, waited, WaitSize, stat, timeout, usage, err, ErrSize]
|
487
|
+
# getting null's at end of string
|
488
|
+
waited.delete! "\000"
|
489
|
+
waited.strip!
|
490
|
+
|
491
|
+
return nil if r == errno_timeout
|
492
|
+
if r != errno_no_rusage
|
493
|
+
DRMAA.throw(r, r1[6])
|
494
|
+
return JobInfo.new(r1[1], r1[3], usage)
|
495
|
+
else
|
496
|
+
return JobInfo.new(r1[1], r1[3])
|
497
|
+
end
|
498
|
+
end
|
499
|
+
|
500
|
+
# int drmaa_run_bulk_jobs(drmaa_job_ids_t **, const drmaa_job_template_t *jt,
|
501
|
+
# int, int, int, char *, size_t)
|
502
|
+
def DRMAA.run_bulk_jobs(jt, first, last, incr)
|
503
|
+
err = " " * ErrSize
|
504
|
+
#strptrs = []
|
505
|
+
#numJobs = (last - first + 1) / incr
|
506
|
+
#numJobs.times {|i| strptrs << FFI::MemoryPointer.from_string(i) }
|
507
|
+
#strptrs << nil
|
508
|
+
#ids = FFI::MemoryPointer.new(:pointer,strptrs.length)
|
509
|
+
#strptrs.each_with_index do |p,i|
|
510
|
+
# ids[i].put_pointer(0, p)
|
511
|
+
#end
|
512
|
+
ids = FFI::MemoryPointer.new :pointer
|
513
|
+
r = FFI_DRMAA.drmaa_run_bulk_jobs(ids, jt.get_pointer(0), first, last, incr, err, ErrSize)
|
514
|
+
r1 = [ids, jt, first, last, incr, err, ErrSize]
|
515
|
+
DRMAA.throw(r, r1[5])
|
516
|
+
return DRMAA.get_job_ids(ids)
|
517
|
+
end
|
518
|
+
|
519
|
+
# int drmaa_run_job(char *, size_t, const drmaa_job_template_t *, char *, size_t)
|
520
|
+
def DRMAA.run_job(jt)
|
521
|
+
err=" " * ErrSize
|
522
|
+
jobid=" " * ErrSize
|
523
|
+
r = FFI_DRMAA.drmaa_run_job jobid, ErrSize, jt.get_pointer(0), err, ErrSize
|
524
|
+
r1 = [jobid,ErrSize,jt.get_pointer(0), err, ErrSize]
|
525
|
+
jobid.delete! "\000"
|
526
|
+
jobid.strip!
|
527
|
+
|
528
|
+
DRMAA.throw(r, r1[3])
|
529
|
+
return r1[0]
|
530
|
+
end
|
531
|
+
|
532
|
+
# int drmaa_set_attribute(drmaa_job_template_t *, const char *, const char *, char *, size_t)
|
533
|
+
def DRMAA.set_attribute(jt, name, value)
|
534
|
+
err=" " * ErrSize
|
535
|
+
r = FFI_DRMAA.drmaa_set_attribute jt.get_pointer(0), name, value, err, ErrSize
|
536
|
+
r1 = [jt.get_pointer(0),name,value,err,ErrSize]
|
537
|
+
DRMAA.throw(r, r1[3])
|
538
|
+
end
|
539
|
+
|
540
|
+
# int drmaa_set_vector_attribute(drmaa_job_template_t *, const char *,
|
541
|
+
# const char *value[], char *, size_t)
|
542
|
+
def DRMAA.set_vector_attribute(jt, name, ary)
|
543
|
+
err=" " * ErrSize
|
544
|
+
ary.flatten!
|
545
|
+
|
546
|
+
strptrs = []
|
547
|
+
ary.each { |x| strptrs << FFI::MemoryPointer.from_string(x) }
|
548
|
+
strptrs << nil
|
549
|
+
|
550
|
+
argv = FFI::MemoryPointer.new(:pointer,strptrs.length)
|
551
|
+
strptrs.each_with_index do |p,i|
|
552
|
+
argv[i].put_pointer(0, p)
|
553
|
+
end
|
554
|
+
|
555
|
+
r = FFI_DRMAA.drmaa_set_vector_attribute jt.get_pointer(0), name, argv, err, ErrSize
|
556
|
+
r1 = [jt.get_pointer(0),name, argv, err, ErrSize]
|
557
|
+
DRMAA.throw(r, r1[3])
|
558
|
+
end
|
559
|
+
|
560
|
+
# int drmaa_get_attribute(drmaa_job_template_t *, const char *, char *,
|
561
|
+
# size_t , char *, size_t)
|
562
|
+
def DRMAA.get_attribute(jt, name)
|
563
|
+
err = " " * ErrSize
|
564
|
+
value = " " * ErrSize
|
565
|
+
r = FFI_DRMAA.drmaa_get_attribute jt.get_pointer(0), name, value, ErrSize, err, ErrSize
|
566
|
+
value = value.unpack('Z*')[0]
|
567
|
+
# unpack null-terminated string , return first value
|
568
|
+
r1 = [jt.get_pointer(0), name, value, ErrSize, err, ErrSize]
|
569
|
+
DRMAA.throw(r, r1[3])
|
570
|
+
return r1[2]
|
571
|
+
end
|
572
|
+
|
573
|
+
# int drmaa_get_vector_attribute(drmaa_job_template_t *, const char *,
|
574
|
+
# drmaa_attr_values_t **, char *, size_t )
|
575
|
+
def DRMAA.get_vector_attribute(jt, name)
|
576
|
+
err=" " * ErrSize
|
577
|
+
attr = FFI::MemoryPointer.new :pointer
|
578
|
+
r = FFI_DRMAA.drmaa_get_vector_attribute jt.get_pointer(0), name, attr, err, ErrSize
|
579
|
+
r1 = [jt.get_pointer(0), name, attr, err, ErrSize]
|
580
|
+
DRMAA.throw(r, r1[3])
|
581
|
+
|
582
|
+
# Original author had a method called "drmaa_get_vector_attribute" that did the same thing as this
|
583
|
+
return DRMAA.get_attr_values(attr)
|
584
|
+
end
|
585
|
+
|
586
|
+
# int drmaa_synchronize(const char *job_ids[], signed long timeout, int dispose, char *, size_t)
|
587
|
+
def DRMAA.synchronize(jobs, timeout, dispose)
|
588
|
+
err = " " * ErrSize
|
589
|
+
if dispose == false
|
590
|
+
disp = 0
|
591
|
+
else
|
592
|
+
disp = 1
|
593
|
+
end
|
594
|
+
errno_timeout = DRMAA.str2errno("DRMAA_ERRNO_EXIT_TIMEOUT")
|
595
|
+
jobs.flatten!
|
596
|
+
strptrs = []
|
597
|
+
jobs.each { |x| strptrs << FFI::MemoryPointer.from_string(x) }
|
598
|
+
strptrs << nil
|
599
|
+
job_ids = FFI::MemoryPointer.new(:pointer,strptrs.length)
|
600
|
+
strptrs.each_with_index do |p,i|
|
601
|
+
job_ids[i].put_pointer(0, p)
|
602
|
+
end
|
603
|
+
r = FFI_DRMAA.drmaa_synchronize job_ids, timeout, disp, err, ErrSize
|
604
|
+
r1 = [job_ids, timeout, disp, err, ErrSize]
|
605
|
+
if r == errno_timeout
|
606
|
+
return false
|
607
|
+
else
|
608
|
+
DRMAA.throw(r, r1[3])
|
609
|
+
return true
|
610
|
+
end
|
611
|
+
end
|
612
|
+
|
613
|
+
def DRMAA.throw(r, diag)
|
614
|
+
return if r == 0
|
615
|
+
s_errno = DRMAA.errno2str(r)
|
616
|
+
case s_errno
|
617
|
+
when "DRMAA_ERRNO_INTERNAL_ERROR"
|
618
|
+
raise DRMAAInternalError, diag
|
619
|
+
when "DRMAA_ERRNO_DRM_COMMUNICATION_FAILURE"
|
620
|
+
raise DRMAACommunicationError, diag
|
621
|
+
when "DRMAA_ERRNO_AUTH_FAILURE"
|
622
|
+
raise DRMAAAuthenticationError, diag
|
623
|
+
when "DRMAA_ERRNO_INVALID_ARGUMENT"
|
624
|
+
raise DRMAAInvalidArgumentError, diag
|
625
|
+
when "DRMAA_ERRNO_NO_ACTIVE_SESSION"
|
626
|
+
raise DRMAANoActiveSessionError, diag
|
627
|
+
when "DRMAA_ERRNO_NO_MEMORY"
|
628
|
+
raise DRMAANoMemoryError, diag
|
629
|
+
when "DRMAA_ERRNO_INVALID_CONTACT_STRING"
|
630
|
+
raise DRMAAInvalidContactError, diag
|
631
|
+
when "DRMAA_ERRNO_DEFAULT_CONTACT_STRING_ERROR"
|
632
|
+
raise DRMAADefaultContactError, diag
|
633
|
+
when "DRMAA_ERRNO_NO_DEFAULT_CONTACT_STRING_SELECTED"
|
634
|
+
raise DRMAANoDefaultContactSelected, diag
|
635
|
+
when "DRMAA_ERRNO_DRMS_INIT_FAILED"
|
636
|
+
raise DRMAASessionInitError, diag
|
637
|
+
when "DRMAA_ERRNO_ALREADY_ACTIVE_SESSION"
|
638
|
+
raise DRMAAAlreadyActiveSessionError, diag
|
639
|
+
when "DRMAA_ERRNO_DRMS_EXIT_ERROR"
|
640
|
+
raise DRMAASessionExitError, diag
|
641
|
+
when "DRMAA_ERRNO_INVALID_ATTRIBUTE_FORMAT"
|
642
|
+
raise DRMAAInvalidAttributeFormatError, diag
|
643
|
+
when "DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE"
|
644
|
+
raise DRMAAInvalidAttributeValueError, diag
|
645
|
+
when "DRMAA_ERRNO_CONFLICTING_ATTRIBUTE_VALUES"
|
646
|
+
raise DRMAAConflictingAttributeValuesError, diag
|
647
|
+
when "DRMAA_ERRNO_TRY_LATER"
|
648
|
+
raise DRMAATryLater, diag
|
649
|
+
when "DRMAA_ERRNO_DENIED_BY_DRM"
|
650
|
+
raise DRMAADeniedError, diag
|
651
|
+
when "DRMAA_ERRNO_INVALID_JOB"
|
652
|
+
raise DRMAAInvalidJobError, diag
|
653
|
+
when "DRMAA_ERRNO_RESUME_INCONSISTENT_STATE"
|
654
|
+
raise DRMAAResumeInconsistent, diag
|
655
|
+
when "DRMAA_ERRNO_SUSPEND_INCONSISTENT_STATE"
|
656
|
+
raise DRMAASuspendInconsistent, diag
|
657
|
+
when "DRMAA_ERRNO_HOLD_INCONSISTENT_STATE"
|
658
|
+
raise DRMAAHoldInconsistent, diag
|
659
|
+
when "DRMAA_ERRNO_RELEASE_INCONSISTENT_STATE"
|
660
|
+
raise DRMAAReleaseInconsistent, diag
|
661
|
+
when "DRMAA_ERRNO_EXIT_TIMEOUT"
|
662
|
+
raise DRMAATimeoutExit, diag
|
663
|
+
when "DRMAA_ERRNO_NO_RUSAGE"
|
664
|
+
raise DRMAANoRusage, diag
|
665
|
+
when "DRMAA_ERRNO_NO_MORE_ELEMENTS"
|
666
|
+
raise DRMAANoMoreElements, diag
|
667
|
+
end
|
668
|
+
end
|
669
|
+
|
670
|
+
public
|
671
|
+
# const char *drmaa_strerror(int drmaa_errno)
|
672
|
+
# DRMAA job info as returned by drmaa_wait()
|
673
|
+
class JobInfo
|
674
|
+
attr_reader :job
|
675
|
+
def initialize(job, stat, rusage = nil)
|
676
|
+
@job = job
|
677
|
+
@stat = stat.read_int
|
678
|
+
@rusage = Hash.new
|
679
|
+
|
680
|
+
if ! rusage.nil?
|
681
|
+
DRMAA.get_attr_values(rusage).each { |u|
|
682
|
+
nv = u.scan(/[^=][^=]*/)
|
683
|
+
@rusage[nv[0]] = nv[1]
|
684
|
+
}
|
685
|
+
end
|
686
|
+
end
|
687
|
+
def wifaborted?
|
688
|
+
DRMAA.wifaborted(@stat)
|
689
|
+
end
|
690
|
+
# true if job finished and exit status available
|
691
|
+
def wifexited?
|
692
|
+
DRMAA.wifexited(@stat)
|
693
|
+
end
|
694
|
+
# true if job was signaled and termination signal available
|
695
|
+
def wifsignaled?
|
696
|
+
DRMAA.wifsignaled(@stat)
|
697
|
+
end
|
698
|
+
# true if job core dumped
|
699
|
+
def wcoredump?
|
700
|
+
DRMAA.wcoredump(@stat)
|
701
|
+
end
|
702
|
+
# returns job exit status
|
703
|
+
def wexitstatus
|
704
|
+
DRMAA.wexitstatus(@stat)
|
705
|
+
end
|
706
|
+
# returns termination signal as string
|
707
|
+
def wtermsig
|
708
|
+
DRMAA.wtermsig(@stat)
|
709
|
+
end
|
710
|
+
# returns resource utilization as string array ('name=value')
|
711
|
+
def rusage
|
712
|
+
return @rusage
|
713
|
+
end
|
714
|
+
end
|
715
|
+
|
716
|
+
# DRMAA Session
|
717
|
+
class Session
|
718
|
+
attr_accessor :retry
|
719
|
+
|
720
|
+
# initialize DRMAA session
|
721
|
+
def initialize(contact = "")
|
722
|
+
DRMAA.init(contact)
|
723
|
+
ObjectSpace.define_finalizer(self, self.method(:finalize).to_proc)
|
724
|
+
@retry = 0
|
725
|
+
end
|
726
|
+
|
727
|
+
# close DRMAA session
|
728
|
+
def finalize(id)
|
729
|
+
# STDERR.puts "... exiting DRMAA"
|
730
|
+
DRMAA.exit
|
731
|
+
end
|
732
|
+
|
733
|
+
# non-zero retry interval causes DRMAA::DRMAATryLater be handled transparently
|
734
|
+
def retry_until
|
735
|
+
if @retry == 0
|
736
|
+
job = yield
|
737
|
+
else
|
738
|
+
begin
|
739
|
+
job = yield
|
740
|
+
rescue DRMAA::DRMAATryLater
|
741
|
+
STDERR.puts "... sleeping"
|
742
|
+
sleep @retry
|
743
|
+
retry
|
744
|
+
end
|
745
|
+
end
|
746
|
+
return job
|
747
|
+
end
|
748
|
+
|
749
|
+
# submits job described by JobTemplate 't' and returns job id as string
|
750
|
+
def run(t)
|
751
|
+
retry_until { DRMAA.run_job(t.ptr) }
|
752
|
+
end
|
753
|
+
|
754
|
+
# submits bulk job described by JobTemplate 't'
|
755
|
+
# and returns an array of job id strings
|
756
|
+
def run_bulk(t, first, last, incr = 1)
|
757
|
+
retry_until { DRMAA.run_bulk_jobs(t.ptr, first, last, incr) }
|
758
|
+
end
|
759
|
+
|
760
|
+
# wait for any job of this session and return JobInfo
|
761
|
+
def wait_any(timeout = -1)
|
762
|
+
DRMAA.wait(ANY_JOB, timeout)
|
763
|
+
end
|
764
|
+
|
765
|
+
# wait for job and return JobInfo
|
766
|
+
def wait(job, timeout = -1)
|
767
|
+
DRMAA.wait(job, timeout)
|
768
|
+
end
|
769
|
+
|
770
|
+
# run block with JobInfo to finish for each waited session job
|
771
|
+
# or return JobInfo array if no block was passed
|
772
|
+
def wait_each(timeout = -1)
|
773
|
+
if ! block_given?
|
774
|
+
ary = Array.new
|
775
|
+
end
|
776
|
+
while true
|
777
|
+
begin
|
778
|
+
info = DRMAA.wait(ANY_JOB, timeout)
|
779
|
+
rescue DRMAAInvalidJobError
|
780
|
+
break
|
781
|
+
end
|
782
|
+
if block_given?
|
783
|
+
yield info
|
784
|
+
else
|
785
|
+
ary << info
|
786
|
+
end
|
787
|
+
end
|
788
|
+
if ! block_given?
|
789
|
+
return ary
|
790
|
+
end
|
791
|
+
end
|
792
|
+
|
793
|
+
# synchronize with all session jobs and dispose any job finish information
|
794
|
+
# returns false in case of a timeout
|
795
|
+
def sync_all!(timeout = -1)
|
796
|
+
DRMAA.synchronize([ ALL_JOBS ], timeout, true)
|
797
|
+
end
|
798
|
+
|
799
|
+
# synchronize with all session jobs
|
800
|
+
# returns false in case of a timeout
|
801
|
+
def sync_all(timeout = -1, dispose = false)
|
802
|
+
DRMAA.synchronize([ ALL_JOBS ], timeout, dispose)
|
803
|
+
end
|
804
|
+
|
805
|
+
# synchronize with specified session jobs and dispose any job finish information
|
806
|
+
# returns false in case of a timeout
|
807
|
+
def sync!(jobs, timeout = -1)
|
808
|
+
DRMAA.synchronize(jobs, timeout, true)
|
809
|
+
end
|
810
|
+
|
811
|
+
# synchronize with specified session jobs
|
812
|
+
# returns false in case of a timeout
|
813
|
+
def sync(jobs, timeout = -1)
|
814
|
+
DRMAA.synchronize(jobs, timeout, false)
|
815
|
+
end
|
816
|
+
|
817
|
+
# suspend specified job or all session jobs
|
818
|
+
def suspend(job = ALL_JOBS)
|
819
|
+
DRMAA.control(job, DRMAA::ACTION_SUSPEND)
|
820
|
+
end
|
821
|
+
|
822
|
+
# resume specified job or all session jobs
|
823
|
+
def resume(job = ALL_JOBS)
|
824
|
+
DRMAA.control(job, DRMAA::ACTION_RESUME)
|
825
|
+
end
|
826
|
+
|
827
|
+
# put specified job or all session jobs in hold state
|
828
|
+
def hold(job = ALL_JOBS)
|
829
|
+
DRMAA.control(job, DRMAA::ACTION_HOLD)
|
830
|
+
end
|
831
|
+
|
832
|
+
# release hold state for specified job or all session jobs
|
833
|
+
def release(job = ALL_JOBS)
|
834
|
+
DRMAA.control(job, DRMAA::ACTION_RELEASE)
|
835
|
+
end
|
836
|
+
|
837
|
+
# terminate specified job or all session jobs
|
838
|
+
def terminate(job = ALL_JOBS)
|
839
|
+
DRMAA.control(job, DRMAA::ACTION_TERMINATE)
|
840
|
+
end
|
841
|
+
|
842
|
+
# get job state
|
843
|
+
def job_ps(job)
|
844
|
+
DRMAA.job_ps(job)
|
845
|
+
end
|
846
|
+
end
|
847
|
+
|
848
|
+
# DRMAA job template as required by drmaa_run_job() and drmaa_run_bulk_jobs()
|
849
|
+
class JobTemplate
|
850
|
+
attr_reader :ptr
|
851
|
+
def initialize
|
852
|
+
@ptr = DRMAA.allocate_job_template
|
853
|
+
ObjectSpace.define_finalizer(self, self.method(:finalize).to_proc)
|
854
|
+
end
|
855
|
+
def finalize(id)
|
856
|
+
# STDERR.puts "... releasing job template"
|
857
|
+
DRMAA.delete_job_template(@ptr)
|
858
|
+
end
|
859
|
+
def set(name, value)
|
860
|
+
DRMAA.set_attribute(@ptr, name, value)
|
861
|
+
end
|
862
|
+
def get(name)
|
863
|
+
DRMAA.get_attribute(@ptr, name)
|
864
|
+
end
|
865
|
+
def vset(name, values)
|
866
|
+
DRMAA.set_vector_attribute(@ptr, name, values)
|
867
|
+
end
|
868
|
+
def vget(name)
|
869
|
+
DRMAA.get_vector_attribute(@ptr, name)
|
870
|
+
end
|
871
|
+
|
872
|
+
# path of the command to be started as a job
|
873
|
+
def command=(cmd)
|
874
|
+
set("drmaa_remote_command", cmd)
|
875
|
+
end
|
876
|
+
def command()
|
877
|
+
return get("drmaa_remote_command")
|
878
|
+
end
|
879
|
+
|
880
|
+
# DRMAA job category
|
881
|
+
def category=(cat)
|
882
|
+
set("drmaa_job_category", cat)
|
883
|
+
end
|
884
|
+
def category()
|
885
|
+
return set("drmaa_job_category")
|
886
|
+
end
|
887
|
+
|
888
|
+
# an opaque string that is interpreted by the DRM
|
889
|
+
# refer to DRM documentation for what can be specified here
|
890
|
+
def native=(nat)
|
891
|
+
set("drmaa_native_specification", nat)
|
892
|
+
end
|
893
|
+
def native()
|
894
|
+
return get("drmaa_native_specification")
|
895
|
+
end
|
896
|
+
|
897
|
+
# jobs stdin path (format "[<hostname>]:<file_path>")
|
898
|
+
def stdin=(host_path)
|
899
|
+
set("drmaa_input_path", host_path)
|
900
|
+
end
|
901
|
+
def stdin()
|
902
|
+
get("drmaa_input_path")
|
903
|
+
end
|
904
|
+
|
905
|
+
# jobs stdout path (format "[<hostname>]:<file_path>")
|
906
|
+
def stdout=(host_path)
|
907
|
+
set("drmaa_output_path", host_path)
|
908
|
+
end
|
909
|
+
def stdout()
|
910
|
+
return get("drmaa_output_path")
|
911
|
+
end
|
912
|
+
|
913
|
+
# jobs stderr path (format "[<hostname>]:<file_path>")
|
914
|
+
def stderr=(host_path)
|
915
|
+
set("drmaa_error_path", host_path)
|
916
|
+
end
|
917
|
+
def stderr()
|
918
|
+
return get("drmaa_error_path")
|
919
|
+
end
|
920
|
+
|
921
|
+
# specifies which files need to be transfered
|
922
|
+
def transfer=(transfer)
|
923
|
+
set("drmaa_transfer_files", transfer)
|
924
|
+
end
|
925
|
+
|
926
|
+
# job name
|
927
|
+
def name=(name)
|
928
|
+
set("drmaa_job_name", name)
|
929
|
+
end
|
930
|
+
def name
|
931
|
+
return get("drmaa_job_name")
|
932
|
+
end
|
933
|
+
|
934
|
+
# jobs working directory
|
935
|
+
def wd=(path)
|
936
|
+
set("drmaa_wd", path)
|
937
|
+
end
|
938
|
+
def wd
|
939
|
+
return get("drmaa_wd")
|
940
|
+
end
|
941
|
+
|
942
|
+
# set jobs start time (format ""[[[[CC]YY/]MM/]DD] hh:mm[:ss] [{-|+}UU:uu])")
|
943
|
+
def start_time=(time)
|
944
|
+
set("drmaa_start_time", time)
|
945
|
+
end
|
946
|
+
|
947
|
+
# jobs can be submitted in hold state and released later-on
|
948
|
+
def hold=(hold)
|
949
|
+
if hold
|
950
|
+
set("drmaa_js_state", "drmaa_hold")
|
951
|
+
else
|
952
|
+
set("drmaa_js_state", "drmaa_active")
|
953
|
+
end
|
954
|
+
end
|
955
|
+
def hold?
|
956
|
+
if get("drmaa_js_state") == "drmaa_hold"
|
957
|
+
true else false end
|
958
|
+
end
|
959
|
+
|
960
|
+
def block_mail=(block)
|
961
|
+
if block
|
962
|
+
set("drmaa_block_email", "1")
|
963
|
+
else
|
964
|
+
set("drmaa_block_email", "0")
|
965
|
+
end
|
966
|
+
end
|
967
|
+
|
968
|
+
# join jobs stdout/stderr
|
969
|
+
def join=(join)
|
970
|
+
if join
|
971
|
+
set("drmaa_join_files", "y")
|
972
|
+
else
|
973
|
+
set("drmaa_join_files", "n")
|
974
|
+
end
|
975
|
+
end
|
976
|
+
def join?()
|
977
|
+
if get("drmaa_join_files") == "y"
|
978
|
+
return true
|
979
|
+
else
|
980
|
+
return false
|
981
|
+
end
|
982
|
+
end
|
983
|
+
|
984
|
+
# job arguments
|
985
|
+
def arg=(argv)
|
986
|
+
vset("drmaa_v_argv", argv)
|
987
|
+
end
|
988
|
+
def arg()
|
989
|
+
return vget("drmaa_v_argv")
|
990
|
+
end
|
991
|
+
|
992
|
+
# job environment
|
993
|
+
def env=(env)
|
994
|
+
vset("drmaa_v_env", env)
|
995
|
+
end
|
996
|
+
|
997
|
+
# mail receipants
|
998
|
+
def mail=(mail)
|
999
|
+
vset("drmaa_v_email", mail)
|
1000
|
+
end
|
1001
|
+
end
|
1002
|
+
end
|