Search in sources :

Example 11 with LockHandle

use of io.fabric8.api.LockHandle in project fabric8 by jboss-fuse.

the class DummyBatchingProgressMonitor method aquireReadLock.

@Override
public LockHandle aquireReadLock() {
    final ReadLock readLock = readWriteLock.readLock();
    boolean success;
    try {
        success = readLock.tryLock() || readLock.tryLock(AQUIRE_LOCK_TIMEOUT, TimeUnit.MILLISECONDS);
    } catch (InterruptedException ex) {
        success = false;
    }
    IllegalStateAssertion.assertTrue(success, "Cannot obtain profile read lock in time");
    return new LockHandle() {

        @Override
        public void unlock() {
            readLock.unlock();
        }
    };
}
Also used : ReadLock(java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock) LockHandle(io.fabric8.api.LockHandle)

Example 12 with LockHandle

use of io.fabric8.api.LockHandle in project fabric8 by jboss-fuse.

the class DummyBatchingProgressMonitor method aquireWriteLock.

@Override
public LockHandle aquireWriteLock() {
    final WriteLock writeLock = readWriteLock.writeLock();
    boolean success;
    try {
        success = writeLock.tryLock() || writeLock.tryLock(AQUIRE_LOCK_TIMEOUT, TimeUnit.MILLISECONDS);
    } catch (InterruptedException ex) {
        success = false;
    }
    IllegalStateAssertion.assertTrue(success, "Cannot obtain profile write lock in time");
    return new LockHandle() {

        @Override
        public void unlock() {
            if (notificationRequired && readWriteLock.getWriteHoldCount() == 1) {
                try {
                    dataStore.get().fireChangeNotifications();
                } finally {
                    notificationRequired = false;
                }
            }
            writeLock.unlock();
        }
    };
}
Also used : ReentrantReadWriteLock(java.util.concurrent.locks.ReentrantReadWriteLock) WriteLock(java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock) LockHandle(io.fabric8.api.LockHandle)

Example 13 with LockHandle

use of io.fabric8.api.LockHandle in project fabric8 by jboss-fuse.

the class DummyBatchingProgressMonitor method activateInternal.

