Class: CephRuby::RadosBlockDevice
Overview
Instance Attribute Summary collapse
Instance Method Summary
collapse
close_handle, ensure_open, log, open?, parse_dst_pool, parse_stat
Constructor Details
Returns a new instance of RadosBlockDevice.
9
10
11
12
13
14
15
16
17
18
19
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 9
def initialize(pool, name)
self.pool = pool
self.name = name
if block_given?
begin
yield(self)
ensure
close
end
end
end
|
Instance Attribute Details
#handle ⇒ Object
Returns the value of attribute handle.
5
6
7
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 5
def handle
@handle
end
|
#name ⇒ Object
Returns the value of attribute name.
5
6
7
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 5
def name
@name
end
|
#pool ⇒ Object
Returns the value of attribute pool.
5
6
7
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 5
def pool
@pool
end
|
Instance Method Details
#close ⇒ Object
50
51
52
53
54
55
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 50
def close
return unless open?
log('close')
RadosBlockDevice.close_handle(handle)
self.handle = nil
end
|
#copy_to(dst_name, dst_pool = nil) ⇒ Object
107
108
109
110
111
112
113
114
115
116
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 107
def copy_to(dst_name, dst_pool = nil)
ensure_open
dst_pool = parse_dst(dst, pool)
dst_pool_name = dst_pool.name
log("copy_to #{dst_pool_name}/#{dst_name}")
ret = Lib::Rbd.rbd_copy(handle, dst_pool.handle, dst_name)
raise SystemCallError.new("copy of '#{name}' to "\
"'#{dst_pool_name}/#{dst_name}' failed",
-ret) if ret < 0
end
|
#create(size, features = 0, order = 26) ⇒ Object
29
30
31
32
33
34
35
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 29
def create(size, features = 0, order = 26)
log("create size #{size}, features #{features}, order #{order}")
order_p = FFI::MemoryPointer.new(:int)
order_p.put_int(0, order)
ret = Lib::Rbd.rbd_create2(pool.handle, name, size, features, order_p)
raise SystemCallError.new("creation of '#{name}' failed", -ret) if ret < 0
end
|
#destroy ⇒ Object
57
58
59
60
61
62
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 57
def destroy
close if open?
log('destroy')
ret = Lib::Rbd.rbd_remove(pool.handle, name)
raise SystemCallError.new("destroy of '#{name}' failed", -ret) if ret < 0
end
|
#exists? ⇒ Boolean
21
22
23
24
25
26
27
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 21
def exists?
log('exists?')
RadosBlockDevice.close_handle(open_handle)
rescue SystemCallError => e
return false if e.errno == -Errno::ENOENT::Errno
raise
end
|
#open ⇒ Object
37
38
39
40
41
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 37
def open
return if open?
log('open')
self.handle = open_handle
end
|
#open_handle ⇒ Object
43
44
45
46
47
48
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 43
def open_handle
handle_p = FFI::MemoryPointer.new(:pointer)
ret = Lib::Rbd.rbd_open(pool.handle, name, handle_p, nil)
raise SystemCallError.new("open of '#{name}' failed", -ret) if ret < 0
handle_p.get_pointer(0)
end
|
#read(offset, size) ⇒ Object
75
76
77
78
79
80
81
82
83
84
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 75
def read(offset, size)
ensure_open
log("read offset #{offset}, size #{size}")
data_p = FFI::MemoryPointer.new(:char, size)
ret = Lib::Rbd.rbd_read(handle, offset, size, data_p)
raise SystemCallError.new("read of #{size} bytes from "\
"'#{name}' at #{offset} failed",
-ret) if ret < 0
data_p.get_bytes(0, ret)
end
|
#resize(size) ⇒ Object
95
96
97
98
99
100
101
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 95
def resize(size)
ensure_open
log("resize size #{size}")
ret = Lib::Rbd.rbd_resize(handle, size)
raise SystemCallError.new("resize of '#{name}' to #{size} failed",
-ret) if ret < 0
end
|
#size ⇒ Object
103
104
105
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 103
def size
stat[:size]
end
|
#stat ⇒ Object
86
87
88
89
90
91
92
93
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 86
def stat
ensure_open
log('stat')
stat = Lib::Rbd::StatStruct.new
ret = Lib::Rbd.rbd_stat(handle, stat, stat.size)
raise SystemCallError.new("stat of '#{name}' failed", -ret) if ret < 0
RadosBlockDevice.parse_stat(stat)
end
|
#write(offset, data) ⇒ Object
64
65
66
67
68
69
70
71
72
73
|
# File 'lib/ceph-ruby/rados_block_device.rb', line 64
def write(offset, data)
ensure_open
size = data.bytesize
log("write offset #{offset}, size #{size}")
ret = Lib::Rbd.rbd_write(handle, offset, size, data)
raise SystemCallError.new("write of #{size} bytes to '#{name}' "\
"at #{offset} failed", -ret) if ret < 0
raise Errno::EIO, "wrote only #{ret} of #{size} bytes to "\
"'#{name}' at #{offset}" if ret < size
end
|