From dtenenba at fhcrc.org  Fri Oct 11 18:33:38 2013
From: dtenenba at fhcrc.org (Dan Tenenbaum)
Date: Fri, 11 Oct 2013 09:33:38 -0700 (PDT)
Subject: [Rd] install.packages() removes package on Windows
In-Reply-To: <5257B902.3020503@jrc.ec.europa.eu>
Message-ID: <1853844370.1279627.1381509218663.JavaMail.root@fhcrc.org>

Thanks Henrik and Jon, that's very helpful.
Dan


----- Original Message -----
> From: "Jon Olav Skoien" <jon.skoien at jrc.ec.europa.eu>
> To: "Henrik Bengtsson" <hb at biostat.ucsf.edu>
> Cc: "Dan Tenenbaum" <dtenenba at fhcrc.org>, "R-devel" <r-devel at r-project.org>
> Sent: Friday, October 11, 2013 1:38:26 AM
> Subject: Re: [Rd] install.packages() removes package on Windows
> 
> 
> 
> On 11-Oct-13 3:15, Henrik Bengtsson wrote:
> > My guess is that the DLL of the already installed XML package is
> > loaded by another R session and that prevents the corresponding DLL
> > file:
> >
> >> path <- system.file("libs", package="XML")
> >> list.files(path, recursive=TRUE, pattern="dll$")
> > [1] "i386/XML.dll" "x64/XML.dll"
> >
> > from being deleted by install.packages() -> unpackPkgZip() ->
> >
> >              ret <- unlink(instPath, recursive=TRUE, force=TRUE)
> >
> > which gives the warnings.  You can verify this by checking that all
> > files but the DLLs are deleted;
> >
> >> path <- system.file("libs", package="XML")
> >> list.files(path, recursive=TRUE)
> >
> > REPRODUCIBLE EXAMPLE:
> >
> > # Download package with native code (=has DLLs)
> > url <-
> > "http://cran.r-project.org/bin/windows/contrib/r-release/png_0.1-6.zip"
> > pkgfile <- basename(url)
> > if (!file_test("-f", pkgfile)) download.file(url, dest=pkgfile,
> > mode="wb")
> >
> > # Setup temporary library
> > if (!file_test("-d", "local-libs")) dir.create("local-libs")
> >
> > # Install to temporary library
> > install.packages(pkgfile, repos=NULL, lib="local-libs")
> >
> > # Record package path
> > path <- system.file(package="png", lib.loc="local-libs")
> >
> > # Launch *another* session that loads the package
> > Rscript <- file.path(R.home("bin"), "Rscript")
> > code <- "library('png', lib.loc='local-libs'); img <-
> > readPNG(system.file('img','Rlogo.png',package='png'));
> > Sys.sleep(60)"
> > code <- "library('png', lib.loc='local-libs'); Sys.sleep(60)"
> > system2(Rscript, args=c("-e", dQuote(code)), wait=FALSE)
> >
> > # Try to install; will fail
> > install.packages(pkgfile, repos=NULL, lib="local-libs")
> > ## Gives:
> > ## package 'png' successfully unpacked and MD5 sums checked
> > ## Warning: cannot remove prior installation of package 'png'
> > files <- list.files(path, recursive=TRUE)
> > print(files)
> > ## [1] "libs/x64/png.dll"
> >
> >
> > SUGGESTION:
> > The problem is that unlink(..., recursive=TRUE) is not atomic,
> > leaving
> > a corrupt installation behind.  A better solution would be to use
> > file.rename() to move the existing installation to a temporary
> > directory/location, move the new installation in place, and then
> > remove the temporary/old one.  The last step will fail if there is
> > a
> > session holding onto the DLL, but at least it does not leave a
> > corrupt
> > installation behind.
> There is an option to avoid the corrupted installations when running
> multiple instances of R:
> options(install.lock = TRUE)
> https://stat.ethz.ch/pipermail/r-help/2010-December/263722.html
> Not sure if this will solve the original problem though.
> 
> Best wishes,
> Jon
> 
> >
> > /Henrik
> >
> > On Thu, Oct 10, 2013 at 4:28 PM, Dan Tenenbaum <dtenenba at fhcrc.org>
> > wrote:
> >> Hi,
> >>
> >> Starting with the XML package installed:
> >>
> >>> "XML" %in% rownames(installed.packages())
> >> [1] TRUE
> >> I ran the following script:
> >>
> >> pkgs <- c("XML")
> >>
> >> for (i in 1:100)
> >> {
> >>      install.packages(pkgs, repos="http://cran.fhcrc.org")
> >>      if (!all(pkgs %in% rownames(installed.packages())))
> >>      {
> >>          print("failed to install pkgs!")
> >>          print(paste("Iteration", i))
> >>          break
> >>      }
> >> }
> >>
> >> And it failed on the third iteration:
> >>
> >> trying URL
> >> 'http://cran.fhcrc.org/bin/windows/contrib/3.0/XML_3.98-1.1.zip'
> >> Content type 'application/zip' length 4287270 bytes (4.1 Mb)
> >> opened URL
> >> downloaded 4.1 Mb
> >>
> >> package 'XML' successfully unpacked and MD5 sums checked
> >>
> >> The downloaded binary packages are in
> >>          C:\Users\biocbuild\AppData\Local\Temp\3\Rtmps7OWh0\downloaded_packages
> >> trying URL
> >> 'http://cran.fhcrc.org/bin/windows/contrib/3.0/XML_3.98-1.1.zip'
> >> Content type 'application/zip' length 4287270 bytes (4.1 Mb)
> >> opened URL
> >> downloaded 4.1 Mb
> >>
> >> package 'XML' successfully unpacked and MD5 sums checked
> >>
> >> The downloaded binary packages are in
> >>          C:\Users\biocbuild\AppData\Local\Temp\3\Rtmps7OWh0\downloaded_packages
> >> trying URL
> >> 'http://cran.fhcrc.org/bin/windows/contrib/3.0/XML_3.98-1.1.zip'
> >> Content type 'application/zip' length 4287270 bytes (4.1 Mb)
> >> opened URL
> >> downloaded 4.1 Mb
> >>
> >> package 'XML' successfully unpacked and MD5 sums checked
> >> Warning: cannot remove prior installation of package 'XML'
> >>
> >> The downloaded binary packages are in
> >>          C:\Users\biocbuild\AppData\Local\Temp\3\Rtmps7OWh0\downloaded_packages
> >> [1] "failed to install pkgs!"
> >> [1] "Iteration 3"
> >>
> >> At this point the XML package is not installed:
> >>
> >>> "XML" %in% rownames(installed.packages())
> >> [1] FALSE
> >>
> >> Any idea what could cause this? There is no virus scanner running.
> >>
> >> I notice the warning about failing to remove prior installation,
> >> but it looks like it removed enough of it so that XML is no
> >> longer installed.
> >>
> >> I realize my script is a little contrived but I'm trying to track
> >> down an elusive problem in our build system that is causing a lot
> >> of grief....this may or may not be the same problem but it's
> >> certainly a problem, so I thought I'd report it.
> >>
> >> Is there a workaround?
> >>
> >> I've only ever seen this issue on Windows.
> >>
> >> I did try running the same script on a vanilla windows machine and
> >> it did not fail. In fact, it does not always fail on the machine
> >> where it fails above. But once is enough to mess us up.
> >>
> >>
> >>> sessionInfo()
> >> R version 3.0.2 (2013-09-25)
> >> Platform: i386-w64-mingw32/i386 (32-bit)
> >>
> >> locale:
> >> [1] LC_COLLATE=English_United States.1252
> >> [2] LC_CTYPE=English_United States.1252
> >> [3] LC_MONETARY=English_United States.1252
> >> [4] LC_NUMERIC=C
> >> [5] LC_TIME=English_United States.1252
> >>
> >> attached base packages:
> >> [1] stats     graphics  grDevices utils     datasets  methods
> >>   base
> >>
> >> Thanks,
> >> Dan
> >>
> >> ______________________________________________
> >> R-devel at r-project.org mailing list
> >> https://stat.ethz.ch/mailman/listinfo/r-devel
> > ______________________________________________
> > R-devel at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> 
> --
> Jon Olav Sk?ien
> Joint Research Centre - European Commission
> Institute for Environment and Sustainability (IES)
> Land Resource Management Unit
> 
> Via Fermi 2749, TP 440,  I-21027 Ispra (VA), ITALY
> 
> jon.skoien at jrc.ec.europa.eu
> Tel:  +39 0332 789205
> 
> Disclaimer: Views expressed in this email are those of the individual
> and do not necessarily represent official views of the European
> Commission.
> 
> 
> 



[Rd] install.packages() removes package on Windows
Dan Tenenbaum