blob: 9d13833fb76ca1e8e034b764ac704ef700b78435 [file] [log] [blame]
Madan Jampani64689552015-02-17 10:00:27 -08001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.store.consistent.impl;
18
19import java.util.List;
20import java.util.Map;
Madan Jampani64689552015-02-17 10:00:27 -080021
22import static com.google.common.base.Preconditions.*;
23
Madan Jampanibff6d8f2015-03-31 16:53:47 -070024import org.onosproject.store.service.DatabaseUpdate;
Madan Jampani64689552015-02-17 10:00:27 -080025import org.onosproject.store.service.Serializer;
26import org.onosproject.store.service.TransactionContext;
27import org.onosproject.store.service.TransactionException;
28import org.onosproject.store.service.TransactionalMap;
Madan Jampani64689552015-02-17 10:00:27 -080029
30import com.google.common.collect.Lists;
31import com.google.common.collect.Maps;
32
33/**
34 * Default TransactionContext implementation.
35 */
36public class DefaultTransactionContext implements TransactionContext {
37
Madan Jampanibff6d8f2015-03-31 16:53:47 -070038 private static final String TX_NOT_OPEN_ERROR = "Transaction Context is not open";
39
40 @SuppressWarnings("rawtypes")
41 private final Map<String, DefaultTransactionalMap> txMaps = Maps.newConcurrentMap();
Madan Jampani64689552015-02-17 10:00:27 -080042 private boolean isOpen = false;
Madan Jampanif1b8e172015-03-23 11:42:02 -070043 private final Database database;
Madan Jampanibff6d8f2015-03-31 16:53:47 -070044 private final long transactionId;
Madan Jampani64689552015-02-17 10:00:27 -080045
Madan Jampanibff6d8f2015-03-31 16:53:47 -070046 public DefaultTransactionContext(Database database, long transactionId) {
47 this.database = checkNotNull(database);
48 this.transactionId = transactionId;
49 }
50
51 @Override
52 public long transactionId() {
53 return transactionId;
Madan Jampani64689552015-02-17 10:00:27 -080054 }
55
56 @Override
57 public void begin() {
Madan Jampanibff6d8f2015-03-31 16:53:47 -070058 checkState(!isOpen, "Transaction Context is already open");
Madan Jampani64689552015-02-17 10:00:27 -080059 isOpen = true;
60 }
61
62 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -070063 public boolean isOpen() {
64 return isOpen;
65 }
66
67 @Override
Ray Milkey8dc82082015-02-20 16:22:38 -080068 @SuppressWarnings("unchecked")
Madan Jampanibff6d8f2015-03-31 16:53:47 -070069 public <K, V> TransactionalMap<K, V> getTransactionalMap(String mapName,
Madan Jampani64689552015-02-17 10:00:27 -080070 Serializer serializer) {
Madan Jampani64689552015-02-17 10:00:27 -080071 checkState(isOpen, TX_NOT_OPEN_ERROR);
Madan Jampanibff6d8f2015-03-31 16:53:47 -070072 checkNotNull(mapName);
73 checkNotNull(serializer);
74 return txMaps.computeIfAbsent(mapName, name -> new DefaultTransactionalMap<>(
75 name,
76 new DefaultConsistentMap<>(name, database, serializer),
77 this,
78 serializer));
Madan Jampani64689552015-02-17 10:00:27 -080079 }
80
Ray Milkey8dc82082015-02-20 16:22:38 -080081 @SuppressWarnings("unchecked")
Madan Jampani64689552015-02-17 10:00:27 -080082 @Override
83 public void commit() {
84 checkState(isOpen, TX_NOT_OPEN_ERROR);
Madan Jampani64689552015-02-17 10:00:27 -080085 try {
Madan Jampanibff6d8f2015-03-31 16:53:47 -070086 List<DatabaseUpdate> updates = Lists.newLinkedList();
Madan Jampani64689552015-02-17 10:00:27 -080087 txMaps.values()
Madan Jampanibff6d8f2015-03-31 16:53:47 -070088 .forEach(m -> { updates.addAll(m.prepareDatabaseUpdates()); });
89 database.prepareAndCommit(new DefaultTransaction(transactionId, updates));
90 } catch (Exception e) {
91 abort();
92 throw new TransactionException(e);
Madan Jampani64689552015-02-17 10:00:27 -080093 } finally {
94 isOpen = false;
95 }
96 }
97
98 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -070099 public void abort() {
Madan Jampani64689552015-02-17 10:00:27 -0800100 checkState(isOpen, TX_NOT_OPEN_ERROR);
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700101 txMaps.values().forEach(m -> m.rollback());
Madan Jampani64689552015-02-17 10:00:27 -0800102 }
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700103}