blob: 8cbe99fcb1b8c123857f83541f2e4d223b117c80 [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
Madan Jampanif4c88502016-01-21 12:35:36 -080017package org.onosproject.store.primitives.impl;
Madan Jampani64689552015-02-17 10:00:27 -080018
19import java.util.List;
20import java.util.Map;
Madan Jampani50589ac2015-06-08 11:38:46 -070021import java.util.function.Supplier;
Madan Jampani64689552015-02-17 10:00:27 -080022
23import static com.google.common.base.Preconditions.*;
24
Madan Jampani50589ac2015-06-08 11:38:46 -070025import org.onosproject.store.service.ConsistentMapBuilder;
Madan Jampanibff6d8f2015-03-31 16:53:47 -070026import org.onosproject.store.service.DatabaseUpdate;
Madan Jampani64689552015-02-17 10:00:27 -080027import org.onosproject.store.service.Serializer;
Madan Jampanibab51a42015-08-10 13:53:35 -070028import org.onosproject.store.service.Transaction;
Madan Jampani64689552015-02-17 10:00:27 -080029import org.onosproject.store.service.TransactionContext;
Madan Jampani64689552015-02-17 10:00:27 -080030import org.onosproject.store.service.TransactionalMap;
Madan Jampani64689552015-02-17 10:00:27 -080031
HIGUCHI Yutadc4394c2016-01-29 15:35:10 -080032import com.google.common.base.MoreObjects;
33import com.google.common.base.MoreObjects.ToStringHelper;
Madan Jampani64689552015-02-17 10:00:27 -080034import com.google.common.collect.Lists;
35import com.google.common.collect.Maps;
Madan Jampanibab51a42015-08-10 13:53:35 -070036import com.google.common.util.concurrent.Futures;
Madan Jampani64689552015-02-17 10:00:27 -080037
38/**
39 * Default TransactionContext implementation.
40 */
41public class DefaultTransactionContext implements TransactionContext {
Madan Jampanibff6d8f2015-03-31 16:53:47 -070042 private static final String TX_NOT_OPEN_ERROR = "Transaction Context is not open";
43
44 @SuppressWarnings("rawtypes")
45 private final Map<String, DefaultTransactionalMap> txMaps = Maps.newConcurrentMap();
Madan Jampani64689552015-02-17 10:00:27 -080046 private boolean isOpen = false;
Madan Jampanif1b8e172015-03-23 11:42:02 -070047 private final Database database;
Madan Jampanibff6d8f2015-03-31 16:53:47 -070048 private final long transactionId;
Madan Jampani50589ac2015-06-08 11:38:46 -070049 private final Supplier<ConsistentMapBuilder> mapBuilderSupplier;
Madan Jampani64689552015-02-17 10:00:27 -080050
Madan Jampani50589ac2015-06-08 11:38:46 -070051 public DefaultTransactionContext(long transactionId,
52 Database database,
53 Supplier<ConsistentMapBuilder> mapBuilderSupplier) {
Madan Jampanibff6d8f2015-03-31 16:53:47 -070054 this.transactionId = transactionId;
Madan Jampani50589ac2015-06-08 11:38:46 -070055 this.database = checkNotNull(database);
56 this.mapBuilderSupplier = checkNotNull(mapBuilderSupplier);
Madan Jampanibff6d8f2015-03-31 16:53:47 -070057 }
58
59 @Override
60 public long transactionId() {
61 return transactionId;
Madan Jampani64689552015-02-17 10:00:27 -080062 }
63
64 @Override
65 public void begin() {
Madan Jampanibff6d8f2015-03-31 16:53:47 -070066 checkState(!isOpen, "Transaction Context is already open");
Madan Jampani64689552015-02-17 10:00:27 -080067 isOpen = true;
68 }
69
70 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -070071 public boolean isOpen() {
72 return isOpen;
73 }
74
75 @Override
Ray Milkey8dc82082015-02-20 16:22:38 -080076 @SuppressWarnings("unchecked")
Madan Jampanibff6d8f2015-03-31 16:53:47 -070077 public <K, V> TransactionalMap<K, V> getTransactionalMap(String mapName,
Madan Jampani64689552015-02-17 10:00:27 -080078 Serializer serializer) {
Madan Jampani64689552015-02-17 10:00:27 -080079 checkState(isOpen, TX_NOT_OPEN_ERROR);
Madan Jampanibff6d8f2015-03-31 16:53:47 -070080 checkNotNull(mapName);
81 checkNotNull(serializer);
82 return txMaps.computeIfAbsent(mapName, name -> new DefaultTransactionalMap<>(
83 name,
Madan Jampani50589ac2015-06-08 11:38:46 -070084 mapBuilderSupplier.get().withName(name).withSerializer(serializer).build(),
Madan Jampanibff6d8f2015-03-31 16:53:47 -070085 this,
86 serializer));
Madan Jampani64689552015-02-17 10:00:27 -080087 }
88
Ray Milkey8dc82082015-02-20 16:22:38 -080089 @SuppressWarnings("unchecked")
Madan Jampani64689552015-02-17 10:00:27 -080090 @Override
Sho SHIMIZUd936b422015-11-02 16:38:18 -080091 public boolean commit() {
Madan Jampanibab51a42015-08-10 13:53:35 -070092 // TODO: rework commit implementation to be more intuitive
Madan Jampani64689552015-02-17 10:00:27 -080093 checkState(isOpen, TX_NOT_OPEN_ERROR);
Madan Jampanibab51a42015-08-10 13:53:35 -070094 CommitResponse response = null;
Madan Jampani64689552015-02-17 10:00:27 -080095 try {
Madan Jampanibff6d8f2015-03-31 16:53:47 -070096 List<DatabaseUpdate> updates = Lists.newLinkedList();
Madan Jampanibab51a42015-08-10 13:53:35 -070097 txMaps.values().forEach(m -> updates.addAll(m.prepareDatabaseUpdates()));
98 Transaction transaction = new DefaultTransaction(transactionId, updates);
99 response = Futures.getUnchecked(database.prepareAndCommit(transaction));
Sho SHIMIZUd936b422015-11-02 16:38:18 -0800100 return response.success();
101 } catch (Exception e) {
102 abort();
103 return false;
Madan Jampani64689552015-02-17 10:00:27 -0800104 } finally {
105 isOpen = false;
106 }
107 }
108
109 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700110 public void abort() {
Madan Jampanibab51a42015-08-10 13:53:35 -0700111 if (isOpen) {
112 try {
113 txMaps.values().forEach(m -> m.rollback());
114 } finally {
115 isOpen = false;
116 }
117 }
Madan Jampani64689552015-02-17 10:00:27 -0800118 }
HIGUCHI Yutadc4394c2016-01-29 15:35:10 -0800119
120 @Override
121 public String toString() {
122 ToStringHelper s = MoreObjects.toStringHelper(this)
123 .add("transactionId", transactionId)
124 .add("isOpen", isOpen);
125
126 txMaps.entrySet().forEach(e -> {
127 s.add(e.getKey(), e.getValue());
128 });
129 return s.toString();
130 }
Madan Jampani02b7fb82015-05-01 13:01:20 -0700131}