Do you really want to call System.gc() that many times and inside a
loop? On top of that, .gc is only a request. No guarantee that .gc
takes place at all when called. Which is good because you used it in a
loop ;)
Thomas Mueller wrote:
> Hi,
>
> I am also not happy with the way Repositories are opened, I think it
> would be better to have a Factory class and a method to open a
> repository with an URL. I hope this will be solved in the next JCR
> API.
>
> I also run into similar unpredictable cases where you have to re-try
> because the resource is sometimes still in use, however this is not
> repository related but 'delete a file':
>
> public static void delete(String fileName) throws Exception {
> File file = new File(fileName);
> if(file.exists()) {
> for(int i=0; i<16; i++) {
> boolean ok = file.delete();
> if(ok) {
> return;
> }
> System.gc();
> try {
> // sleep at most 256 ms
> Thread.sleep(i * i);
> } catch (InterruptedException e) {
> // ignore
> }
> }
> throw new Exception("Can't delete file");
> }
> }
>
> Maybe you can re-use part of this code (you should not try to delete
> the lock file, but try to open the repository in the loop).
>
> Thomas
>
>
>
> On 1/4/07, anton_slutsky <[EMAIL PROTECTED]> wrote:
>>
>> I see your reasoning. However, if you look at the unit test I pasted
>> in the
>> earlier message, you'll see that the approach will not only prevent
>> another
>> process from creating a new repository, but will also stop this very same
>> process from getting a new instance. Please forgive me for being
>> picky, but
>> if you let people do "new", you really should make sure it works. Or
>> dont
>> let people create new instances and make the thing a singleton.
>>
>> My biggest issue is very simple. For some reason, my unit tests keep
>> crashing. I fork the VM on every unit test and do a shutdown() in every
>> tearDown(), for some reason, the .lock file lingers on sometimes and
>> breaks
>> the next test. This happens every time I run my test suite, but never in
>> the same place. I dont know what it is. Maybe its Windows taking too
>> long
>> to clean up. But my application is untestable. I can try running all
>> tests
>> in the same VM, but then my test state will become unpredictable as I
>> cache
>> things quite a bit.
>>
>>
>>
>> Tobias Bocanegra wrote:
>> >
>> > hmmm...view me previous answer (it somehow got lost):
>> >
>> > hi anton,
>> > we received many errors that were caused by multiple instances running
>> > on the same repository data that's why the .lock file is there to
>> > prevent 2 jackrabbit instances accessing the same physical data.
>> > actually, it should not cause any trouble, even if the jvm is killed
>> > or the repository is not shut down correctly.
>> > the mechanism works as follows: if the .lock file is present, the
>> > repository tries to acquire a java.nio.lock, and if this succeeds,
>> > only a warning is issued. if not, another process has locked the file
>> > and the repository startup is aborted. if the jvm is killed, it
>> > releases also the lock of on the .lock file.
>> >
>> > so i'm wondering what exact problems you see?
>> > regards, toby
>> >
>> > On 1/4/07, anton_slutsky <[EMAIL PROTECTED]> wrote:
>> >>
>> >> Please look at the unit test below. This is basic usability. It's
>> not
>> >> working. Oddly enough, noone's even responding to the discussion. If
>> >> there
>> >> are issues with multi-repository usage, then let's address the
>> issues and
>> >> not hack a workaround. If you guys don't have time to work on this
>> one,
>> >> let's discuss the architecture of what needs to be done, and I'll
>> be more
>> >> then happy to help you out as we are in a bit of a bind with this one.
>> >>
>> >>
>> >> import junit.framework.TestCase;
>> >>
>> >> import javax.jcr.*;
>> >> import org.apache.jackrabbit.core.*;
>> >>
>> >> /**
>> >> * @author aslutsky
>> >> */
>> >> public class TestJackrabbit extends TestCase{
>> >>
>> >> public void testMultipleLogins()
>> >> throws Exception
>> >> {
>> >> Repository repo = new TransientRepository();
>> >> repo.login();
>> >>
>> >> repo = new TransientRepository();
>> >>
>> >> // this call will break. It'll complain of a .lock
>> file
>> >> locking the repository
>> >> // from another process. As you can see, this is the
>> >> only
>> >> process that's using the repository
>> >> // since the above call succeeded.
>> >> repo.login();
>> >>
>> >> }
>> >>
>> >> }
>> >>
>> >>
>> >>
>> >> anton_slutsky wrote:
>> >> >
>> >> > Hello,
>> >> >
>> >> > First of all, kudos on the great product. We are using it and
>> love it
>> >> > something awful. Having said that, one little "feature" that's
>> there
>> >> is
>> >> > extremely annoying. When a repo is instantiated, it creates a .lock
>> >> file
>> >> > at root (which you probably know all too well). I'm sure there is a
>> >> > reason for it to be there, and in prod it might even be a good
>> idea to
>> >> > make certain only one process access a given repository, but in
>> >> > development, this .lock file causes a world of grief. I'm using
>> >> > jackrabbit as a library for a web project running on jboss in dev
>> and
>> >> > websphere in prod. I constantly run into two major problems.
>> First,
>> >> > sometimes, I need to kill jboss, which negates any attempts at
>> >> finalize()
>> >> > logic I have implemented. Second, when redeploying, jboss seems to
>> >> ignore
>> >> > finalize() altogether when hot redeploying. Obviously, this is not
>> >> your
>> >> > issue, but it is a huge inconvenience for me and my team.
>> >> >
>> >> > I'm wondering if I were to submit a patch making this .lock logic
>> >> > configurable, how would it go with the team? Or are there
>> underlying
>> >> > architectural concerns that necessitate such an approach?
>> >> >
>> >> > Thanks!
>> >> > Anton
>> >> >
>> >>
>> >> --
>> >> View this message in context:
>> >> http://www.nabble.com/Jackrabbit-repo-locking-tf2590610.html#a8160196
>> >> Sent from the Jackrabbit - Users mailing list archive at Nabble.com.
>> >>
>> >>
>> >
>> >
>> > --
>> > -----------------------------------------< [EMAIL PROTECTED]
>> >---
>> > Tobias Bocanegra, Day Management AG, Barfuesserplatz 6, CH - 4001 Basel
>> > T +41 61 226 98 98, F +41 61 226 98 97
>> > -----------------------------------------------< http://www.day.com
>> >---
>> >
>> >
>>
>> --
>> View this message in context:
>> http://www.nabble.com/Jackrabbit-repo-locking-tf2590610.html#a8160735
>> Sent from the Jackrabbit - Users mailing list archive at Nabble.com.
>>
>>