blob: 5570e30d2322d67f900b013125b2dd99ccd0b3f0 [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 {
Madan Jampanibff6d8f2015-03-31 16:53:47 -070037 private static final String TX_NOT_OPEN_ERROR = "Transaction Context is not open";
38
39 @SuppressWarnings("rawtypes")
40 private final Map<String, DefaultTransactionalMap> txMaps = Maps.newConcurrentMap();
Madan Jampani64689552015-02-17 10:00:27 -080041 private boolean isOpen = false;
Madan Jampanif1b8e172015-03-23 11:42:02 -070042 private final Database database;
Madan Jampanibff6d8f2015-03-31 16:53:47 -070043 private final long transactionId;
Madan Jampani64689552015-02-17 10:00:27 -080044
Madan Jampanibff6d8f2015-03-31 16:53:47 -070045 public DefaultTransactionContext(Database database, long transactionId) {
46 this.database = checkNotNull(database);
47 this.transactionId = transactionId;
48 }
49
50 @Override
51 public long transactionId() {
52 return transactionId;
Madan Jampani64689552015-02-17 10:00:27 -080053 }
54
55 @Override
56 public void begin() {
Madan Jampanibff6d8f2015-03-31 16:53:47 -070057 checkState(!isOpen, "Transaction Context is already open");
Madan Jampani64689552015-02-17 10:00:27 -080058 isOpen = true;
59 }
60
61 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -070062 public boolean isOpen() {
63 return isOpen;
64 }
65
66 @Override
Ray Milkey8dc82082015-02-20 16:22:38 -080067 @SuppressWarnings("unchecked")
Madan Jampanibff6d8f2015-03-31 16:53:47 -070068 public <K, V> TransactionalMap<K, V> getTransactionalMap(String mapName,
Madan Jampani64689552015-02-17 10:00:27 -080069 Serializer serializer) {
Madan Jampani64689552015-02-17 10:00:27 -080070 checkState(isOpen, TX_NOT_OPEN_ERROR);
Madan Jampanibff6d8f2015-03-31 16:53:47 -070071 checkNotNull(mapName);
72 checkNotNull(serializer);
73 return txMaps.computeIfAbsent(mapName, name -> new DefaultTransactionalMap<>(
74 name,
Madan Jampani02b7fb82015-05-01 13:01:20 -070075 new DefaultConsistentMap<>(name, database, serializer, false),
Madan Jampanibff6d8f2015-03-31 16:53:47 -070076 this,
77 serializer));
Madan Jampani64689552015-02-17 10:00:27 -080078 }
79
Ray Milkey8dc82082015-02-20 16:22:38 -080080 @SuppressWarnings("unchecked")
Madan Jampani64689552015-02-17 10:00:27 -080081 @Override
82 public void commit() {
83 checkState(isOpen, TX_NOT_OPEN_ERROR);
Madan Jampani64689552015-02-17 10:00:27 -080084 try {
Madan Jampanibff6d8f2015-03-31 16:53:47 -070085 List<DatabaseUpdate> updates = Lists.newLinkedList();
Madan Jampani64689552015-02-17 10:00:27 -080086 txMaps.values()
Madan Jampanibff6d8f2015-03-31 16:53:47 -070087 .forEach(m -> { updates.addAll(m.prepareDatabaseUpdates()); });
88 database.prepareAndCommit(new DefaultTransaction(transactionId, updates));
89 } catch (Exception e) {
90 abort();
91 throw new TransactionException(e);
Madan Jampani64689552015-02-17 10:00:27 -080092 } finally {
93 isOpen = false;
94 }
95 }
96
97 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -070098 public void abort() {
Madan Jampani64689552015-02-17 10:00:27 -080099 checkState(isOpen, TX_NOT_OPEN_ERROR);
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700100 txMaps.values().forEach(m -> m.rollback());
Madan Jampani64689552015-02-17 10:00:27 -0800101 }
Madan Jampani02b7fb82015-05-01 13:01:20 -0700102}