[
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