[ 
https://issues.apache.org/jira/browse/JCR-2596?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Titu Petrea updated JCR-2596:
-----------------------------

    Comment: was deleted

(was: 
- The file "bin-1.tmp" is created (BLOBInTempFile line 51). 
- The TransientFileFactory adds a PhantomReference "A" in its queue. 
- BLOBInTempFile.delete() or dispose() is called, the file "bin-1.tmp" 
is deleted. 
- A new file is created, and also called "bin-1.tmp" is created 
(BLOBInTempFile line 51) 
 (that's possible because File.createTempFile can re-use file names). 
- The TransientFileFactory adds a second PhantomReference "B" in its 
queue, pointing 
 to a different file with the same name. 
- The first (only the first) BLOBInTempFile is no longer referenced. 
- The TransientFileFactory.ReaperThread gets PhantomReference "A" and 
 deletes this file. But the file is still used and referenced ("B"). 

>From http://download.oracle.com/javase/6/docs/api/
"Neither this method nor any of its variants will return the same abstract 
pathname again in the current invocation of the virtual machine."
)

> multiple instances of jackrabbit-standalone cause "file backing binary value 
> not found" from org.apache.jackrabbit.util.TransientFileFactory
> --------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: JCR-2596
>                 URL: https://issues.apache.org/jira/browse/JCR-2596
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>          Components: jackrabbit-jcr-commons
>    Affects Versions: 2.0.0
>         Environment: any
>            Reporter: Adrien Lamoureux
>
> running 2 or more instances of jackrabbit-standalone causes file deletions in 
> the temporary folder used by another standalone instance. (when garbage 
> collected)
> To reproduce, run 2 or more instances, create files in each, and then stop 
> one of them and attempt read cached files by the other. The one that stopped 
> will garbage collect files used by the other. This may be hard to reproduce, 
> as it doesn't seem to be guaranteed to have a collision on file names. The 
> problem "went away" when I forced each instance to use a different temporary 
> folder. But this is not a permanent solution.
> Ex:
> java -Dhostname=standalonejcr -Djava.io.tmpdir=/tmp1 -Xmn100M -Xms500M 
> -Xmx500M -jar jackrabbit-standalone-2.0.0.jar -p 8000 -r jcr-repository 
> java -Dhostname=standalonejcr -Djava.io.tmpdir=/tmp2 -Xmn100M -Xms500M 
> -Xmx500M -jar jackrabbit-standalone-2.0.0.jar -p 8001 -r jcr-repository 
> Original Emails: (to jackrabbit dev mailing list)
> >>>>>>>>>>>
> Wed, Apr 7, 2010 at 11:21 AM
> subject       clustered environment, 2 different jvms, TransientFileFactory, 
> storing file blobs in db
> Hello,
> I would normally file a bug on jira, but its very difficult to 
> setup/reproduce, so I'm looking for insight first on how temp files/blobs are 
> implemented in jackrabbit.
> We currently run 2 different "standalone" instances of jackrabbit version 
> 2.0.0, each in their own JVM and setup the same way in using <cluster>. 
> Our application connects to one of the standalone instances 
> remotely(webdavex) for authoring content, and sends publish instructions (via 
> JMS/activemq) to the other.
> The problem though, is that BLOBInTempFile.getStream is occasionaly throwing 
> : "file backing binary value not found", and one of the instances sometimes 
> can't read the file.
> I've searched and found this information:
> http://mail-archives.apache.org/mod_mbox//jackrabbit-dev/200603.mbox/<[email protected]>
> So apparently, when files are read/written, you create a temporary cache, but 
> TransientFileFactory runs as a singleton within a single JVM correct?
> So can I assume that one of the "singletons", (there will be 2??) will delete 
> files that were created by the other at some DIFFERENT random time when the 
> garbage collector runs?
> I've also attached your Repository.xml that we use for both (with different 
> cluster ids of course)
> Adrien
> Thanks
> Is there some way to avoid this??
> I've attached our repository.xml for you to look at, both are setup the same 
> way for e
> Thanks.
> >>>>>>>>>>>>
> from  Stefan Guggisberg 
> reply-to      [email protected]
> to    [email protected]
> date  Thu, Apr 8, 2010 at 12:59 AM
> subject       Re: clustered environment, 2 different jvms, 
> TransientFileFactory, storing file blobs in db
> On Wed, Apr 7, 2010 at 8:21 PM, Adrien Lamoureux
> wrote:
> > Hello,
> > I would normally file a bug on jira, but its very difficult to
> > setup/reproduce, so I'm looking for insight first on how temp files/blobs
> > are implemented in jackrabbit.
> > We currently run 2 different "standalone" instances of jackrabbit version
> > 2.0.0, each in their own JVM and setup the same way in using <cluster>.
> > Our application connects to one of the standalone instances
> > remotely(webdavex) for authoring content, and sends publish instructions
> > (via JMS/activemq) to the other.
> > The problem though, is that BLOBInTempFile.getStream is occasionaly throwing
> > : "file backing binary value not found", and one of the instances sometimes
> > can't read the file.
> > I've searched and found this information:
> > http://mail-archives.apache.org/mod_mbox//jackrabbit-dev/200603.mbox/<[email protected]>
> > So apparently, when files are read/written, you create a temporary cache,
> > but TransientFileFactory runs as a singleton within a single JVM correct?
> yes
> > So can I assume that one of the "singletons", (there will be 2??) will
> > delete files that were created by the other at some DIFFERENT random time
> > when the garbage collector runs?
> no, unless java.io.File#createTempFile invoked from 2 different jvm's
> would create
> colliding temp files. but that's impossible according to the javadoc [0]:
> <quote>
> [...] is guaranteed that:
> 1. The file denoted by the returned abstract pathname did not exist
> before this method was invoked
> [...]
> </quote>
> cheers
> stefan
> [0] 
> http://java.sun.com/javase/7/docs/api/java/io/File.html#createTempFile(java.lang.String,
> java.lang.String, java.io.File)
> >>>>>>>>>>>>
> from  Thomas Müller 
> reply-to      [email protected]
> to    [email protected]
> date  Thu, Apr 8, 2010 at 1:52 AM
> subject       Re: clustered environment, 2 different jvms, 
> TransientFileFactory, storing file blobs in db
> Hi,
> Stefan is right, File.createTempFile() doesn't generate colliding
> files. However, there is a potential problem with the
> TransientFileFactory. Consider the following case:
> - The file "bin-1.tmp" is created (BLOBInTempFile line 51).
> - The TransientFileFactory adds a PhantomReference "A" in its queue.
> - BLOBInTempFile.delete() or dispose() is called, the file "bin-1.tmp"
> is deleted.
> - A new file is created, and also called "bin-1.tmp" is created
> (BLOBInTempFile line 51)
>  (that's possible because File.createTempFile can re-use file names).
> - The TransientFileFactory adds a second PhantomReference "B" in its
> queue, pointing
>  to a different file with the same name.
> - The first (only the first) BLOBInTempFile is no longer referenced.
> - The TransientFileFactory.ReaperThread gets PhantomReference "A" and
>  deletes this file. But the file is still used and referenced ("B").
> I'm not sure if this is what is happening in your case, but it is a
> potential problem.
> Could you log a bug?
> There are multiple ways to solve the problem. I think the best
> solution is to not use File.createTempFile() and instead use our own
> file name factory (with a random part, and an counter part).
> Regards,
> Thomas

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to