From: nobu@... Date: 2014-08-26T08:13:00+00:00 Subject: [ruby-core:64561] [ruby-trunk - Bug #10153] [Closed] File.open block does not throw "No space left on device (Errno::ENOSPC)" if the data fits the buffer of IO.write Issue #10153 has been updated by Nobuyoshi Nakada. Status changed from Assigned to Closed % Done changed from 0 to 100 Applied in changeset r47288. ---------- io.c: do not swallow exceptions at end of block * io.c (io_close): ignore only "closed stream" IOError and NoMethodError, do not swallow other exceptions at the end of block. [ruby-core:64463] [Bug #10153] ---------------------------------------- Bug #10153: File.open block does not throw "No space left on device (Errno::ENOSPC)" if the data fits the buffer of IO.write https://bugs.ruby-lang.org/issues/10153#change-48488 * Author: Marvin Reyes * Status: Closed * Priority: Normal * Assignee: Yukihiro Matsumoto * Category: core * Target version: current: 2.2.0 * ruby -v: ruby 1.9.3p484 (2013-11-22) [x86_64-linux] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- When writing to file in disk using File.open with a block as an argument, if the diskspace is full and IO.write does not flush right away, the block just exits successfully instead of throwing Errno:ENOSPC. Setup: Drive partition needs to be full Eg. of a write that will succeed normally with no exception given that the drive is full (this means that the expected failure is being swallowed) ~~~ File.open('/full_drive/test.txt','wb') do |file| file.write("test") end #This will complete normally because the "test" data does not get flushed #This will leave a 0kb file on the disk ~~~ Eg. force a flush to see the error ~~~ File.open('/full_drive/test.txt','wb') do |file| file.write("test") file.flush end #This will throw Errno::ENOSPC #This will leave a 0kb file on the disk ~~~ Eg. write a large enough data that file.write will flush by itself (most likely it hits the buffer cap) ~~~ fills = '1'*1048576 File.open('/full_drive/test.txt','wb') do |file| file.write(fills) end #This will throw Errno::ENOSPC #This will leave a 0kb file on the disk ~~~ Eg. When not using File.open block argument and closing the IO with an ensure block ~~~ begin io = File.open('/full_drive/test.txt', 'wb') io.write("test") ensure io.close end #This will throw Errno::ENOSPC #This will leave a 0kb file on the disk ~~~ Currently tested in RHEL5. Notes: - I've encountered this in ruby-1.9.2 - I've tested this with ruby-2.1.2 - I'm not sure if the issue is because of File.open usage of c-extension rb_ensure or io_close. reference: (http://ruby-doc.org/core-1.9.3/File.html#method-c-open) -- https://bugs.ruby-lang.org/