blob: f8e419168dad465418b436c7ffa1094a7eb2ff60 [file] [log] [blame]
Madan Jampani25461112015-02-17 14:17:29 -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 Jampani94c23532015-02-05 17:40:01 -080017package org.onosproject.store.consistent.impl;
18
Madan Jampani94c23532015-02-05 17:40:01 -080019import net.kuujo.copycat.state.StateMachine;
20import net.kuujo.copycat.resource.internal.AbstractResource;
Madan Jampanied1b7fc2015-04-27 23:30:07 -070021import net.kuujo.copycat.resource.internal.ResourceManager;
Madan Jampani94c23532015-02-05 17:40:01 -080022import net.kuujo.copycat.state.internal.DefaultStateMachine;
23import net.kuujo.copycat.util.concurrent.Futures;
24
25import java.util.Collection;
Madan Jampani94c23532015-02-05 17:40:01 -080026import java.util.Map;
27import java.util.Set;
28import java.util.concurrent.CompletableFuture;
29import java.util.function.Supplier;
30
Madan Jampani63c659f2015-06-11 00:52:58 -070031import org.onosproject.cluster.NodeId;
Madan Jampanibff6d8f2015-03-31 16:53:47 -070032import org.onosproject.store.service.Transaction;
Madan Jampani393e0f02015-02-12 07:35:39 +053033import org.onosproject.store.service.Versioned;
34
Madan Jampani94c23532015-02-05 17:40:01 -080035/**
36 * Default database.
37 */
38public class DefaultDatabase extends AbstractResource<Database> implements Database {
Madan Jampanif1b8e172015-03-23 11:42:02 -070039 private final StateMachine<DatabaseState<String, byte[]>> stateMachine;
40 private DatabaseProxy<String, byte[]> proxy;
Madan Jampani94c23532015-02-05 17:40:01 -080041
Madan Jampanibff6d8f2015-03-31 16:53:47 -070042 @SuppressWarnings({ "unchecked", "rawtypes" })
Madan Jampanied1b7fc2015-04-27 23:30:07 -070043 public DefaultDatabase(ResourceManager context) {
Madan Jampanif1b8e172015-03-23 11:42:02 -070044 super(context);
Madan Jampani40537ca2015-07-14 19:50:33 -070045 this.stateMachine = new DefaultStateMachine(context,
46 DatabaseState.class,
47 DefaultDatabaseState.class,
48 DefaultDatabase.class.getClassLoader());
Madan Jampani94c23532015-02-05 17:40:01 -080049 }
Madan Jampani94c23532015-02-05 17:40:01 -080050
Madan Jampanif1b8e172015-03-23 11:42:02 -070051 /**
52 * If the database is closed, returning a failed CompletableFuture. Otherwise, calls the given supplier to
53 * return the completed future result.
54 *
55 * @param supplier The supplier to call if the database is open.
56 * @param <T> The future result type.
57 * @return A completable future that if this database is closed is immediately failed.
58 */
59 protected <T> CompletableFuture<T> checkOpen(Supplier<CompletableFuture<T>> supplier) {
60 if (proxy == null) {
61 return Futures.exceptionalFuture(new IllegalStateException("Database closed"));
62 }
63 return supplier.get();
64 }
Madan Jampani94c23532015-02-05 17:40:01 -080065
Madan Jampanif1b8e172015-03-23 11:42:02 -070066 @Override
Madan Jampania89f8f92015-04-01 14:39:54 -070067 public CompletableFuture<Set<String>> tableNames() {
68 return checkOpen(() -> proxy.tableNames());
69 }
70
71 @Override
Madan Jampanib5d72d52015-04-03 16:53:50 -070072 public CompletableFuture<Map<String, Long>> counters() {
73 return checkOpen(() -> proxy.counters());
74 }
75
76 @Override
Madan Jampanif1b8e172015-03-23 11:42:02 -070077 public CompletableFuture<Integer> size(String tableName) {
78 return checkOpen(() -> proxy.size(tableName));
79 }
Madan Jampani94c23532015-02-05 17:40:01 -080080
Madan Jampanif1b8e172015-03-23 11:42:02 -070081 @Override
82 public CompletableFuture<Boolean> isEmpty(String tableName) {
83 return checkOpen(() -> proxy.isEmpty(tableName));
84 }
Madan Jampani94c23532015-02-05 17:40:01 -080085
Madan Jampanif1b8e172015-03-23 11:42:02 -070086 @Override
87 public CompletableFuture<Boolean> containsKey(String tableName, String key) {
88 return checkOpen(() -> proxy.containsKey(tableName, key));
89 }
Madan Jampani94c23532015-02-05 17:40:01 -080090
Madan Jampanif1b8e172015-03-23 11:42:02 -070091 @Override
92 public CompletableFuture<Boolean> containsValue(String tableName, byte[] value) {
93 return checkOpen(() -> proxy.containsValue(tableName, value));
94 }
Madan Jampani94c23532015-02-05 17:40:01 -080095
Madan Jampanif1b8e172015-03-23 11:42:02 -070096 @Override
97 public CompletableFuture<Versioned<byte[]>> get(String tableName, String key) {
98 return checkOpen(() -> proxy.get(tableName, key));
99 }
Madan Jampani94c23532015-02-05 17:40:01 -0800100
Madan Jampanif1b8e172015-03-23 11:42:02 -0700101 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700102 public CompletableFuture<Result<Versioned<byte[]>>> put(String tableName, String key, byte[] value) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700103 return checkOpen(() -> proxy.put(tableName, key, value));
104 }
Madan Jampani94c23532015-02-05 17:40:01 -0800105
Madan Jampanif1b8e172015-03-23 11:42:02 -0700106 @Override
Madan Jampani346d4f52015-05-04 11:09:39 -0700107 public CompletableFuture<Result<UpdateResult<Versioned<byte[]>>>> putAndGet(String tableName,
108 String key,
109 byte[] value) {
110 return checkOpen(() -> proxy.putAndGet(tableName, key, value));
111 }
112
113 @Override
114 public CompletableFuture<Result<UpdateResult<Versioned<byte[]>>>> putIfAbsentAndGet(String tableName,
115 String key,
116 byte[] value) {
117 return checkOpen(() -> proxy.putIfAbsentAndGet(tableName, key, value));
118 }
119
120 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700121 public CompletableFuture<Result<Versioned<byte[]>>> remove(String tableName, String key) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700122 return checkOpen(() -> proxy.remove(tableName, key));
123 }
Madan Jampani94c23532015-02-05 17:40:01 -0800124
Madan Jampanif1b8e172015-03-23 11:42:02 -0700125 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700126 public CompletableFuture<Result<Void>> clear(String tableName) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700127 return checkOpen(() -> proxy.clear(tableName));
128 }
Madan Jampani94c23532015-02-05 17:40:01 -0800129
Madan Jampanif1b8e172015-03-23 11:42:02 -0700130 @Override
131 public CompletableFuture<Set<String>> keySet(String tableName) {
132 return checkOpen(() -> proxy.keySet(tableName));
133 }
Madan Jampani94c23532015-02-05 17:40:01 -0800134
Madan Jampanif1b8e172015-03-23 11:42:02 -0700135 @Override
136 public CompletableFuture<Collection<Versioned<byte[]>>> values(String tableName) {
137 return checkOpen(() -> proxy.values(tableName));
138 }
Madan Jampani94c23532015-02-05 17:40:01 -0800139
Madan Jampanif1b8e172015-03-23 11:42:02 -0700140 @Override
141 public CompletableFuture<Set<Map.Entry<String, Versioned<byte[]>>>> entrySet(String tableName) {
142 return checkOpen(() -> proxy.entrySet(tableName));
143 }
Madan Jampani94c23532015-02-05 17:40:01 -0800144
Madan Jampanif1b8e172015-03-23 11:42:02 -0700145 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700146 public CompletableFuture<Result<Versioned<byte[]>>> putIfAbsent(String tableName, String key, byte[] value) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700147 return checkOpen(() -> proxy.putIfAbsent(tableName, key, value));
148 }
Madan Jampani94c23532015-02-05 17:40:01 -0800149
Madan Jampanif1b8e172015-03-23 11:42:02 -0700150 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700151 public CompletableFuture<Result<Boolean>> remove(String tableName, String key, byte[] value) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700152 return checkOpen(() -> proxy.remove(tableName, key, value));
153 }
Madan Jampani94c23532015-02-05 17:40:01 -0800154
Madan Jampanif1b8e172015-03-23 11:42:02 -0700155 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700156 public CompletableFuture<Result<Boolean>> remove(String tableName, String key, long version) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700157 return checkOpen(() -> proxy.remove(tableName, key, version));
158 }
Madan Jampani94c23532015-02-05 17:40:01 -0800159
Madan Jampanif1b8e172015-03-23 11:42:02 -0700160 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700161 public CompletableFuture<Result<Boolean>> replace(String tableName, String key, byte[] oldValue, byte[] newValue) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700162 return checkOpen(() -> proxy.replace(tableName, key, oldValue, newValue));
163 }
Madan Jampani94c23532015-02-05 17:40:01 -0800164
Madan Jampanif1b8e172015-03-23 11:42:02 -0700165 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700166 public CompletableFuture<Result<Boolean>> replace(String tableName, String key, long oldVersion, byte[] newValue) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700167 return checkOpen(() -> proxy.replace(tableName, key, oldVersion, newValue));
168 }
Madan Jampani94c23532015-02-05 17:40:01 -0800169
Madan Jampanif1b8e172015-03-23 11:42:02 -0700170 @Override
Madan Jampani346d4f52015-05-04 11:09:39 -0700171 public CompletableFuture<Result<UpdateResult<Versioned<byte[]>>>> replaceAndGet(String tableName,
172 String key,
173 long oldVersion,
174 byte[] newValue) {
175 return checkOpen(() -> proxy.replaceAndGet(tableName, key, oldVersion, newValue));
176 }
177
178 @Override
Madan Jampani04aeb452015-05-02 16:12:24 -0700179 public CompletableFuture<Long> counterGet(String counterName) {
180 return checkOpen(() -> proxy.counterGet(counterName));
Madan Jampanib5d72d52015-04-03 16:53:50 -0700181 }
182
183 @Override
Madan Jampani04aeb452015-05-02 16:12:24 -0700184 public CompletableFuture<Long> counterAddAndGet(String counterName, long delta) {
185 return checkOpen(() -> proxy.counterAddAndGet(counterName, delta));
186 }
187
188 @Override
189 public CompletableFuture<Long> counterGetAndAdd(String counterName, long delta) {
190 return checkOpen(() -> proxy.counterGetAndAdd(counterName, delta));
Madan Jampanib5d72d52015-04-03 16:53:50 -0700191 }
192
193 @Override
Madan Jampani63c659f2015-06-11 00:52:58 -0700194 public CompletableFuture<Long> queueSize(String queueName) {
195 return checkOpen(() -> proxy.queueSize(queueName));
196 }
197
198 @Override
199 public CompletableFuture<Set<NodeId>> queuePush(String queueName, byte[] entry) {
200 return checkOpen(() -> proxy.queuePush(queueName, entry));
201 }
202
203 @Override
204 public CompletableFuture<byte[]> queuePop(String queueName, NodeId nodeId) {
205 return checkOpen(() -> proxy.queuePop(queueName, nodeId));
206 }
207
208 @Override
209 public CompletableFuture<byte[]> queuePeek(String queueName) {
210 return checkOpen(() -> proxy.queuePeek(queueName));
211 }
212
213 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700214 public CompletableFuture<Boolean> prepareAndCommit(Transaction transaction) {
215 return checkOpen(() -> proxy.prepareAndCommit(transaction));
216 }
217
218 @Override
219 public CompletableFuture<Boolean> prepare(Transaction transaction) {
220 return checkOpen(() -> proxy.prepare(transaction));
221 }
222
223 @Override
224 public CompletableFuture<Boolean> commit(Transaction transaction) {
225 return checkOpen(() -> proxy.commit(transaction));
226 }
227
228 @Override
229 public CompletableFuture<Boolean> rollback(Transaction transaction) {
230 return checkOpen(() -> proxy.rollback(transaction));
Madan Jampanif1b8e172015-03-23 11:42:02 -0700231 }
Madan Jampani94c23532015-02-05 17:40:01 -0800232
Madan Jampanif1b8e172015-03-23 11:42:02 -0700233 @Override
234 @SuppressWarnings("unchecked")
235 public synchronized CompletableFuture<Database> open() {
236 return runStartupTasks()
237 .thenCompose(v -> stateMachine.open())
238 .thenRun(() -> {
239 this.proxy = stateMachine.createProxy(DatabaseProxy.class, this.getClass().getClassLoader());
240 })
241 .thenApply(v -> null);
242 }
243
244 @Override
245 public synchronized CompletableFuture<Void> close() {
246 proxy = null;
247 return stateMachine.close()
248 .thenCompose(v -> runShutdownTasks());
249 }
250
251 @Override
252 public int hashCode() {
253 return name().hashCode();
254 }
255
256 @Override
257 public boolean equals(Object other) {
258 if (other instanceof Database) {
259 return name().equals(((Database) other).name());
260 }
261 return false;
262 }
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700263}