You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by tj...@apache.org on 2016/09/09 13:21:45 UTC
svn commit: r1760012 - in
/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal:
Activator.java InstallAction.java LockingStrategy.java StartAction.java
StopAction.java UninstallAction.java
Author: tjwatson
Date: Fri Sep 9 13:21:44 2016
New Revision: 1760012
URL: http://svn.apache.org/viewvc?rev=1760012&view=rev
Log:
[ARIES-1609] Increase timeout for subsystem locking strategy and make it configurable
Modified:
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LockingStrategy.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/UninstallAction.java
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java?rev=1760012&r1=1760011&r2=1760012&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java Fri Sep 9 13:21:44 2016
@@ -46,6 +46,7 @@ import org.slf4j.LoggerFactory;
public class Activator implements BundleActivator, ServiceTrackerCustomizer<Object, Object> {
private static final Logger logger = LoggerFactory.getLogger(Activator.class);
public static final String MODELLED_RESOURCE_MANAGER = "org.apache.aries.application.modelling.ModelledResourceManager";
+ private static final String LOCK_TIMEOUT = "org.apache.aries.subsystem.lock.timeout";
public static final String LOG_ENTRY = "Method entry: {}, args {}";
public static final String LOG_EXIT = "Method exit: {}, returning {}";
@@ -59,6 +60,7 @@ public class Activator implements Bundle
}
private volatile BundleContext bundleContext;
+ private volatile LockingStrategy lockingStrategy;
private volatile ConfigAdminContentHandler configAdminHandler;
private volatile Coordinator coordinator;
private volatile Object modelledResourceManager;
@@ -79,6 +81,10 @@ public class Activator implements Bundle
return bundleContext;
}
+ public LockingStrategy getLockingStrategy() {
+ return lockingStrategy;
+ }
+
public Coordinator getCoordinator() {
return coordinator;
}
@@ -118,6 +124,7 @@ public class Activator implements Bundle
public synchronized void start(BundleContext context) throws Exception {
logger.debug(LOG_ENTRY, "start", context);
bundleContext = context;
+ lockingStrategy = new LockingStrategy(bundleContext.getProperty(LOCK_TIMEOUT));
serviceTracker = new ServiceTracker<Object, Object>(bundleContext, generateServiceFilter(), this);
serviceTracker.open();
logger.debug(LOG_EXIT, "start");
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java?rev=1760012&r1=1760011&r2=1760012&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java Fri Sep 9 13:21:44 2016
@@ -46,7 +46,7 @@ public class InstallAction implements Pr
BasicSubsystem result = null;
// Acquire the global write lock to prevent all other operations until
// the installation is complete. There is no need to hold any other locks.
- LockingStrategy.writeLock();
+ Activator.getInstance().getLockingStrategy().writeLock();
try {
State state = parent.getState();
if (State.INSTALLING.equals(state)) {
@@ -101,7 +101,7 @@ public class InstallAction implements Pr
}
finally {
// Release the global write lock.
- LockingStrategy.writeUnlock();
+ Activator.getInstance().getLockingStrategy().writeUnlock();
}
return result;
}
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LockingStrategy.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LockingStrategy.java?rev=1760012&r1=1760011&r2=1760012&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LockingStrategy.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LockingStrategy.java Fri Sep 9 13:21:44 2016
@@ -15,20 +15,32 @@ import org.osgi.service.subsystem.Subsys
import org.osgi.service.subsystem.SubsystemException;
public class LockingStrategy {
- private static final int TRY_LOCK_TIME = 30000;
- private static final TimeUnit TRY_LOCK_TIME_UNIT = TimeUnit.MILLISECONDS;
-
+ private final int TRY_LOCK_TIME;
+ private final TimeUnit TRY_LOCK_TIME_UNIT = TimeUnit.SECONDS;
+
+ public LockingStrategy(String tryLockTime) {
+ int value = 600; // ten mins by default
+ if (tryLockTime != null) {
+ try {
+ value = Integer.parseInt(tryLockTime);
+ } catch (NumberFormatException e) {
+ // ignore, the default will be used
+ }
+ }
+ TRY_LOCK_TIME = value;
+ }
+
/*
* A mutual exclusion lock used when acquiring the state change locks of
* a collection of subsystems in order to prevent cycle deadlocks.
*/
- private static final ReentrantLock lock = new ReentrantLock();
+ private final ReentrantLock lock = new ReentrantLock();
/*
* Used when the state change lock of a subsystem cannot be acquired. All
* other state change locks are released while waiting. The condition is met
* whenever the state change lock of one or more subsystems is released.
*/
- private static final Condition condition = lock.newCondition();
+ private final Condition condition = lock.newCondition();
/*
* Allow only one of the following operations to be executing at the same
@@ -45,16 +57,16 @@ public class LockingStrategy {
* (2) Start
* (3) Stop
*/
- private static final ReentrantReadWriteLock rwlock = new ReentrantReadWriteLock();
+ private final ReentrantReadWriteLock rwlock = new ReentrantReadWriteLock();
- private static final ThreadLocal<Map<Subsystem.State, Set<BasicSubsystem>>> local = new ThreadLocal<Map<Subsystem.State, Set<BasicSubsystem>>>() {
+ private final ThreadLocal<Map<Subsystem.State, Set<BasicSubsystem>>> local = new ThreadLocal<Map<Subsystem.State, Set<BasicSubsystem>>>() {
@Override
protected Map<Subsystem.State, Set<BasicSubsystem>> initialValue() {
return new HashMap<Subsystem.State, Set<BasicSubsystem>>();
}
};
- public static void lock() {
+ public void lock() {
try {
if (!lock.tryLock(TRY_LOCK_TIME, TRY_LOCK_TIME_UNIT)) {
throw new SubsystemException("Unable to acquire the global mutual exclusion lock in time.");
@@ -65,11 +77,11 @@ public class LockingStrategy {
}
}
- public static void unlock() {
+ public void unlock() {
lock.unlock();
}
- public static void lock(Collection<BasicSubsystem> subsystems) {
+ public void lock(Collection<BasicSubsystem> subsystems) {
Collection<BasicSubsystem> locked = new ArrayList<BasicSubsystem>(subsystems.size());
try {
while (locked.size() < subsystems.size()) {
@@ -77,7 +89,7 @@ public class LockingStrategy {
if (!subsystem.stateChangeLock().tryLock()) {
unlock(locked);
locked.clear();
- if (!LockingStrategy.condition.await(TRY_LOCK_TIME, TimeUnit.SECONDS)) {
+ if (!condition.await(TRY_LOCK_TIME, TimeUnit.SECONDS)) {
throw new SubsystemException("Unable to acquire the state change lock in time: " + subsystem);
}
break;
@@ -92,14 +104,14 @@ public class LockingStrategy {
}
}
- public static void unlock(Collection<BasicSubsystem> subsystems) {
+ public void unlock(Collection<BasicSubsystem> subsystems) {
for (BasicSubsystem subsystem : subsystems) {
subsystem.stateChangeLock().unlock();
}
signalAll();
}
- private static void signalAll() {
+ private void signalAll() {
lock();
try {
condition.signalAll();
@@ -109,7 +121,7 @@ public class LockingStrategy {
}
}
- public static boolean set(Subsystem.State state, BasicSubsystem subsystem) {
+ public boolean set(Subsystem.State state, BasicSubsystem subsystem) {
Map<Subsystem.State, Set<BasicSubsystem>> map = local.get();
Set<BasicSubsystem> subsystems = map.get(state);
if (subsystems == null) {
@@ -124,7 +136,7 @@ public class LockingStrategy {
return true;
}
- public static void unset(Subsystem.State state, BasicSubsystem subsystem) {
+ public void unset(Subsystem.State state, BasicSubsystem subsystem) {
Map<Subsystem.State, Set<BasicSubsystem>> map = local.get();
Set<BasicSubsystem> subsystems = map.get(state);
if (subsystems != null) {
@@ -132,7 +144,7 @@ public class LockingStrategy {
}
}
- public static void readLock() {
+ public void readLock() {
try {
if (!rwlock.readLock().tryLock(TRY_LOCK_TIME, TRY_LOCK_TIME_UNIT)) {
throw new SubsystemException("Unable to acquire the global read lock in time.");
@@ -143,11 +155,11 @@ public class LockingStrategy {
}
}
- public static void readUnlock() {
+ public void readUnlock() {
rwlock.readLock().unlock();
}
- public static void writeLock() {
+ public void writeLock() {
try {
if (!rwlock.writeLock().tryLock(TRY_LOCK_TIME, TRY_LOCK_TIME_UNIT)) {
throw new SubsystemException("Unable to acquire the global write lock in time.");
@@ -158,7 +170,7 @@ public class LockingStrategy {
}
}
- public static void writeUnlock() {
+ public void writeUnlock() {
rwlock.writeLock().unlock();
}
}
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java?rev=1760012&r1=1760011&r2=1760012&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java Fri Sep 9 13:21:44 2016
@@ -197,7 +197,7 @@ public class StartAction extends Abstrac
@Override
public Object run() {
// Protect against re-entry now that cycles are supported.
- if (!LockingStrategy.set(State.STARTING, target)) {
+ if (!Activator.getInstance().getLockingStrategy().set(State.STARTING, target)) {
return null;
}
try {
@@ -206,7 +206,7 @@ public class StartAction extends Abstrac
// If necessary, install the dependencies.
if (State.INSTALLING.equals(target.getState()) && !Utils.isProvisionDependenciesInstall(target)) {
// Acquire the global write lock while installing dependencies.
- LockingStrategy.writeLock();
+ Activator.getInstance().getLockingStrategy().writeLock();
try {
// We are now protected against installs, starts, stops, and uninstalls.
// We need a separate coordination when installing
@@ -228,7 +228,7 @@ public class StartAction extends Abstrac
}
// Downgrade to the read lock in order to prevent
// installs and uninstalls but allow starts and stops.
- LockingStrategy.readLock();
+ Activator.getInstance().getLockingStrategy().readLock();
}
catch (Throwable t) {
c.fail(t);
@@ -241,13 +241,13 @@ public class StartAction extends Abstrac
}
finally {
// Release the global write lock as soon as possible.
- LockingStrategy.writeUnlock();
+ Activator.getInstance().getLockingStrategy().writeUnlock();
}
}
else {
// Acquire the read lock in order to prevent installs and
// uninstalls but allow starts and stops.
- LockingStrategy.readLock();
+ Activator.getInstance().getLockingStrategy().readLock();
}
try {
// We now hold the read lock and are protected against installs
@@ -263,15 +263,15 @@ public class StartAction extends Abstrac
affectedResources = computeAffectedResources(target);
// Acquire the global mutual exclusion lock while acquiring the
// state change locks of affected subsystems.
- LockingStrategy.lock();
+ Activator.getInstance().getLockingStrategy().lock();
try {
// We are now protected against cycles.
// Acquire the state change locks of affected subsystems.
- LockingStrategy.lock(affectedResources.subsystems());
+ Activator.getInstance().getLockingStrategy().lock(affectedResources.subsystems());
}
finally {
// Release the global mutual exclusion lock as soon as possible.
- LockingStrategy.unlock();
+ Activator.getInstance().getLockingStrategy().unlock();
}
Coordination coordination = this.coordination;
try {
@@ -323,13 +323,13 @@ public class StartAction extends Abstrac
}
finally {
// Release the state change locks of affected subsystems.
- LockingStrategy.unlock(affectedResources.subsystems());
+ Activator.getInstance().getLockingStrategy().unlock(affectedResources.subsystems());
}
}
}
finally {
// Release the read lock.
- LockingStrategy.readUnlock();
+ Activator.getInstance().getLockingStrategy().readUnlock();
}
}
catch (CoordinationException e) {
@@ -347,7 +347,7 @@ public class StartAction extends Abstrac
}
finally {
// Protection against re-entry no longer required.
- LockingStrategy.unset(State.STARTING, target);
+ Activator.getInstance().getLockingStrategy().unset(State.STARTING, target);
}
return null;
}
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java?rev=1760012&r1=1760011&r2=1760012&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java Fri Sep 9 13:21:44 2016
@@ -44,14 +44,14 @@ public class StopAction extends Abstract
@Override
public Object run() {
// Protect against re-entry now that cycles are supported.
- if (!LockingStrategy.set(State.STOPPING, target)) {
+ if (!Activator.getInstance().getLockingStrategy().set(State.STOPPING, target)) {
return null;
}
try {
// We are now protected against re-entry.
// Acquire the global read lock to prevent installs and uninstalls
// but allow starts and stops.
- LockingStrategy.readLock();
+ Activator.getInstance().getLockingStrategy().readLock();
try {
// We are now protected against installs and uninstalls.
checkRoot();
@@ -68,15 +68,15 @@ public class StopAction extends Abstract
}
// Acquire the global mutual exclusion lock while acquiring the
// state change locks of affected subsystems.
- LockingStrategy.lock();
+ Activator.getInstance().getLockingStrategy().lock();
try {
// We are now protected against cycles.
// Acquire the state change locks of affected subsystems.
- LockingStrategy.lock(subsystems);
+ Activator.getInstance().getLockingStrategy().lock(subsystems);
}
finally {
// Release the global mutual exclusion lock as soon as possible.
- LockingStrategy.unlock();
+ Activator.getInstance().getLockingStrategy().unlock();
}
try {
// We are now protected against other starts and stops of the affected subsystems.
@@ -128,17 +128,17 @@ public class StopAction extends Abstract
}
finally {
// Release the state change locks of affected subsystems.
- LockingStrategy.unlock(subsystems);
+ Activator.getInstance().getLockingStrategy().unlock(subsystems);
}
}
finally {
// Release the read lock.
- LockingStrategy.readUnlock();
+ Activator.getInstance().getLockingStrategy().readUnlock();
}
}
finally {
// Protection against re-entry no longer required.
- LockingStrategy.unset(State.STOPPING, target);
+ Activator.getInstance().getLockingStrategy().unset(State.STOPPING, target);
}
return null;
}
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/UninstallAction.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/UninstallAction.java?rev=1760012&r1=1760011&r2=1760012&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/UninstallAction.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/UninstallAction.java Fri Sep 9 13:21:44 2016
@@ -25,14 +25,14 @@ public class UninstallAction extends Abs
@Override
public Object run() {
// Protect against re-entry now that cycles are supported.
- if (!LockingStrategy.set(State.UNINSTALLING, target)) {
+ if (!Activator.getInstance().getLockingStrategy().set(State.UNINSTALLING, target)) {
return null;
}
try {
// Acquire the global write lock to prevent all other operations
// until the uninstall is complete. There is no need to hold any
// other locks.
- LockingStrategy.writeLock();
+ Activator.getInstance().getLockingStrategy().writeLock();
try {
checkRoot();
checkValid();
@@ -47,12 +47,12 @@ public class UninstallAction extends Abs
}
finally {
// Release the global write lock.
- LockingStrategy.writeUnlock();
+ Activator.getInstance().getLockingStrategy().writeUnlock();
}
}
finally {
// Protection against re-entry no longer required.
- LockingStrategy.unset(State.UNINSTALLING, target);
+ Activator.getInstance().getLockingStrategy().unset(State.UNINSTALLING, target);
}
return null;
}