Class: CephRuby::RadosObject

Inherits:
Object
  • Object
show all
Defined in:
lib/ceph-ruby/rados_object.rb

Overview

An Object in Ceph

Direct Known Subclasses

RadosAIOObject

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(pool, name) {|_self| ... } ⇒ RadosObject

Returns a new instance of RadosObject.

Yields:

  • (_self)

Yield Parameters:



6
7
8
9
10
# File 'lib/ceph-ruby/rados_object.rb', line 6

def initialize(pool, name)
  self.pool = pool
  self.name = name
  yield(self) if block_given?
end

Instance Attribute Details

#nameObject

Returns the value of attribute name.



4
5
6
# File 'lib/ceph-ruby/rados_object.rb', line 4

def name
  @name
end

#poolObject

Returns the value of attribute pool.



4
5
6
# File 'lib/ceph-ruby/rados_object.rb', line 4

def pool
  @pool
end

Class Method Details

.stat_hash(size_p, mtime_p) ⇒ Object



83
84
85
86
87
88
# File 'lib/ceph-ruby/rados_object.rb', line 83

def stat_hash(size_p, mtime_p)
  {
    size: size_p.get_uint64(0),
    mtime: Time.at(mtime_p.get_uint64(0))
  }
end

Instance Method Details

#<=>(other) ⇒ Object



107
108
109
110
111
# File 'lib/ceph-ruby/rados_object.rb', line 107

def <=>(other)
  pool_check = pool <=> other.pool
  return pool_check unless pool_check == 0
  other.name <=> name
end

#append(data) ⇒ Object

Raises:

  • (SystemCallError)


36
37
38
39
40
41
42
# File 'lib/ceph-ruby/rados_object.rb', line 36

def append(data)
  size = data.bytesize
  log("append #{size}B")
  ret = Lib::Rados.rados_append(pool.handle, name, data, size)
  raise SystemCallError.new("appendment of #{size} bytes to '#{name}'"\
                            ' failed', -ret) if ret < 0
end

#destroyObject

Raises:

  • (SystemCallError)


60
61
62
63
64
# File 'lib/ceph-ruby/rados_object.rb', line 60

def destroy
  log('destroy')
  ret = Lib::Rados.rados_remove(pool.handle, name)
  raise SystemCallError.new("destroy of '#{name}' failed", -ret) if ret < 0
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


113
114
115
116
# File 'lib/ceph-ruby/rados_object.rb', line 113

def eql?(other)
  return false unless other.class == self.class
  self == other
end

#exists?Boolean Also known as: exist?

Returns:

  • (Boolean)


12
13
14
15
16
17
18
# File 'lib/ceph-ruby/rados_object.rb', line 12

def exists?
  log('exists?')
  !stat.nil?
rescue SystemCallError => e
  return false if e.errno == Errno::ENOENT::Errno
  raise e
end

#log(message) ⇒ Object

helper methods below



120
121
122
# File 'lib/ceph-ruby/rados_object.rb', line 120

def log(message)
  CephRuby.log("rados object #{pool.name}/#{name} #{message}")
end

#mtimeObject



95
96
97
# File 'lib/ceph-ruby/rados_object.rb', line 95

def mtime
  stat[:mtime]
end

#overwrite(data) ⇒ Object

Raises:

  • (SystemCallError)


20
21
22
23
24
25
26
# File 'lib/ceph-ruby/rados_object.rb', line 20

def overwrite(data)
  size = data.bytesize
  log("overwrite size #{size}")
  ret = Lib::Rados.rados_write_full(pool.handle, name, data, size)
  raise SystemCallError.new("overwrite of #{size} bytes to '#{name}'"\
                            ' failed', -ret) if ret < 0
end

#read(offset, size) ⇒ Object

Raises:

  • (SystemCallError)


46
47
48
49
50
51
52
53
# File 'lib/ceph-ruby/rados_object.rb', line 46

def read(offset, size)
  log("read offset #{offset}, size #{size}")
  data_p = FFI::MemoryPointer.new(:char, size)
  ret = Lib::Rados.rados_read(pool.handle, name, data_p, size, offset)
  raise SystemCallError.new("read of #{size} bytes from '#{name}'"\
                            " at #{offset} failed", -ret) if ret < 0
  data_p.get_bytes(0, ret)
end

#read_fullObject



55
56
57
58
# File 'lib/ceph-ruby/rados_object.rb', line 55

def read_full
  log('read_full')
  read 0, size
end

#resize(size) ⇒ Object

Raises:

  • (SystemCallError)


66
67
68
69
70
71
# File 'lib/ceph-ruby/rados_object.rb', line 66

def resize(size)
  log("resize size #{size}")
  ret = Lib::Rados.rados_trunc(pool.handle, name, size)
  raise SystemCallError.new("resize of '#{name}'"\
                            " to #{size} failed", -ret) if ret < 0
end

#sizeObject



91
92
93
# File 'lib/ceph-ruby/rados_object.rb', line 91

def size
  stat[:size]
end

#statObject

Raises:

  • (SystemCallError)


73
74
75
76
77
78
79
80
# File 'lib/ceph-ruby/rados_object.rb', line 73

def stat
  log('stat')
  size_p = FFI::MemoryPointer.new(:uint64)
  mtime_p = FFI::MemoryPointer.new(:uint64)
  ret = Lib::Rados.rados_stat(pool.handle, name, size_p, mtime_p)
  raise SystemCallError.new("stat of '#{name}' failed", -ret) if ret < 0
  RadosObject.stat_hash(size_p, mtime_p)
end

#write(offset, data) ⇒ Object

Raises:

  • (SystemCallError)


28
29
30
31
32
33
34
# File 'lib/ceph-ruby/rados_object.rb', line 28

def write(offset, data)
  size = data.bytesize
  log("write offset #{offset}, size #{size}")
  ret = Lib::Rados.rados_write(pool.handle, name, data, size, offset)
  raise SystemCallError.new("write of #{size} bytes to '#{name}'"\
                            " at #{offset} failed", -ret) if ret < 0
end

#xattr(name = nil) ⇒ Object



99
100
101
# File 'lib/ceph-ruby/rados_object.rb', line 99

def xattr(name = nil)
  Xattr.new(self, name)
end

#xattr_enumeratorObject



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

def xattr_enumerator
  ::CephRuby::XattrEnumerator.new(self)
end