Class: CephRuby::RadosBlockDevice

Inherits:
Object
  • Object
show all
Extended by:
RadosBlockDeviceHelper
Defined in:
lib/ceph-ruby/rados_block_device.rb

Overview

Rados Block Device

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from RadosBlockDeviceHelper

close_handle, ensure_open, log, open?, parse_dst_pool, parse_stat

Constructor Details

#initialize(pool, name) ⇒ RadosBlockDevice

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

#handleObject

Returns the value of attribute handle.



5
6
7
# File 'lib/ceph-ruby/rados_block_device.rb', line 5

def handle
  @handle
end

#nameObject

Returns the value of attribute name.



5
6
7
# File 'lib/ceph-ruby/rados_block_device.rb', line 5

def name
  @name
end

#poolObject

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

#closeObject



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

Raises:

  • (SystemCallError)


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

Raises:

  • (SystemCallError)


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

#destroyObject

Raises:

  • (SystemCallError)


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

Returns:

  • (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

#openObject



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_handleObject

Raises:

  • (SystemCallError)


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

Raises:

  • (SystemCallError)


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

Raises:

  • (SystemCallError)


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

#sizeObject



103
104
105
# File 'lib/ceph-ruby/rados_block_device.rb', line 103

def size
  stat[:size]
end

#statObject

Raises:

  • (SystemCallError)


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

Raises:

  • (SystemCallError)


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