diff --git a/lib/unleash/backup_file_writer.rb b/lib/unleash/backup_file_writer.rb index 459e901..4c2bde2 100644 --- a/lib/unleash/backup_file_writer.rb +++ b/lib/unleash/backup_file_writer.rb @@ -6,7 +6,7 @@ def self.save!(toggle_data) Unleash.logger.debug "Will save toggles to disk now" backup_file = Unleash.configuration.backup_file - backup_file_tmp = "#{backup_file}.tmp" + backup_file_tmp = "#{backup_file}.tmp-#{Process.pid}" File.open(backup_file_tmp, "w") do |file| file.write(toggle_data) diff --git a/spec/unleash/toggle_fetcher_spec.rb b/spec/unleash/toggle_fetcher_spec.rb index 613c1c0..9238d1d 100644 --- a/spec/unleash/toggle_fetcher_spec.rb +++ b/spec/unleash/toggle_fetcher_spec.rb @@ -65,6 +65,30 @@ backup_file = Unleash.configuration.backup_file expect(File.exist?(backup_file)).to eq(true) end + + # NOTE: this is a frequent issue with Puma (in clustered mode). See Unleash/unleash-ruby-sdk#108 + it 'does not log errors due to concurrent forked processes' do + skip 'Fork not supported on current platform' unless Process.respond_to?(:fork) + + log_file = ->(pid) { File.join(Dir.tmpdir, "#{pid}.log") } + pids = Array.new(10) do + fork do + Unleash.logger = Logger.new(log_file.call(Process.pid)) + expect(Unleash.logger).not_to receive(:error) + described_class.new engine + end + end + + pids.each do |pid| + Process.wait(pid) + process_status = $? # rubocop:disable Style/SpecialGlobalVars + error_log_file = log_file.call(pid) + expect(File.exist?(error_log_file)) + + error_msg = "Process #{pid} failed with errors:\n#{File.read(error_log_file).lines[1..].join}" + expect(process_status).to be_success, error_msg + end + end end end