From 65d362d7f3e87bca426742cccaabc9f421e6fc38 Mon Sep 17 00:00:00 2001 From: Grant Gardner Date: Sat, 26 Oct 2024 23:22:14 +1100 Subject: [PATCH] fix: support alpine linux with musl libc and fuse 3.16 Alpine linux uses musl libc platform which has different macros for device major and minor numbers. Additionally Fuse > 3.12 has ABI changes which mean Fuse 3 on latest Ubuntu and Alpine were broken. Resolves: #26 Resolves: #27 --- .github/scripts/pre_install_alpine.sh | 11 +++ .github/workflows/build.yaml | 46 +++++++++++- .rubocop.yml | 2 +- Vagrantfile | 6 +- lib/ffi/accessors.rb | 7 +- lib/ffi/devt.rb | 40 +++++++++-- lib/ffi/libfuse/adapter/context.rb | 2 +- lib/ffi/libfuse/adapter/debug.rb | 2 +- lib/ffi/libfuse/adapter/fuse2_compat.rb | 14 ++-- lib/ffi/libfuse/adapter/fuse3_support.rb | 14 ++-- lib/ffi/libfuse/adapter/interrupt.rb | 2 +- lib/ffi/libfuse/adapter/pathname.rb | 2 +- lib/ffi/libfuse/adapter/ruby.rb | 2 +- lib/ffi/libfuse/adapter/safe.rb | 2 +- lib/ffi/libfuse/filesystem/virtual_dir.rb | 4 +- lib/ffi/libfuse/filesystem/virtual_file.rb | 2 +- lib/ffi/libfuse/filesystem/virtual_link.rb | 2 +- lib/ffi/libfuse/fuse3.rb | 4 +- lib/ffi/libfuse/fuse_cmdline_opts.rb | 4 +- lib/ffi/libfuse/fuse_loop_config.rb | 82 +++++++++++++++++----- lib/ffi/libfuse/test_helper.rb | 10 ++- lib/ffi/struct_wrapper.rb | 4 +- spec/sample/memory_fs_test.rb | 2 +- spec/sample/no_fs_test.rb | 2 +- 24 files changed, 196 insertions(+), 72 deletions(-) create mode 100755 .github/scripts/pre_install_alpine.sh diff --git a/.github/scripts/pre_install_alpine.sh b/.github/scripts/pre_install_alpine.sh new file mode 100755 index 0000000..57fa8ae --- /dev/null +++ b/.github/scripts/pre_install_alpine.sh @@ -0,0 +1,11 @@ +#!/bin/ash + +echo "PreInstall Alpine Linux for FUSE_PKG=${FUSE_PKG}" + +#sudo chmod 666 /dev/fuse && ls -l /dev/fuse +#sudo chown root:$USER /etc/fuse.conf && ls -l /etc/fuse.conf + +# Build lock file for this platform +if [ ! -f Gemfile.lock ]; then + bundle lock +fi \ No newline at end of file diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d9ce7ef..12141d1 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -15,11 +15,53 @@ on: - "!main" - "!release-please-action" jobs: + build-alpine: + if: ${{ !contains(github.event.head_commit.message, '[no build-alpine]') }} + strategy: + matrix: + fuse_pkg: ['fuse','fuse3'] + runs-on: ubuntu-latest + env: + TERM: color # Pretty spec output + GIT_REF: ${{ inputs.ref || github.ref }} + GIT_BASE_REF: ${{ github.base_ref || 'undefined' }} + BUNDLE_PATH: vendor/bundle.alpine + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ env.GIT_REF }} + - name: Setup Alpine Linux + uses: jirutka/setup-alpine@v1 + with: + packages: > + build-base + ${{ matrix.fuse_pkg }} + ruby + ruby-dev + ruby-bundler + - name: Preinstall + env: + FUSE_PKG: ${{ matrix.fuse_pkg }} + run: .github/scripts/pre_install_alpine.sh + shell: alpine.sh {0} + - name: Cache gems + uses: actions/cache@v4 + with: + path: ${{ env.BUNDLE_PATH }} + key: alpine-ruby-gems${{ hashFiles('**/Gemfile.lock','/etc/os-release') }} + restore-keys: | + alpine-ruby-gems- + - name: Run tests + run: bundle install && bundle exec rake test # only test, no rubocop etc.. + shell: alpine.sh {0} + build: + if: ${{ !contains(github.event.head_commit.message, '[no build]') }} + strategy: matrix: - ruby-version: ['2.7' , '3.0', '3.1', '3.2'] - os: ['ubuntu-latest'] # mac-os when/if Macfuse can be deployed on CI images + ruby-version: ['2.7','3.2','3.3'] + os: ['ubuntu-latest','ubuntu-24.04'] # mac-os when/if Macfuse can be deployed on CI images fuse_pkg: ['fuse','fuse3'] runs-on: ${{ matrix.os }} diff --git a/.rubocop.yml b/.rubocop.yml index 7e6b956..2c95779 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -4,7 +4,7 @@ AllCops: NewCops: enable Exclude: - 'spec/**/*.rb' - - 'vendor/bundle/**/*' + - 'vendor/**/*' Gemspec/DevelopmentDependencies: EnforcedStyle: gemspec diff --git a/Vagrantfile b/Vagrantfile index 2db8c24..c5b9115 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -8,17 +8,17 @@ # backwards compatibility). Please don't change it unless you know what # you're doing. Vagrant.configure('2') do |config| - %w[focal impish].each do |dist| + %w[jammy].each do |dist| %w[fuse fuse3].each do |fuse_ver| config.vm.define "#{fuse_ver}-#{dist}", auto_start: false do |dist_config| dist_config.vm.box = "ubuntu/#{dist}64" dist_config.vm.provision :shell, inline: <<-SHELL apt-get update -y - apt-get install -y gnupg2 gcc make ruby ruby-dev libffi-dev ruby-bundler #{fuse_ver} lib#{fuse_ver}-dev + apt-get install -y gnupg2 gcc make libffi-dev #{fuse_ver} lib#{fuse_ver}-dev SHELL dist_config.vm.provision :shell, path: 'vagrant/install-rvm.sh', args: 'stable', privileged: false # TODO: extract rubies from github workflow - %w[2.7].each do |v| + %w[3.3.5].each do |v| dist_config.vm.provision :shell, path: 'vagrant/install-ruby.sh', args: [v, 'bundler'], privileged: false end dist_config.vm.provision :shell, inline: 'cd /vagrant; bundle install', privileged: false diff --git a/lib/ffi/accessors.rb b/lib/ffi/accessors.rb index 4627be7..f02a623 100644 --- a/lib/ffi/accessors.rb +++ b/lib/ffi/accessors.rb @@ -427,18 +427,13 @@ def ffi_attr_fill(from, writers: self.class.ffi_attr_writers, **args) if from.is_a?(Hash) args.merge!(from) else - include_all = from.is_a?(Stat.class) writers.each do |w| r = w[0..-2] # strip trailing = - send(w, from.send(r)) if from.respond_to?(r, include_all) + send(w, from.public_send(r)) if from.respond_to?(r) end end args.transform_keys! { |k| :"#{k}=" } - if (invalid = args.keys - writers).any? - raise ArgumentError, "Cannot fill #{self.class.name} using #{invalid}" - end - args.each_pair { |k, v| send(k, v) } self end diff --git a/lib/ffi/devt.rb b/lib/ffi/devt.rb index 2d45777..36a8474 100644 --- a/lib/ffi/devt.rb +++ b/lib/ffi/devt.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require 'ffi' - module FFI # Calculate major/minor device numbers for use with mknod etc.. # @see makedev(3) @@ -27,10 +26,13 @@ module Device # @return [Integer] the minor component of dev attach_function :minor, :"#{prefix}minor", [:int], :int rescue FFI::NotFoundError - case Platform::NAME - when 'x86_64-darwin' - # From https://github.com/golang/go/issues/8106 these functions are not defined on Darwin. - class << self + + class << self + # rubocop:disable Naming/MethodParameterName + case RUBY_PLATFORM + when 'x86_64-darwin' + # From https://github.com/golang/go/issues/8106 these functions are not defined on Darwin. + # define major(x) ((int32_t)(((u_int32_t)(x) >> 24) & 0xff)) def major(dev) (dev >> 24) & 0xff @@ -45,9 +47,33 @@ def minor(dev) def makedev(major, minor) (major << 24) | minor end + + when 'x86_64-linux-musl' # eg alpine linux + # #define major(x) \ + # ((unsigned)( (((x)>>31>>1) & 0xfffff000) | (((x)>>8) & 0x00000fff) )) + def major(x) + ((x >> 31 >> 1) & 0xfffff000) | ((x >> 8) & 0x00000fff) + end + + # #define minor(x) \ + # ((unsigned)( (((x)>>12) & 0xffffff00) | ((x) & 0x000000ff) )) + # + def minor(x) + ((x >> 12) & 0xffffff00) | (x & 0x000000ff) + end + + # #define makedev(x,y) ( \ + # (((x)&0xfffff000ULL) << 32) | \ + # (((x)&0x00000fffULL) << 8) | \ + # (((y)&0xffffff00ULL) << 12) | \ + # (((y)&0x000000ffULL)) ) + def makedev(x, y) + ((x & 0xfffff000) << 32) | ((x & 0x00000fff) << 8) | ((y & 0xffffff00) << 12) | (y & 0x000000ff) + end + else + raise end - else - raise + # rubocop:enable Naming/MethodParameterName end end end diff --git a/lib/ffi/libfuse/adapter/context.rb b/lib/ffi/libfuse/adapter/context.rb index 245f6fe..5680e44 100644 --- a/lib/ffi/libfuse/adapter/context.rb +++ b/lib/ffi/libfuse/adapter/context.rb @@ -18,7 +18,7 @@ def fuse_wrappers(*wrappers) ) return wrappers unless defined?(super) - super(*wrappers) + super end module_function diff --git a/lib/ffi/libfuse/adapter/debug.rb b/lib/ffi/libfuse/adapter/debug.rb index ec7e675..6c69487 100644 --- a/lib/ffi/libfuse/adapter/debug.rb +++ b/lib/ffi/libfuse/adapter/debug.rb @@ -41,7 +41,7 @@ def fuse_wrappers(*wrappers) wrappers << proc { |fm, *args, &b| debug_callback(fm, *args, **conf, &b) } if debug? return wrappers unless defined?(super) - super(*wrappers) + super end # @!visibility private diff --git a/lib/ffi/libfuse/adapter/fuse2_compat.rb b/lib/ffi/libfuse/adapter/fuse2_compat.rb index 2abe43c..68a46d6 100644 --- a/lib/ffi/libfuse/adapter/fuse2_compat.rb +++ b/lib/ffi/libfuse/adapter/fuse2_compat.rb @@ -12,27 +12,27 @@ module Prepend if FUSE_MAJOR_VERSION == 2 # @!visibility private def getattr(path, stat, fuse_file_info = nil) - super(path, stat, fuse_file_info) + super end def truncate(path, size, fuse_file_info = nil) - super(path, size, fuse_file_info) + super end def init(fuse_conn_info, fuse_config = nil) - super(fuse_conn_info, fuse_config) + super end def chown(path, uid, gid, fuse_file_info = nil) - super(path, uid, gid, fuse_file_info) + super end def chmod(path, mode, fuse_file_info = nil) - super(path, mode, fuse_file_info) + super end def utimens(path, times, fuse_file_info = nil) - super(path, times, fuse_file_info) + super end def readdir(path, buffer, filler, offset, fuse_file_info, fuse_readdir_flag = 0) @@ -45,7 +45,7 @@ def fuse_respond_to?(fuse_method) # fgetattr and ftruncate already fallback to the respective basic method return false if %i[getdir fgetattr ftruncate].include?(fuse_method) - super(fuse_method) + super end def fuse_options(args) diff --git a/lib/ffi/libfuse/adapter/fuse3_support.rb b/lib/ffi/libfuse/adapter/fuse3_support.rb index 90cabf9..bcf3757 100644 --- a/lib/ffi/libfuse/adapter/fuse3_support.rb +++ b/lib/ffi/libfuse/adapter/fuse3_support.rb @@ -24,24 +24,24 @@ def getattr(*args) fi = args.pop return fgetattr(*args, fi) if fi && fuse_super_respond_to?(:fgetattr) - super(*args) + super end def truncate(*args) fi = args.pop return ftruncate(*args, fi) if fi && fuse_super_respond_to?(:ftruncate) - super(*args) + super end def chown(*args) args.pop - super(*args) + super end def chmod(*args) args.pop - super(*args) + super end # TODO: Fuse3 deprecated flag utime_omit_ok - which meant that UTIME_OMIT and UTIME_NOW are passed through @@ -50,14 +50,14 @@ def chmod(*args) # but there is no way to handle OMIT def utimens(*args) args.pop - super(*args) if defined?(super) + super if defined?(super) end def init(*args) args.pop # TODO: populate FuseConfig with output from fuse_flags/FuseConnInfo where appropriate - super(*args) + super end def readdir(*args, &block) @@ -71,7 +71,7 @@ def readdir(*args, &block) proc { |buf, name, stat, off| a.call(buf, name, stat, off, 0) } end - super(*args, &block) + super end def fuse_respond_to(fuse_callback) diff --git a/lib/ffi/libfuse/adapter/interrupt.rb b/lib/ffi/libfuse/adapter/interrupt.rb index 08f6ed6..c8fbf3e 100644 --- a/lib/ffi/libfuse/adapter/interrupt.rb +++ b/lib/ffi/libfuse/adapter/interrupt.rb @@ -20,7 +20,7 @@ def fuse_wrappers(*wrappers) } return wrappers unless defined?(super) - super(*wrappers) + super end module_function diff --git a/lib/ffi/libfuse/adapter/pathname.rb b/lib/ffi/libfuse/adapter/pathname.rb index 643abd7..2f7e210 100644 --- a/lib/ffi/libfuse/adapter/pathname.rb +++ b/lib/ffi/libfuse/adapter/pathname.rb @@ -15,7 +15,7 @@ def fuse_wrappers(*wrappers) } return wrappers unless defined?(super) - super(*wrappers) + super end end end diff --git a/lib/ffi/libfuse/adapter/ruby.rb b/lib/ffi/libfuse/adapter/ruby.rb index f878a24..d65df8d 100644 --- a/lib/ffi/libfuse/adapter/ruby.rb +++ b/lib/ffi/libfuse/adapter/ruby.rb @@ -338,7 +338,7 @@ def utimens(path, times, *fuse3_args) # Calls super if defined and storing result to protect from GC until {#destroy} def init(*args) - o = super(*args) if fuse_super_respond_to?(:init) + o = super if fuse_super_respond_to?(:init) handles << o if o end diff --git a/lib/ffi/libfuse/adapter/safe.rb b/lib/ffi/libfuse/adapter/safe.rb index 5e517e9..f437e04 100644 --- a/lib/ffi/libfuse/adapter/safe.rb +++ b/lib/ffi/libfuse/adapter/safe.rb @@ -23,7 +23,7 @@ def fuse_wrappers(*wrappers) } return wrappers unless defined?(super) - super(*wrappers) + super end # @return [Integer] the default errno to return for rescued errors. ENOTRECOVERABLE unless overridden diff --git a/lib/ffi/libfuse/filesystem/virtual_dir.rb b/lib/ffi/libfuse/filesystem/virtual_dir.rb index d4cc912..2fd4e40 100644 --- a/lib/ffi/libfuse/filesystem/virtual_dir.rb +++ b/lib/ffi/libfuse/filesystem/virtual_dir.rb @@ -41,7 +41,7 @@ class VirtualDir < VirtualNode def initialize(accounting: Accounting.new) @entries = {} - super(accounting: accounting) + super end # @!endgroup @@ -157,7 +157,7 @@ def create(path, mode = FuseContext.get.mask(0o644), ffi = nil, &file) # TODO: Strictly should understand setgid and sticky bits of this dir's mode when creating new files new_file = file ? file.call(name) : new_file(name) if entry_fuse_respond_to?(new_file, :create) - new_file.public_send(:create, '/', mode, ffi) + new_file.create('/', mode, ffi) else # TODO: generate a sensible device number entry_send(new_file, :mknod, '/', mode, 0) diff --git a/lib/ffi/libfuse/filesystem/virtual_file.rb b/lib/ffi/libfuse/filesystem/virtual_file.rb index 8893f6e..4a871f1 100644 --- a/lib/ffi/libfuse/filesystem/virtual_file.rb +++ b/lib/ffi/libfuse/filesystem/virtual_file.rb @@ -20,7 +20,7 @@ module VirtualFile # Create an empty synthetic file def initialize(accounting: nil) - super(accounting: accounting) + super end # @!group FUSE Callbacks diff --git a/lib/ffi/libfuse/filesystem/virtual_link.rb b/lib/ffi/libfuse/filesystem/virtual_link.rb index ce7b5aa..201904a 100644 --- a/lib/ffi/libfuse/filesystem/virtual_link.rb +++ b/lib/ffi/libfuse/filesystem/virtual_link.rb @@ -12,7 +12,7 @@ module VirtualLink include VirtualNode def initialize(accounting: nil) @target = target - super(accounting: accounting) + super end def readlink(_path, size) diff --git a/lib/ffi/libfuse/fuse3.rb b/lib/ffi/libfuse/fuse3.rb index 249fa4e..61a5ed4 100644 --- a/lib/ffi/libfuse/fuse3.rb +++ b/lib/ffi/libfuse/fuse3.rb @@ -145,8 +145,8 @@ def io private - def native_fuse_loop_mt(max_idle_threads: 10, **_options) - Libfuse.fuse_loop_mt3(@fuse, FuseLoopConfig.new.fill(max_idle_threads: max_idle_threads)) + def native_fuse_loop_mt(**options) + Libfuse.fuse_loop_mt3(@fuse, FuseLoopConfig.create(**options)) end def unmount diff --git a/lib/ffi/libfuse/fuse_cmdline_opts.rb b/lib/ffi/libfuse/fuse_cmdline_opts.rb index aa84279..15557a9 100644 --- a/lib/ffi/libfuse/fuse_cmdline_opts.rb +++ b/lib/ffi/libfuse/fuse_cmdline_opts.rb @@ -31,8 +31,9 @@ class FuseCmdlineOpts < FFI::Struct show_version: :bool_int, show_help: :bool_int, clone_fd: :bool_int, - max_idle_threads: :int + max_idle_threads: :uint } + spec[:max_threads] = :uint if FUSE_MINOR_VERSION >= 12 layout(spec) @@ -40,6 +41,7 @@ class FuseCmdlineOpts < FFI::Struct ffi_attr_reader(*bool.map { |k, _| "#{k}?" }) ffi_attr_reader(:max_idle_threads, :mountpoint) + ffi_attr_reader(:max_threads) if FUSE_MINOR_VERSION >= 12 end end end diff --git a/lib/ffi/libfuse/fuse_loop_config.rb b/lib/ffi/libfuse/fuse_loop_config.rb index 693b18d..4b350b6 100644 --- a/lib/ffi/libfuse/fuse_loop_config.rb +++ b/lib/ffi/libfuse/fuse_loop_config.rb @@ -5,37 +5,87 @@ module FFI module Libfuse - # struct fuse_loop_config { - # int clone_fd; - # unsigned int max_idle_threads; - # }; - # For native fuse_loop_mt only - # @!visibility private class FuseLoopConfig < FFI::Struct include(FFI::Accessors) - layout( - clone_fd: :bool_int, - max_idle_threads: :int - ) - - # @!attribute [rw] clone_fd? + # @!attribute [w] clone_fd? # whether to use separate device fds for each thread (may increase performance) # Unused by ffi-libfuse as we do not call fuse_loop_mt # @return [Boolean] - ffi_attr_accessor(:clone_fd?) - # @!attribute [rw] max_idle_threads + # @!attribute [w] max_idle_threads # The maximum number of available worker threads before they start to get deleted when they become idle. If not # specified, the default is 10. # # Adjusting this has performance implications; a very small number of threads in the pool will cause a lot of # thread creation and deletion overhead and performance may suffer. When set to 0, a new thread will be created # to service every operation. - # + # @deprecated at Fuse 3.12. Use max_threads instead # @return [Integer] the maximum number of threads to leave idle - ffi_attr_accessor(:max_idle_threads) + + # @!attribute [w] max_threads + # @return [Integer] + # @since Fuse 3.12 + + if FUSE_VERSION >= 312 + layout( + version_id: :int, + clone_fd: :bool_int, + max_idle_threads: :uint, + max_threads: :uint + ) + + Libfuse.attach_function :fuse_loop_cfg_create, [], by_ref + Libfuse.attach_function :fuse_loop_cfg_destroy, [:pointer], :void + + ffi_attr_reader(:clone_fd?) + Libfuse.attach_function :fuse_loop_cfg_set_clone_fd, %i[pointer uint], :void + def clone_fd=(bool_val) + Libfuse.fuse_loop_cfg_set_clone_fd(to_ptr, bool_val ? 1 : 0) + end + + ffi_attr_reader(:max_idle_threads) + Libfuse.attach_function :fuse_loop_cfg_set_idle_threads, %i[pointer uint], :uint + def max_idle_threads=(val) + Libfuse.fuse_loop_cfg_set_idle_threads(to_ptr, val) if val + end + + Libfuse.attach_function :fuse_loop_cfg_set_max_threads, %i[pointer uint], :uint + ffi_attr_reader(:max_threads) + def max_threads=(val) + Libfuse.fuse_loop_cfg_set_max_threads(to_ptr, val) if val + end + + class << self + def create(max_idle_threads: nil, max_threads: 10, clone_fd: false, **_) + cfg = Libfuse.fuse_loop_cfg_create + ObjectSpace.define_finalizer(cfg, finalizer(cfg.to_ptr)) + cfg.clone_fd = clone_fd + cfg.max_idle_threads = max_idle_threads if max_idle_threads + cfg.max_threads = max_threads if max_threads + cfg + end + + def finalizer(ptr) + proc { |_| Libfuse.fuse_loop_cfg_destroy(ptr) } + end + end + else + layout( + clone_fd: :bool_int, + max_idle_threads: :uint + ) + + ffi_attr_accessor(:clone_fd?) + ffi_attr_accessor(:max_idle_threads) + + class << self + def create(clone_fd: false, max_idle_threads: 10, **_) + new.fill(max_idle_threads: max_idle_threads, clone_fd: clone_fd) + end + end + end end end end diff --git a/lib/ffi/libfuse/test_helper.rb b/lib/ffi/libfuse/test_helper.rb index b31ca18..a4dc048 100644 --- a/lib/ffi/libfuse/test_helper.rb +++ b/lib/ffi/libfuse/test_helper.rb @@ -73,7 +73,7 @@ def run_filesystem(filesystem, *args, env: {}) return [o, e, s.exitstatus] unless err warn "Errors\n#{e}" unless e.empty? - warn "Output\n#{o}" unless o.empty? Minitest::Assertion, StandardError => e + warn "Output\n#{o}" unless o.empty? raise err end @@ -87,7 +87,7 @@ def unmount(mnt) if mac_fuse? system("diskutil unmount force #{mnt} >/dev/null 2>&1") else - system("fusermount -zu #{mnt} >/dev/null 2>&1") + system("fusermount#{FUSE_MAJOR_VERSION == 3 ? '3' : ''} -zu #{mnt} >/dev/null 2>&1") end end @@ -107,10 +107,8 @@ def mac_fuse? private def open3_filesystem(args, env, filesystem, fsname, mnt) - if defined?(Bundler) - Bundler.with_unbundled_env do - Open3.capture3(env, 'bundle', 'exec', filesystem.to_s, mnt, "-ofsname=#{fsname}", *args, binmode: true) - end + if ENV['BUNDLER_GEMFILE'] + Open3.capture3(env, 'bundle', 'exec', filesystem.to_s, mnt, "-ofsname=#{fsname}", *args, binmode: true) else Open3.capture3(env, filesystem.to_s, mnt, "-ofsname=#{fsname}", *args, binmode: true) end diff --git a/lib/ffi/struct_wrapper.rb b/lib/ffi/struct_wrapper.rb index 2b8d03a..0fd9811 100644 --- a/lib/ffi/struct_wrapper.rb +++ b/lib/ffi/struct_wrapper.rb @@ -27,13 +27,13 @@ def to_native(value, ctx) return Pointer::NULL if value.nil? value = value.native if value.is_a?(StructWrapper) - super(value, ctx) + super end def from_native(value, ctx) return nil if value.null? - native = super(value, ctx) + native = super @wrapper_class.new(native) end end diff --git a/spec/sample/memory_fs_test.rb b/spec/sample/memory_fs_test.rb index d277374..eda8cd6 100644 --- a/spec/sample/memory_fs_test.rb +++ b/spec/sample/memory_fs_test.rb @@ -32,7 +32,7 @@ { name: 'native loop single threaded foreground', args: %w[-f -s -o native]}, { name: 'native loop multi thread foreground', args: %w[-f -o native]}, { name: 'native loop single thread daemonized', args: %w[-s -o native]}, - { name: 'native loop multi thread deamonized', args: %w[-o native], skip_msg: 'TODO: Why does this hang?'}, + { name: 'native loop multi thread daemonized', args: %w[-o native], skip_msg: 'TODO: Why does this hang?'}, { name: 'no_buf', args: %w[-o no_buf]}, ].kw_each do |name:, args:, skip_msg: false| it name do diff --git a/spec/sample/no_fs_test.rb b/spec/sample/no_fs_test.rb index 716188b..d4f769e 100644 --- a/spec/sample/no_fs_test.rb +++ b/spec/sample/no_fs_test.rb @@ -34,7 +34,7 @@ { name: 'native loop single threaded foreground', args: %w[-f -s -o native], stderr: '' }, { name: 'native loop single threaded debug', args: %w[-s -d -o native], stderr: [/:single_thread=>true/,/NoFS.*readdir/,/NoFS: DEBUG enabled/] }, { name: 'native loop multi thread foreground', args: %w[-f -o native], stderr: '' }, - { name: 'native loop single thread daemonized', args: %w[-s -o native], stderr: '' }, + { name: 'native loop single thread daemonized', args: %w[-s -o native], stderr: '', skip_msg: 'TODO: Hangs on FUSE 3.14' }, { name: 'native loop multi thread daemonized', args: %w[-o native], stderr: '', skip_msg: 'TODO: why does this hang?' }, ].kw_each do |name:, args:, stderr:, skip_msg: false| it name do