/* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.controller.sal.binding.api.data; import java.util.Set; import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; import org.opendaylight.controller.sal.binding.api.BindingAwareProvider.ProviderFunctionality; import org.opendaylight.controller.sal.common.DataStoreIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; /** * Two phase commit handler (cohort) of the two-phase commit protocol of data. * *

* The provider should expose the implementation of DataCommitHandler if it's * functionality depends on any subset of data stored in data repositories, in * order to participate in {@link DataBrokerService#commit(DataStoreIdentifier) * operation. * *

* Operations of two-phase commit handlers should not change data in data store, * this is responsibility of the coordinator (broker or some component of the * broker). * * The commit handlers are responsible for changing the internal state of the * provider to reflect the commited changes in data. * *

Two-phase commit

* *

Commit Request Phase

* *
    *
  1. Consumer edits data by invocation of * DataBrokerService.editCandidateData(DataStoreIdentifier, DataRoot) *
  2. Consumer starts a commit by invoking * DataBrokerService.commit(DataStoreIdentifier) *
  3. Broker retrieves a list of all registered * DataCommitHandlers *
  4. For each DataCommitHandler *
      *
    1. Broker invokes a * DataCommitHandler.requestCommit(DataStoreIdentifier) operation. *
    2. DataCommitHandler returns a RpcResult with * CommitTransaction *
    3. If the result was successful, broker adds CommitTransaction * to the list of opened transactions. If not, brokers stops a commit request * phase and starts a rollback phase. *
    *
  5. Broker starts a commit finish phase *
* *

Commit Finish Phase

* *
    *
  1. For each CommitTransaction from Commit Request phase *
      *
    1. Broker broker invokes a * CommitTransaction.finish() *
    2. The provider finishes a commit (applies the change) and returns an * RpcResult. *
    *
  2. * *
* *

Commit Rollback Phase

*
  • For each CommitTransaction from Commit Request phase *
      *
    1. Broker * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * broker invokes a {@link CommitTransaction#finish()} *
    2. The provider rollbacks a commit and returns an {@link RpcResult} of * rollback.
    *
  • Broker returns a error result to the consumer. * * *

    Registration of functionality

    * The registration could be done by : * * * * */ public interface DataCommitHandler extends ProviderFunctionality { /** * A set of Data Stores supported by implementation. * * The set of {@link DataStoreIdentifier}s which identifies target data * stores which are supported by this commit handler. This set is used, when * {@link Provider} is registered to the SAL, to register and expose the * commit handler functionality to affected data stores. * * @return Set of Data Store identifiers */ Set getSupportedDataStores(); /** * The provider (commit handler) starts a commit transaction. * *

    * The commit handler (provider) prepares an commit scenario, rollback * scenario and validates data. * *

    * If the provider is aware that at this point the commit would not be * successful, the transaction is not created, but list of errors which * prevented the start of transaction are returned. * * @param store * @return Transaction object representing this commit, errors otherwise. */ RpcResult requestCommit(DataStoreIdentifier store); public interface CommitTransaction { /** * * @return Data store affected by the transaction */ DataStoreIdentifier getDataStore(); /** * Returns the handler associated with this transaction. * * @return Handler */ DataCommitHandler getHandler(); /** * * Finishes a commit. * * The provider (commit handler) should apply all changes to its state * which are a result of data change- * * @return */ RpcResult finish() throws IllegalStateException; /** * Rollbacks a commit. * * @return * @throws IllegalStateException * If the method is invoked after {@link #finish()} */ RpcResult rollback() throws IllegalStateException; } }