Full_Name: Michael Bauer
Version: 2.7.0
OS: Solaris 10 (sparc)
Submission from: (NULL) (130.64.21.7)


When running 'make check' on a fresh R 2.7.0 build on Solaris 10 (sparc),
reg-tests-1.R fails consistently because the test directory /tmp/R<random>
cannot be deleted.  The reason for the deletion failure is because the file
system thinks that the directory is still full, as its link count is not 2 -- it
is 5.  The key bit of reg-tests-1.R is:

dd <- c("dir1", "dir2", "dirs", "moredirs")
for(d in dd) dir.create(d)
dir(".")
file.create(file.path(dd, "somefile"))
dir(".", recursive=TRUE)
stopifnot(unlink("dir?") == 1) # not an error
unlink("dir?", recursive = TRUE)
stopifnot(file.exists(dd) == c(FALSE, FALSE, FALSE, TRUE))
unlink("*dir*", recursive = TRUE)
stopifnot(!file.exists(dd))

I've run this code snippet in the R command line.  The initial state of the
directory is:

[EMAIL PROTECTED] mkdir testdir
[EMAIL PROTECTED] cd testdir
[EMAIL PROTECTED] ls -al
total 34
drwx------   2 root          512 Jun 18 16:12 .
drwxrwxrwt  18 root        33280 Jun 18 16:12 ..


After the file.create command, the directory state is:

[EMAIL PROTECTED] ls -al
total 38
drwx------   6 root          512 Jun 18 16:13 .
drwxrwxrwt  19 root        33280 Jun 18 16:13 ..
drwx------   2 root          512 Jun 18 16:13 dir1
drwx------   2 root          512 Jun 18 16:13 dir2
drwx------   2 root          512 Jun 18 16:13 dirs
drwx------   2 root          512 Jun 18 16:13 moredirs
[EMAIL PROTECTED] ls -al *
dir1:
total 2
drwx------   2 root          512 Jun 18 16:13 .
drwx------   6 root          512 Jun 18 16:13 ..
-rw-------   1 root            0 Jun 18 16:13 somefile

dir2:
total 2
drwx------   2 root          512 Jun 18 16:13 .
drwx------   6 root          512 Jun 18 16:13 ..
-rw-------   1 root            0 Jun 18 16:13 somefile

dirs:
total 2
drwx------   2 root          512 Jun 18 16:13 .
drwx------   6 root          512 Jun 18 16:13 ..
-rw-------   1 root            0 Jun 18 16:13 somefile

moredirs:
total 2
drwx------   2 root          512 Jun 18 16:13 .
drwx------   6 root          512 Jun 18 16:13 ..
-rw-------   1 root            0 Jun 18 16:13 somefile


However, immediately after the unlink("dir?") command, the directory state is
incorrect.  Note that in addition to dir1, dir2, and dirs being missing, the
link count on the parent directory is still 6, not 3.

[EMAIL PROTECTED] ls -al
total 35
drwx------   6 root          512 Jun 18 16:13 .
drwxrwxrwt  20 root        33280 Jun 18 16:20 ..
drwx------   2 root          512 Jun 18 16:13 moredirs
[EMAIL PROTECTED] ls -al *
total 2
drwx------   2 root          512 Jun 18 16:13 .
drwx------   6 root          512 Jun 18 16:13 ..
-rw-------   1 root            0 Jun 18 16:13 somefile


Once the rest of the code runs, the directory state is still incorrect, with the
link count on a now-empty directory still being 5 instead of 2:

[EMAIL PROTECTED] ls -al
total 34
drwx------   5 root          512 Jun 18 16:23 .
drwxrwxrwt  20 root        33280 Jun 18 16:20 ..


The directory now cannot be removed, either within R or by hand in the shell:

[EMAIL PROTECTED] cd ..
[EMAIL PROTECTED] rmdir testdir
rmdir: directory "testdir": Directory not empty


The only thing I've found to fix this is unmounting the file system and running
fsck on it.  This finds the mis-deleted directories and fixes the broken link
counts.

I'm not certain if this is a bug in R or in Solaris, though it certainly looks
like a Solaris bug.  I have submitted the bug to both you and Solaris.

I also have truss output from a run of this, which shows R using a mix of
unlink() and unlinkat() for directory removal.  unlink() is the call that
incorrectly removes the directories.  The pertinent bits are:

17500:  unlink("dir1")                                  = 0
17500:  unlink("dir2")                                  = 0
17500:  unlink("dirs")                                  = 0
17500:  unlink("/tmp/RtmpKrefN4/41c6167e")              = 0
17702:  lstat64("/", 0xFFBFF640)                        = 0
17702:  fstatat64(-3041965, "/tmp/RtmpKrefN4", 0xFFBFF5C8, 0x00001000) = 0
17702:  unlinkat(-3041965, "/tmp/RtmpKrefN4", 0x00000000) Err#1 EPERM
[sys_linkd
ir]
17702:  unlinkat(3, "file153e1776", 0x00000000)         = 0
17702:  unlinkat(3, "file47b5546c", 0x00000000)         = 0
17702:  unlinkat(3, "moredirs", 0x00000000)             Err#1 EPERM
[sys_linkdir
]
17702:  fstatat64(3, "moredirs", 0xFFBFF530, 0x00001000) = 0
17702:  openat64(3, "moredirs", O_RDONLY|O_NONBLOCK|O_NOCTTY|O_NOFOLLOW) = 4
17702:  unlinkat(4, "somefile", 0x00000000)             = 0
17702:  unlinkat(3, "moredirs", 0x00000001)             = 0
17702:  unlinkat(-3041965, "/tmp/RtmpKrefN4", 0x00000001) Err#22 EINVAL


I can provide the full truss output if desired.

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to