private void activateInternal() throws Exception {
    LOGGER.info("Starting up GitDataStore " + this);
    // Call the bootstrap {@link DataStoreTemplate}
    DataStoreTemplate template = runtimeProperties.get().removeRuntimeAttribute(DataStoreTemplate.class);
    if (template != null) {
        // Do the initial commit and set the root tag
        Ref rootTag = getGit().getRepository().getRef(GitHelpers.ROOT_TAG);
        if (rootTag == null) {
            getGit().commit().setMessage("First Commit").setCommitter("fabric", "user@fabric").call();
            getGit().tag().setName(GitHelpers.ROOT_TAG).setMessage("Tag the root commit").call();
        }
        LOGGER.debug("Running datastore bootstrap template: " + template);
        template.doWith(this, dataStore.get());
    }
    // Setup proxy service
    GitProxyService proxyService = gitProxyService.get();
    defaultProxySelector = ProxySelector.getDefault();
    // authenticator disabled, until properly tested it does not affect others, as Authenticator is static in the JVM
    // Authenticator.setDefault(new FabricGitLocalHostAuthenticator(proxyService));
    ProxySelector fabricProxySelector = new FabricGitLocalHostProxySelector(defaultProxySelector, proxyService);
    ProxySelector.setDefault(fabricProxySelector);
    LOGGER.debug("Setting up FabricProxySelector: {}", fabricProxySelector);
    if (gitRemoteUrl != null) {
        gitListener.runRemoteUrlChanged(gitRemoteUrl);
        remoteUrl = gitRemoteUrl;
    } else {
        gitService.get().addGitListener(gitListener);
        remoteUrl = gitService.get().getRemoteUrl();
        if (remoteUrl != null) {
            gitListener.runRemoteUrlChanged(remoteUrl);
        }
    }
    // Get initial versions
    getInitialVersions();
    // poll logic in case of remote git repo
    if (gitRemoteUrl != null) {
        // i need this old logic in case of remote repos
        LOGGER.info("Starting to pull from remote git repository every {} millis", gitRemotePollInterval);
        threadPool.scheduleWithFixedDelay(new Runnable() {

            @Override
            public void run() {
                LockHandle writeLock = aquireWriteLock();
                try {
                    LOGGER.trace("Performing timed pull");
                    doPullInternal();
                    LOGGER.debug("Performed timed pull from external git repo");
                } catch (Throwable e) {
                    LOGGER.debug("Error during performed timed pull/push due " + e.getMessage(), e);
                    LOGGER.warn("Error during performed timed pull/push due " + e.getMessage() + ". This exception is ignored.");
                } finally {
                    writeLock.unlock();
                }
            }

            @Override
            public String toString() {
                return "TimedPushTask";
            }
        }, 1000, gitRemotePollInterval, TimeUnit.MILLISECONDS);
    }
    LOGGER.info("Using ZooKeeper SharedCount to react when master git repo is changed, so we can do a git pull to the local git repo.");
    counter = new SharedCount(curator.get(), ZkPath.GIT_TRIGGER.getPath(), 0);
    counter.addListener(new SharedCountListener() {

        @Override
        public void countHasChanged(final SharedCountReader sharedCountReader, final int value) throws Exception {
            Runnable task = new Runnable() {

                @Override
                public void run() {
                    doPullInternal();
                }
            };
            if (gitRandomFetchDelay == 0) {
                LOGGER.debug("Watch counter updated to " + value + ", scheduling immediate pull");
                threadPool.submit(task);
            } else {
                int delay = RND.nextInt(gitRandomFetchDelay) + 1;
                LOGGER.debug("Watch counter updated to " + value + ", scheduling pull with random delay=" + delay + "s");
                threadPool.schedule(task, delay, TimeUnit.SECONDS);
            }
        }

        @Override
        public void stateChanged(CuratorFramework curatorFramework, ConnectionState connectionState) {
            switch(connectionState) {
                case SUSPENDED:
                case READ_ONLY:
                case LOST:
                    // do nothing
                    break;
                case CONNECTED:
                case RECONNECTED:
                    LOGGER.info("Shared Counter (Re)connected, doing a pull");
                    doPullInternal();
                    break;
            }
        }
    });
    try {
        counter.start();
    } catch (KeeperException.NotReadOnlyException ex) {
    // In read only mode the counter is not going to start.
    // If the connection is reestablished the component will reactivate.
    // We need to catch this error so that the component gets activated.
    }
    if (gitGcOnLoad) {
        LockHandle writeLock = aquireWriteLock();
        try {
            GitOperation<Void> gitop = new GitOperation<Void>() {

                public Void call(Git git, GitContext context) throws Exception {
                    long before = System.currentTimeMillis();
                    try {
                        git.gc().call();
                        LOGGER.debug("git gc took " + ((System.currentTimeMillis() - before)) + " ms.");
                    } catch (GitAPIException e) {
                        LOGGER.debug("git gc threw an exception!", e);
                    }
                    return null;
                }
            };
            executeInternal(new GitContext(), null, gitop);
        } finally {
            writeLock.unlock();
        }
    }
    // failing to activate the component
    if (readWriteLock.isWriteLockedByCurrentThread() || readWriteLock.getWriteHoldCount() == 0) {
        try {
            // let's delegate to other thread in order to free MCF thread
            // ENTESB-7843: there's a problem when jetty is configured with TLS and keystore location using
            // profile: URI. while Jetty continues to be configured if profile:jetty.xml isn't available
            // (and it isn't initially), it fails trying to access keystore via profile: URI.
            // we should optimistically assume we can pull, but there's nothing wrong if we can't
            // - we'll be able to pull later
            threadPoolInitial.execute(new Runnable() {

                @Override
                public void run() {
                    doPullInternal(5);
                }
            });
        } catch (IllegalStateException e) {
            LOGGER.info("Another thread acquired write lock and GitDataStore can't pull from remote repository.");
        }
    } else {
        LOGGER.info("Another thread is keeping git write lock. GitDataStore will continue activation.");
    }
}
Also used : SharedCount(org.apache.curator.framework.recipes.shared.SharedCount) ProxySelector(java.net.ProxySelector) GitAPIException(org.eclipse.jgit.api.errors.GitAPIException) CuratorFramework(org.apache.curator.framework.CuratorFramework) DataStoreTemplate(io.fabric8.api.DataStoreTemplate) SharedCountListener(org.apache.curator.framework.recipes.shared.SharedCountListener) GitProxyService(io.fabric8.git.GitProxyService) LockHandle(io.fabric8.api.LockHandle) SharedCountReader(org.apache.curator.framework.recipes.shared.SharedCountReader) GitAPIException(org.eclipse.jgit.api.errors.GitAPIException) IOException(java.io.IOException) FabricException(io.fabric8.api.FabricException) KeeperException(org.apache.zookeeper.KeeperException) MalformedURLException(java.net.MalformedURLException) Ref(org.eclipse.jgit.lib.Ref) Git(org.eclipse.jgit.api.Git) GitContext(io.fabric8.api.GitContext) ConnectionState(org.apache.curator.framework.state.ConnectionState) KeeperException(org.apache.zookeeper.KeeperException)

