Project

General

Profile

Actions

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

Added by butching314 (Marvin Reyes) over 9 years ago. Updated over 9 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 1.9.3p484 (2013-11-22) [x86_64-linux]
[ruby-core:64463]

Description

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:


Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #13405: IO#close raises "stream closed"ClosedActions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0