You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2015/05/16 23:48:06 UTC
svn commit: r1679808 - in
/felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest:
./ .settings/ src/ src/org/ src/org/apache/ src/org/apache/felix/
src/org/apache/felix/framework/ src/org/apache/felix/framework/concurrency...
Author: pderop
Date: Sat May 16 21:48:06 2015
New Revision: 1679808
URL: http://svn.apache.org/r1679808
Log:
added a new simpler scenario test.
Added:
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.classpath (with props)
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.gitignore
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.project (with props)
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.settings/
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.settings/org.eclipse.jdt.core.prefs
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/bnd.bnd
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/.gitignore
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Activator.java
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Component.java
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Helper.java
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Loader.java
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/test/
felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/test/.gitignore
Added: felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.classpath
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.classpath?rev=1679808&view=auto
==============================================================================
Binary file - no diff available.
Propchange: felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.classpath
------------------------------------------------------------------------------
svn:mime-type = application/xml
Added: felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.gitignore
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.gitignore?rev=1679808&view=auto
==============================================================================
--- felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.gitignore (added)
+++ felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.gitignore Sat May 16 21:48:06 2015
@@ -0,0 +1,3 @@
+/bin/
+/bin_test/
+/generated/
Added: felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.project
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.project?rev=1679808&view=auto
==============================================================================
Binary file - no diff available.
Propchange: felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.project
------------------------------------------------------------------------------
svn:mime-type = application/xml
Added: felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.settings/org.eclipse.jdt.core.prefs
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.settings/org.eclipse.jdt.core.prefs?rev=1679808&view=auto
==============================================================================
--- felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.settings/org.eclipse.jdt.core.prefs (added)
+++ felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/.settings/org.eclipse.jdt.core.prefs Sat May 16 21:48:06 2015
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
Added: felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/bnd.bnd
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/bnd.bnd?rev=1679808&view=auto
==============================================================================
--- felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/bnd.bnd (added)
+++ felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/bnd.bnd Sat May 16 21:48:06 2015
@@ -0,0 +1,29 @@
+Bundle-Version: 0.0.0.${tstamp}
+-buildpath: \
+ osgi.cmpn;version=4.2,\
+ osgi.core;version=4.2
+Private-Package: \
+ org.apache.felix.framework.concurrencytest
+Bundle-Activator: org.apache.felix.framework.concurrencytest.Activator
+
+-runbundles: \
+ org.apache.felix.log;version=1.0.1,\
+ org.apache.felix.gogo.command;version=0.12.0,\
+ org.apache.felix.gogo.shell;version=0.10.0,\
+ org.apache.felix.gogo.runtime;version=0.10.0,\
+ org.apache.felix.framework.concurrencytest;version=latest
+
+-runproperties: org.osgi.framework.bootdelegation='sun.*,'
+-runee: JavaSE/compact1-1.8
+javac.source: 1.8
+javac.target: 1.8
+-runvm: -server -Xmx1024m -Xms1024m -Dthreads=10
+
+# Works with Equinox
+#-runfw: org.eclipse.osgi;version='[3.10.1.v20140909-1633,3.10.1.v20140909-1633]'
+
+# Works with last released framework
+#-runfw: org.apache.felix.main;version='[5.0.0, 5.0.0]'
+
+# Fails with latest Felix framework, in trunk (that includes the FELIX-4866 patch)
+-runfw: org.apache.felix.main;version=latest
Added: felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/.gitignore
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/.gitignore?rev=1679808&view=auto
==============================================================================
(empty)
Added: felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Activator.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Activator.java?rev=1679808&view=auto
==============================================================================
--- felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Activator.java (added)
+++ felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Activator.java Sat May 16 21:48:06 2015
@@ -0,0 +1,20 @@
+package org.apache.felix.framework.concurrencytest;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+ Loader m_loader;
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ System.out.println("Starting load test.");
+ m_loader = new Loader(context);
+ m_loader.start();
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ m_loader.stop();
+ }
+}
Added: felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Component.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Component.java?rev=1679808&view=auto
==============================================================================
--- felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Component.java (added)
+++ felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Component.java Sat May 16 21:48:06 2015
@@ -0,0 +1,87 @@
+package org.apache.felix.framework.concurrencytest;
+
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+/**
+ * A simple component, that is optionally registered in the osgi registry.
+ */
+public class Component implements ServiceTrackerCustomizer {
+ private final BundleContext m_ctx;
+ private final int m_id;
+ private volatile int m_dependsOnId;
+ private volatile ServiceTracker m_tracker;
+ private volatile boolean m_satisfied;
+ private volatile ServiceRegistration m_registration;
+
+ public Component(BundleContext ctx, int id) {
+ m_ctx = ctx;
+ m_id = id;
+ }
+
+ public void dependsOn(int componentId) {
+ m_dependsOnId = componentId;
+ }
+
+ public void start() {
+ // if we depends on another component, wait for it before starting up.
+ if (m_dependsOnId != -1) {
+ Filter filter;
+ try {
+ filter = m_ctx.createFilter("(&(objectClass=" + Component.class.getName() + ")(id=" + m_dependsOnId + "))");
+ } catch (InvalidSyntaxException e) {
+ e.printStackTrace();
+ return;
+ }
+ m_tracker = new ServiceTracker(m_ctx, filter, this);
+ m_tracker.open();
+ } else {
+ m_satisfied = true;
+ }
+ Hashtable<String, Object> properties = new Hashtable<String, Object>();
+ properties.put("id", String.valueOf(m_id));
+ m_registration = m_ctx.registerService(Component.class.getName(), this, properties);
+ }
+
+ public boolean isSatisfied() {
+ return m_satisfied;
+ }
+
+ public void stop() {
+ m_tracker.close();
+ m_registration.unregister();
+ }
+
+ @Override
+ public Object addingService(ServiceReference reference) {
+ Object service = m_ctx.getService(reference);
+ String id = (String) reference.getProperty("id");
+ if (String.valueOf(m_dependsOnId).equals(id)) {
+ m_satisfied = true;
+ } else {
+ System.err.println("Component#" + m_id + " received wrong dependency #" + id);
+ }
+
+ return service;
+ }
+
+ @Override
+ public void modifiedService(ServiceReference reference, Object service) {
+ }
+
+ @Override
+ public void removedService(ServiceReference reference, Object service) {
+ try {
+ m_ctx.ungetService(reference);
+ } catch (IllegalStateException e) {
+ e.printStackTrace();
+ }
+ }
+}
Added: felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Helper.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Helper.java?rev=1679808&view=auto
==============================================================================
--- felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Helper.java (added)
+++ felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Helper.java Sat May 16 21:48:06 2015
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.framework.concurrencytest;
+
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Supplier;
+
+/**
+ * Helper class containing misc functions, and constants.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class Helper {
+ /**
+ * Activate this flag for debugging.
+ */
+ private final static boolean DEBUG = false;
+
+ /**
+ * Generator used to create unique identifiers.
+ */
+ private final static AtomicLong m_idGenerator = new AtomicLong();
+
+ /**
+ * Threadpool which can be optionally used by parallel scenarios.
+ */
+ private final static int CORES = Runtime.getRuntime().availableProcessors();
+ private final static ForkJoinPool TPOOL = new ForkJoinPool(Integer.getInteger("threads", CORES));
+
+ /**
+ * Get the threadpool, possibly needed by some scenario supporting parallel mode
+ */
+ public static ForkJoinPool getThreadPool() {
+ return TPOOL;
+ }
+
+ /**
+ * Display some debug messages.
+ */
+ public static void debug(Supplier<String> message) {
+ if (DEBUG) {
+ System.out.println(message.get());
+ }
+ }
+
+ /**
+ * Generates a unique id.
+ */
+ public static String generateId() {
+ return String.valueOf(m_idGenerator.incrementAndGet());
+ }
+}
Added: felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Loader.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Loader.java?rev=1679808&view=auto
==============================================================================
--- felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Loader.java (added)
+++ felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/src/org/apache/felix/framework/concurrencytest/Loader.java Sat May 16 21:48:06 2015
@@ -0,0 +1,85 @@
+package org.apache.felix.framework.concurrencytest;
+
+import static java.util.stream.Collectors.toList;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+import org.osgi.framework.BundleContext;
+import static java.lang.System.err;
+import static java.lang.System.out;
+
+public class Loader implements Runnable {
+ final BundleContext m_ctx;
+ private Thread m_thread;
+ final static int COMPONENTS = 10;
+ final static int ITERATIONS = 10000;
+
+ Loader(BundleContext ctx) {
+ m_ctx = ctx;
+ }
+
+ public void start() {
+ m_thread = new Thread(this);
+ m_thread.start();
+ }
+
+ public void stop() {
+ m_thread.interrupt();
+ }
+
+ public void run() {
+ try { Thread.sleep(200); } catch (InterruptedException e) {}
+
+ // Creates all components. Each nth components will depends on the
+ // nth+1 component. The last component has not any dependencies.
+ String anim= "|/-\\";
+
+ for (int i = 0; i < ITERATIONS; i ++) {
+ out.print("\rLoading ... " + anim.charAt((int) i % anim.length()));
+ try {
+ createComponentsConcurrently();
+ } catch (Throwable error) {
+ err.println("Test failed");
+ error.printStackTrace(err);
+ break;
+ }
+ }
+
+ out.println("\nTest successful.");
+ }
+
+ private void createComponentsConcurrently() throws Exception {
+ // Create components.
+ List<Component> components = IntStream.range(0, COMPONENTS).mapToObj(i -> createComponents(i)).collect(toList());
+
+ // Start all components asynchronously.
+ components.stream().forEach(component -> Helper.getThreadPool().execute(() -> component.start()));
+
+ // Make sure all worker threads have finished to register components.
+ if (! Helper.getThreadPool().awaitQuiescence(3, TimeUnit.SECONDS)) {
+ System.err.println("ThreadPool did not complete timely.");
+ return;
+ }
+
+ // Count the number of satisfied components.
+ long satisfied = components.stream().filter(Component::isSatisfied).count();
+
+ // Stop all components
+ components.stream().forEach(Component::stop);
+
+ // Report an error if we don't have expected satisfied components.
+ if (satisfied != COMPONENTS) {
+ throw new Exception("found unsatisfied component: " + (COMPONENTS - satisfied));
+ }
+ }
+
+ private Component createComponents(int i) {
+ Component component = new Component(m_ctx, i);
+ if (i < (COMPONENTS - 1)) {
+ component.dependsOn(i + 1);
+ }
+ return component;
+ }
+}
Added: felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/test/.gitignore
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/bndtools-FELIX-4866/org.apache.felix.framework.concurrencytest/test/.gitignore?rev=1679808&view=auto
==============================================================================
(empty)