Merge "MD-SAL transaction chaining API"
authorEd Warnicke <eaw@cisco.com>
Mon, 3 Feb 2014 22:51:26 +0000 (22:51 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Mon, 3 Feb 2014 22:51:26 +0000 (22:51 +0000)
opendaylight/md-sal/model/model-flow-service/src/main/yang/packet-processing.yang
opendaylight/md-sal/model/pom.xml
opendaylight/md-sal/pom.xml
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java
opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/DataModification.java
opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/AbstractDataModification.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/HashMapDataStore.xtend
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/util/YangDataOperations.xtend
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/util/YangSchemaUtils.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/cnsn/to/json/test/CnSnToJsonIncorrectTopLevelTest.java
opendaylight/md-sal/samples/toaster/pom.xml

index 00ecdbacf08d5a8a87a0db80427b5a4c52ec0ff6..f3db3181f7935665a8731d5bb76119aac5036df4 100644 (file)
@@ -8,6 +8,8 @@ module packet-processing {
     import opendaylight-l2-types {prefix types;revision-date "2013-08-27";}
     import opendaylight-match-types {prefix match-type;revision-date "2013-10-26";}
     import opendaylight-table-types {prefix table-type;revision-date "2013-10-26";}
+    import opendaylight-action-types {prefix action-type;revision-date "2013-11-12";}
+
     
     revision "2013-07-09" {
         description "";
@@ -88,7 +90,12 @@ module packet-processing {
                leaf egress {
                        type inv:node-connector-ref;
                }
+               leaf buffer-id {
+                  type uint32;
+            }
+
                uses raw-packet;
+               uses action-type:action-list;
        }
     }
 }
index d31535cb98b27b7e727088fe3ac076a70d32adef..5092995eb05cb174121f17799008ce248ee58c33 100644 (file)
                     <dependency>
                         <groupId>org.opendaylight.yangtools</groupId>
                         <artifactId>maven-sal-api-gen-plugin</artifactId>
-                        <version>${yang.codegen.version}</version>
+                        <version>${yangtools.version}</version>
                         <type>jar</type>
                     </dependency>
                     <dependency>
                         <groupId>org.opendaylight.yangtools</groupId>
                         <artifactId>yang-binding</artifactId>
-                        <version>${yang.codegen.version}</version>
+                        <version>${yangtools.version}</version>
                         <type>jar</type>
                     </dependency>
                 </dependencies>
index 674ea240ebc164af1ff77036264dbad5f35b70d3..2f594148c98290f96e8b2d2288da2d4166bec177 100644 (file)
@@ -8,7 +8,6 @@
         <relativePath>../commons/opendaylight</relativePath>
     </parent>
 
-    <groupId>org.opendaylight.controller</groupId>
     <artifactId>sal-parent</artifactId>
     <version>1.1-SNAPSHOT</version>
     <packaging>pom</packaging>
 
         <!-- Dependency Versions -->
         <slf4j.version>1.7.2</slf4j.version>
-       <yang.codegen.version>${yangtools.version}</yang.codegen.version>
         <guava.version>14.0.1</guava.version>
         <osgi.core.version>5.0.0</osgi.core.version>
         <junit.version>4.8.1</junit.version>
index e5cf8e6c45e1d00b56530c2b713db756111401c7..244e3503439612fb7211dd9307c191e73f048120 100644 (file)
@@ -38,9 +38,23 @@ public class SingletonHolder {
         return NOTIFICATION_EXECUTOR;
     }
 
+    /**
+     * @deprecated This method is only used from configuration modules and thus callers of it
+     *             should use service injection to make the executor configurable.
+     */
+    @Deprecated
     public static synchronized final ListeningExecutorService getDefaultCommitExecutor() {
         if (COMMIT_EXECUTOR == null) {
-            COMMIT_EXECUTOR = createNamedExecutor("md-sal-binding-commit-%d");
+            ThreadFactory factory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat("md-sal-binding-commit-%d").build();
+           /*
+            * FIXME: this used to be newCacheThreadPool(), but MD-SAL does not have transaction
+            *        ordering guarantees, which means that using a concurrent threadpool results
+            *        in application data being committed in random order, potentially resulting
+            *        in inconsistent data being present. Once proper primitives are introduced,
+            *        concurrency can be reintroduced.
+            */
+            ExecutorService executor = Executors.newSingleThreadExecutor(factory);
+            COMMIT_EXECUTOR = MoreExecutors.listeningDecorator(executor);
         }
 
         return COMMIT_EXECUTOR;
@@ -50,7 +64,5 @@ public class SingletonHolder {
         ThreadFactory factory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat(format).build();
         ExecutorService executor = Executors.newCachedThreadPool(factory);
         return MoreExecutors.listeningDecorator(executor);
-
     }
-
 }
index d74b26dae24ae374aa5b03f987eea27c12fe7113..29ba192ba821294ceff36aa8de3b83a445edce16 100644 (file)
@@ -37,8 +37,46 @@ public interface DataModification<P/* extends Path<P> */, D> extends DataChange<
     @Deprecated
     void putRuntimeData(P path, D data);
 
+    /**
+     * Store a piece of data at specified path. This acts as a merge operation,
+     * which is to say that any pre-existing data which is not explicitly
+     * overwritten will be preserved. This means that if you store a container,
+     * its child lists will be merged. Performing the following put operations:
+     *
+     * 1) container { list [ a ] }
+     * 2) container { list [ b ] }
+     *
+     * will result in the following data being present:
+     *
+     * container { list [ a, b ] }
+     *
+     * This also means that storing the container will preserve any augmentations
+     * which have been attached to it.
+     *
+     * If you require an explicit replace operation, perform
+     * {@link removeOperationalData} first.
+     */
     void putOperationalData(P path, D data);
 
+    /**
+     * Store a piece of data at specified path. This acts as a merge operation,
+     * which is to say that any pre-existing data which is not explicitly
+     * overwritten will be preserved. This means that if you store a container,
+     * its child lists will be merged. Performing the following put operations:
+     *
+     * 1) container { list [ a ] }
+     * 2) container { list [ b ] }
+     *
+     * will result in the following data being present:
+     *
+     * container { list [ a, b ] }
+     *
+     * This also means that storing the container will preserve any augmentations
+     * which have been attached to it.
+     *
+     * If you require an explicit replace operation, perform
+     * {@link removeConfigurationData} first.
+     */
     void putConfigurationData(P path, D data);
 
     /**
index 9a61e98c229e52dc15a94c1fc181307cd44ac8fe..4b6a0185ab81ecc1bdaf2799de15b1a6af33ff7b 100644 (file)
@@ -75,7 +75,6 @@ public abstract class AbstractDataModification<P extends Path<P>, D> implements
         }
 
         configurationUpdate.put(path, mergeConfigurationData(path,original, data));
-        configurationRemove.remove(path);
     }
 
     @Override
@@ -86,7 +85,6 @@ public abstract class AbstractDataModification<P extends Path<P>, D> implements
             operationalCreated.put(path, data);
         }
         operationalUpdate.put(path, mergeOperationalData(path,original,data));
-        operationalRemove.remove(path);
     }
 
     @Override
index 5fc2c1d7d155bb131af0081cc8fc38a3deed281f..9600881e505abdeb8c4d5022d4f1c91c94907e80 100644 (file)
@@ -64,15 +64,15 @@ class HashMapDataStore implements DataStore, AutoCloseable {
 
     def RpcResult<Void> finish(HashMapDataStoreTransaction transaction) {
         val modification = transaction.modification;
-        configuration.putAll(modification.updatedConfigurationData);
-        operational.putAll(modification.updatedOperationalData);
-
         for (removal : modification.removedConfigurationData) {
             remove(configuration,removal);
         }
         for (removal : modification.removedOperationalData) {
             remove(operational,removal);
         }
+        configuration.putAll(modification.updatedConfigurationData);
+        operational.putAll(modification.updatedOperationalData);
+
         return Rpcs.getRpcResult(true, null, Collections.emptySet);
     }
     
index a9ec2c799289031908519fec8371ef276d356ed2..1e89281df498b34d82bea1f3e6b08574c0941a06 100644 (file)
@@ -70,7 +70,7 @@ class YangDataOperations {
         
         if(node.keyDefinition === null || node.keyDefinition.empty) {
             return modified;
-        } 
+        }
         val originalMap = (original as List).toIndexMap(node.keyDefinition);
         val modifiedMap = (modified as List).toIndexMap(node.keyDefinition);
         
@@ -80,7 +80,8 @@ class YangDataOperations {
             if(originalEntry != null) {
                 originalMap.remove(entry.key);
                 mergedNodes.add(merge(node,originalEntry,entry.value,configurational));
-                
+            } else {
+                mergedNodes.add(entry.value);
             }
         }
         mergedNodes.addAll(originalMap.values);
index 7f150626c08b3eca26e2d07797aa70cf519a7667..7f6918f2a1e7d7fbf89d8533f4b2719da9d6093c 100644 (file)
@@ -31,7 +31,6 @@ import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
-import org.opendaylight.yangtools.yang.model.api.YangNode;
 
 import static com.google.common.base.Preconditions.*;
 
@@ -127,11 +126,6 @@ public class YangSchemaUtils {
         public NetconfDataRootNode(SchemaContext schema) {
             // TODO Auto-generated constructor stub
         }
-
-        public YangNode getParent() {
-            // TODO Auto-generated method stub
-            return null;
-        }
     
         @Override
         public Set<TypeDefinition<?>> getTypeDefinitions() {
index d1e55c73e7db13a8efa65c38bc06a78b8b8ead6d..050a9925ff3f7f767af0c371ef651d2d3e0ba7a5 100644 (file)
@@ -33,7 +33,6 @@ import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
-import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
index 8c95545524244024092896e931306e29032f9baa..599fd714b8448452cd7da82d7784247c2f9a48cc 100644 (file)
@@ -45,7 +45,7 @@
                     <dependency>
                         <groupId>org.opendaylight.yangtools</groupId>
                         <artifactId>maven-sal-api-gen-plugin</artifactId>
-                        <version>${yang.codegen.version}</version>
+                        <version>${yangtools.version}</version>
                         <type>jar</type>
                     </dependency>
                 </dependencies>