0.01
No commit activity in last 3 years
No release in over 3 years
Ruby bindings for libgfapi (GlusterFS API)
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

~> 1.5
>= 0
>= 0

Runtime

~> 1.9
 Project Readme

libgfapi-ruby

Ruby bindings for libgfapi (GlusterFS API).

Gem Version Code Climate Dependency Status

Installation

Add this line to your application's Gemfile:

gem 'libgfapi-ruby'

And then execute:

$ bundle

Or install it yourself as:

$ gem install libgfapi-ruby

Usage

require 'glusterfs'

# Create virtual mount
volume = GlusterFS::Volume.new('my_volume')
volume.mount('1.2.3.4')

# Create a new directory
dir = GlusterFS::Directory.new(volume, '/some_dir')
dir.create

# Delete a directory
dir = GlusterFS::Directory.new(volume, '/some_dir')
dir.delete
# or
volume.delete_dir('/some_dir')

# Create a file from string or bytes
file = GlusterFS::File.new(volume, '/gfs/file/path')
size = file.write(data)
puts "Written #{size} bytes"

# Copy an existing file to gluster
existing_file = File.open('/path/to/file')
file = GlusterFS::File.new(volume, '/gfs/file/path')
size = file.write_file(existing_file)
puts "Written #{size} bytes"

# Read a file
file = GlusterFS::File.new(volume, '/gfs/file/path')
contents = file.read

# Read a file into a Tempfile
file = GlusterFS::File.new(volume, '/gfs/file/path')
tempfile = file.read_file
puts "Tempfile path: #{tempfile.path}"

# Delete a file
file = GlusterFS::File.new(volume, '/gfs/file/path')
file.delete
# or
volume.delete_file('/gfs/file/path')

# Unmount virtual mount
volume.unmount

Troubleshooting

  • If volume mount fails, you may need to set volume option to allow insecure RPC (rpc-auth-allow-insecure on).
  • If you get a SEGFAULT, it most likely means you're trying to do something without checking if it's possible, i.e.:
    1. Create a directory /foo/bar while /foo does not exist.
    2. Write a file /foo/bar/baz.txt while /foo/bar directory does not exit.

Running Specs

Run specs with rake spec. However, you need glusterfs-server running somewhere, and a test mount. If you have it in the computer you want to run your tests at (Vagrant works fine), you can do this:

  1. Add 127.0.0.1 distfs to /etc/hosts
  2. Run gluster volume create dist-volume distfs:/dist1 force
  3. Run gluster volume start dist-volume
  4. Run rake spec

Another option - use existing cluster, set following env variables before running tests:

export GFS_VOLUME='volume-name'
export GFS_SERVER_HOST='1.2.3.4'
export GFS_SERVER_PORT=24007
rake spec

Performance

There is performance spec: spec/glusterfs/stress/performance_spec.rb. You can edit values at spec/spec_helper.rb or provide ENV variables to run it on your system. Here's how 1000 iterations of create/delete directories with various file sizes looks like:

# 5 Kb files
Native FS Time:  1000 iterations:  0.1400 sec
Mounted FS Time: 1000 iterations: 44.0874 sec
GFS API Time:    1000 iterations: 42.4865 sec

# 70 Kb files
Native FS Time:  1000 iterations:  0.6270 sec
Mounted FS Time: 1000 iterations: 79.2414 sec
GFS API Time:    1000 iterations: 46.4481 sec

# 5 Mb files
Native FS Time:  1000 iterations:   6.1057 sec
Mounted FS Time: 1000 iterations:  94.8507 sec
GFS API Time:    1000 iterations: 118.8812 sec

Tests were run on CentOS with Intel(R) Xeon(R) CPU E5-2407 0 @ 2.20GHz, 128GB RAM, with following GlusterFS Volume configuration:

Volume Name: dist-volume
Type: Replicate
Volume ID: <skipped>
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: server1:/var/lib/gfs/dist-volume
Brick2: server2:/var/lib/gfs/dist-volume
Options Reconfigured:
server.allow-insecure: on
features.worm: disable
network.frame-timeout: 10
diagnostics.latency-measurement: on
performance.cache-size: 1024MB
cluster.data-self-heal-algorithm: full
nfs.disable: yes
performance.write-behind-window-size: 128MB
performance.cache-refresh-timeout: 10

TODO

Major things missing:

  • Directory listing / traversal

Known issues

GlusterFS::Volume.mount / unmount leaks memory.

Contributing

  1. Fork it ( http://github.com/spajus/libgfapi-ruby/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request