[KARAF-3648] Don't update instance.properties on shutdown, when stopped by root container
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/70c815ef Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/70c815ef Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/70c815ef Branch: refs/heads/master Commit: 70c815ef35ccc7c3e42c0b6bf66627549bb41461 Parents: 2092a93 Author: Grzegorz Grzybek <[email protected]> Authored: Wed Jun 17 17:12:45 2015 +0200 Committer: Grzegorz Grzybek <[email protected]> Committed: Wed Jun 17 17:13:42 2015 +0200 ---------------------------------------------------------------------- .../org/apache/karaf/main/InstanceHelper.java | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf/blob/70c815ef/main/src/main/java/org/apache/karaf/main/InstanceHelper.java ---------------------------------------------------------------------- diff --git a/main/src/main/java/org/apache/karaf/main/InstanceHelper.java b/main/src/main/java/org/apache/karaf/main/InstanceHelper.java index f78c127..dcbc369 100644 --- a/main/src/main/java/org/apache/karaf/main/InstanceHelper.java +++ b/main/src/main/java/org/apache/karaf/main/InstanceHelper.java @@ -22,11 +22,13 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; +import java.io.RandomAccessFile; import java.io.Writer; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.net.InetAddress; import java.net.ServerSocket; +import java.nio.channels.FileLock; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -60,6 +62,28 @@ public class InstanceHelper { throw new Exception(se.getMessage()); } } + // don't instance.properties if we're stopping and can't acquire lock + if (!isStartingInstance) { + RandomAccessFile raf = new RandomAccessFile(propertiesFile, "rw"); + boolean proceed = true; + try { + FileLock lock = raf.getChannel().tryLock(); + if (lock == null) { + proceed = false; + } else { + lock.release(); + } + } finally { + // if proceed is true than we got the lock or OverlappingFileLockException + // but we may proceed in either case + raf.close(); + } + if (!proceed) { + // we didn't acquire lock, it may mean that root container is holding the lock when + // stopping the child + return; + } + } FileLockUtils.execute(propertiesFile, new FileLockUtils.RunnableWithProperties() { public void run(Properties props) throws IOException { if (props.isEmpty()) {