Example 14 with LockHandle

use of io.fabric8.api.LockHandle in project fabric8 by jboss-fuse.

the class DummyBatchingProgressMonitor method modifyVersionDescription.

@Override
public String modifyVersionDescription(final Version version, String description) {
    GitContext context = newGitWriteContext(version.getId());
    final Map<String, String> attributes = version.getAttributes();
    attributes.put(Version.DESCRIPTION, description);
    IllegalStateAssertion.assertNotNull(version, "version");
    LockHandle writeLock = aquireWriteLock();
    try {
        assertValid();
        LOGGER.debug("Updating version: {}", version);
        GitOperation<String> gitop = new GitOperation<String>() {

            public String call(Git git, GitContext context) throws Exception {
                String versionId = version.getId();
                GitHelpers.checkoutTag(git, GitHelpers.ROOT_TAG);
                createOrCheckoutVersion(git, version.getId());
                setVersionAttributes(git, context, versionId, attributes);
                context.commitMessage("Create version: " + version);
                Set<String> alreadyProcessedProfiles = new HashSet<String>();
                for (Profile profile : version.getProfiles()) {
                    createOrUpdateProfile(context, null, profile, alreadyProcessedProfiles);
                }
                return versionId;
            }
        };
        return executeInternal(context, null, gitop);
    } finally {
        writeLock.unlock();
    }
}
Also used : LockHandle(io.fabric8.api.LockHandle) Git(org.eclipse.jgit.api.Git) GitContext(io.fabric8.api.GitContext) Profile(io.fabric8.api.Profile)

Example 15 with LockHandle

use of io.fabric8.api.LockHandle in project fabric8 by jboss-fuse.

the class DummyBatchingProgressMonitor method createVersion.

@Override
public String createVersion(GitContext context, final Version version) {
    IllegalStateAssertion.assertNotNull(version, "version");
    LockHandle writeLock = aquireWriteLock();
    try {
        assertValid();
        LOGGER.debug("Create version: {}", version);
        GitOperation<String> gitop = new GitOperation<String>() {

            public String call(Git git, GitContext context) throws Exception {
                String versionId = version.getId();
                IllegalStateAssertion.assertNull(checkoutProfileBranch(git, context, versionId, null), "Version already exists: " + versionId);
                GitHelpers.checkoutTag(git, GitHelpers.ROOT_TAG);
                createOrCheckoutVersion(git, version.getId());
                setVersionAttributes(git, context, versionId, version.getAttributes());
                context.commitMessage("Create version: " + version);
                Set<String> alreadyProcessedProfiles = new HashSet<String>();
                for (Profile profile : version.getProfiles()) {
                    createOrUpdateProfile(context, null, profile, alreadyProcessedProfiles);
                }
                return versionId;
            }
        };
        return executeInternal(context, null, gitop);
    } finally {
        writeLock.unlock();
    }
}
Also used : LockHandle(io.fabric8.api.LockHandle) Git(org.eclipse.jgit.api.Git) GitContext(io.fabric8.api.GitContext) Profile(io.fabric8.api.Profile)

Aggregations

LockHandle (io.fabric8.api.LockHandle)20 GitContext (io.fabric8.api.GitContext)13 Git (org.eclipse.jgit.api.Git)13 Profile (io.fabric8.api.Profile)4 FabricException (io.fabric8.api.FabricException)3 IOException (java.io.IOException)3 MalformedURLException (java.net.MalformedURLException)3 KeeperException (org.apache.zookeeper.KeeperException)3 GitAPIException (org.eclipse.jgit.api.errors.GitAPIException)3 Version (io.fabric8.api.Version)2 GitVersion (io.fabric8.api.commands.GitVersion)2 File (java.io.File)2 CuratorFramework (org.apache.curator.framework.CuratorFramework)2 DataStoreTemplate (io.fabric8.api.DataStoreTemplate)1 ProfileBuilder (io.fabric8.api.ProfileBuilder)1 VersionBuilder (io.fabric8.api.VersionBuilder)1 GitVersions (io.fabric8.api.commands.GitVersions)1 GitProxyService (io.fabric8.git.GitProxyService)1 PushPolicyResult (io.fabric8.git.PullPushPolicy.PushPolicyResult)1 ProxySelector (java.net.ProxySelector)1