blob: b0ab575b686dddc5f704bfc421a0c4a4fe9ae9ca [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 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;
28import org.onosproject.store.service.TransactionContext;
29import org.onosproject.store.service.TransactionException;
30import org.onosproject.store.service.TransactionalMap;
Madan Jampani64689552015-02-17 10:00:27 -080031
32import com.google.common.collect.Lists;
33import com.google.common.collect.Maps;
34
35/**
36 * Default TransactionContext implementation.
37 */
38public class DefaultTransactionContext implements TransactionContext {
Madan Jampanibff6d8f2015-03-31 16:53:47 -070039 private static final String TX_NOT_OPEN_ERROR = "Transaction Context is not open";
40
41 @SuppressWarnings("rawtypes")
42 private final Map<String, DefaultTransactionalMap> txMaps = Maps.newConcurrentMap();
Madan Jampani64689552015-02-17 10:00:27 -080043 private boolean isOpen = false;
Madan Jampanif1b8e172015-03-23 11:42:02 -070044 private final Database database;
Madan Jampanibff6d8f2015-03-31 16:53:47 -070045 private final long transactionId;
Madan Jampani50589ac2015-06-08 11:38:46 -070046 private final Supplier<ConsistentMapBuilder> mapBuilderSupplier;
Madan Jampani64689552015-02-17 10:00:27 -080047
Madan Jampani50589ac2015-06-08 11:38:46 -070048 public DefaultTransactionContext(long transactionId,
49 Database database,
50 Supplier<ConsistentMapBuilder> mapBuilderSupplier) {
Madan Jampanibff6d8f2015-03-31 16:53:47 -070051 this.transactionId = transactionId;
Madan Jampani50589ac2015-06-08 11:38:46 -070052 this.database = checkNotNull(database);
53 this.mapBuilderSupplier = checkNotNull(mapBuilderSupplier);
Madan Jampanibff6d8f2015-03-31 16:53:47 -070054 }
55
56 @Override
57 public long transactionId() {
58 return transactionId;
Madan Jampani64689552015-02-17 10:00:27 -080059 }
60
61 @Override
62 public void begin() {
Madan Jampanibff6d8f2015-03-31 16:53:47 -070063 checkState(!isOpen, "Transaction Context is already open");
Madan Jampani64689552015-02-17 10:00:27 -080064 isOpen = true;
65 }
66
67 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -070068 public boolean isOpen() {
69 return isOpen;
70 }
71
72 @Override
Ray Milkey8dc82082015-02-20 16:22:38 -080073 @SuppressWarnings("unchecked")
Madan Jampanibff6d8f2015-03-31 16:53:47 -070074 public <K, V> TransactionalMap<K, V> getTransactionalMap(String mapName,
Madan Jampani64689552015-02-17 10:00:27 -080075 Serializer serializer) {
Madan Jampani64689552015-02-17 10:00:27 -080076 checkState(isOpen, TX_NOT_OPEN_ERROR);
Madan Jampanibff6d8f2015-03-31 16:53:47 -070077 checkNotNull(mapName);
78 checkNotNull(serializer);
79 return txMaps.computeIfAbsent(mapName, name -> new DefaultTransactionalMap<>(
80 name,
Madan Jampani50589ac2015-06-08 11:38:46 -070081 mapBuilderSupplier.get().withName(name).withSerializer(serializer).build(),
Madan Jampanibff6d8f2015-03-31 16:53:47 -070082 this,
83 serializer));
Madan Jampani64689552015-02-17 10:00:27 -080084 }
85
Ray Milkey8dc82082015-02-20 16:22:38 -080086 @SuppressWarnings("unchecked")
Madan Jampani64689552015-02-17 10:00:27 -080087 @Override
88 public void commit() {
89 checkState(isOpen, TX_NOT_OPEN_ERROR);
Madan Jampani64689552015-02-17 10:00:27 -080090 try {
Madan Jampanibff6d8f2015-03-31 16:53:47 -070091 List<DatabaseUpdate> updates = Lists.newLinkedList();
Madan Jampani64689552015-02-17 10:00:27 -080092 txMaps.values()
Madan Jampanibff6d8f2015-03-31 16:53:47 -070093 .forEach(m -> { updates.addAll(m.prepareDatabaseUpdates()); });
Madan Jampani50589ac2015-06-08 11:38:46 -070094 // FIXME: Updates made via transactional context currently do not result in notifications. (ONOS-2097)
Madan Jampanibff6d8f2015-03-31 16:53:47 -070095 database.prepareAndCommit(new DefaultTransaction(transactionId, updates));
96 } catch (Exception e) {
97 abort();
98 throw new TransactionException(e);
Madan Jampani64689552015-02-17 10:00:27 -080099 } finally {
100 isOpen = false;
101 }
102 }
103
104 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700105 public void abort() {
Madan Jampani64689552015-02-17 10:00:27 -0800106 checkState(isOpen, TX_NOT_OPEN_ERROR);
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700107 txMaps.values().forEach(m -> m.rollback());
Madan Jampani64689552015-02-17 10:00:27 -0800108 }
Madan Jampani02b7fb82015-05-01 13:01:20 -0700109}