blob: 5d0ca83fe7ec49d5f63f188ea5b66f31b3eaa449 [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);
45 this.stateMachine = new DefaultStateMachine(context, DatabaseState.class, DefaultDatabaseState.class);
Madan Jampani94c23532015-02-05 17:40:01 -080046 }
Madan Jampani94c23532015-02-05 17:40:01 -080047
Madan Jampanif1b8e172015-03-23 11:42:02 -070048 /**
49 * If the database is closed, returning a failed CompletableFuture. Otherwise, calls the given supplier to
50 * return the completed future result.
51 *
52 * @param supplier The supplier to call if the database is open.
53 * @param <T> The future result type.
54 * @return A completable future that if this database is closed is immediately failed.
55 */
56 protected <T> CompletableFuture<T> checkOpen(Supplier<CompletableFuture<T>> supplier) {
57 if (proxy == null) {
58 return Futures.exceptionalFuture(new IllegalStateException("Database closed"));
59 }
60 return supplier.get();
61 }
Madan Jampani94c23532015-02-05 17:40:01 -080062
Madan Jampanif1b8e172015-03-23 11:42:02 -070063 @Override
Madan Jampania89f8f92015-04-01 14:39:54 -070064 public CompletableFuture<Set<String>> tableNames() {
65 return checkOpen(() -> proxy.tableNames());
66 }
67
68 @Override
Madan Jampanib5d72d52015-04-03 16:53:50 -070069 public CompletableFuture<Map<String, Long>> counters() {
70 return checkOpen(() -> proxy.counters());
71 }
72
73 @Override
Madan Jampanif1b8e172015-03-23 11:42:02 -070074 public CompletableFuture<Integer> size(String tableName) {
75 return checkOpen(() -> proxy.size(tableName));
76 }
Madan Jampani94c23532015-02-05 17:40:01 -080077
Madan Jampanif1b8e172015-03-23 11:42:02 -070078 @Override
79 public CompletableFuture<Boolean> isEmpty(String tableName) {
80 return checkOpen(() -> proxy.isEmpty(tableName));
81 }
Madan Jampani94c23532015-02-05 17:40:01 -080082
Madan Jampanif1b8e172015-03-23 11:42:02 -070083 @Override
84 public CompletableFuture<Boolean> containsKey(String tableName, String key) {
85 return checkOpen(() -> proxy.containsKey(tableName, key));
86 }
Madan Jampani94c23532015-02-05 17:40:01 -080087
Madan Jampanif1b8e172015-03-23 11:42:02 -070088 @Override
89 public CompletableFuture<Boolean> containsValue(String tableName, byte[] value) {
90 return checkOpen(() -> proxy.containsValue(tableName, value));
91 }
Madan Jampani94c23532015-02-05 17:40:01 -080092
Madan Jampanif1b8e172015-03-23 11:42:02 -070093 @Override
94 public CompletableFuture<Versioned<byte[]>> get(String tableName, String key) {
95 return checkOpen(() -> proxy.get(tableName, key));
96 }
Madan Jampani94c23532015-02-05 17:40:01 -080097
Madan Jampanif1b8e172015-03-23 11:42:02 -070098 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -070099 public CompletableFuture<Result<Versioned<byte[]>>> put(String tableName, String key, byte[] value) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700100 return checkOpen(() -> proxy.put(tableName, key, value));
101 }
Madan Jampani94c23532015-02-05 17:40:01 -0800102
Madan Jampanif1b8e172015-03-23 11:42:02 -0700103 @Override
Madan Jampani346d4f52015-05-04 11:09:39 -0700104 public CompletableFuture<Result<UpdateResult<Versioned<byte[]>>>> putAndGet(String tableName,
105 String key,
106 byte[] value) {
107 return checkOpen(() -> proxy.putAndGet(tableName, key, value));
108 }
109
110 @Override
111 public CompletableFuture<Result<UpdateResult<Versioned<byte[]>>>> putIfAbsentAndGet(String tableName,
112 String key,
113 byte[] value) {
114 return checkOpen(() -> proxy.putIfAbsentAndGet(tableName, key, value));
115 }
116
117 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700118 public CompletableFuture<Result<Versioned<byte[]>>> remove(String tableName, String key) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700119 return checkOpen(() -> proxy.remove(tableName, key));
120 }
Madan Jampani94c23532015-02-05 17:40:01 -0800121
Madan Jampanif1b8e172015-03-23 11:42:02 -0700122 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700123 public CompletableFuture<Result<Void>> clear(String tableName) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700124 return checkOpen(() -> proxy.clear(tableName));
125 }
Madan Jampani94c23532015-02-05 17:40:01 -0800126
Madan Jampanif1b8e172015-03-23 11:42:02 -0700127 @Override
128 public CompletableFuture<Set<String>> keySet(String tableName) {
129 return checkOpen(() -> proxy.keySet(tableName));
130 }
Madan Jampani94c23532015-02-05 17:40:01 -0800131
Madan Jampanif1b8e172015-03-23 11:42:02 -0700132 @Override
133 public CompletableFuture<Collection<Versioned<byte[]>>> values(String tableName) {
134 return checkOpen(() -> proxy.values(tableName));
135 }
Madan Jampani94c23532015-02-05 17:40:01 -0800136
Madan Jampanif1b8e172015-03-23 11:42:02 -0700137 @Override
138 public CompletableFuture<Set<Map.Entry<String, Versioned<byte[]>>>> entrySet(String tableName) {
139 return checkOpen(() -> proxy.entrySet(tableName));
140 }
Madan Jampani94c23532015-02-05 17:40:01 -0800141
Madan Jampanif1b8e172015-03-23 11:42:02 -0700142 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700143 public CompletableFuture<Result<Versioned<byte[]>>> putIfAbsent(String tableName, String key, byte[] value) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700144 return checkOpen(() -> proxy.putIfAbsent(tableName, key, value));
145 }
Madan Jampani94c23532015-02-05 17:40:01 -0800146
Madan Jampanif1b8e172015-03-23 11:42:02 -0700147 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700148 public CompletableFuture<Result<Boolean>> remove(String tableName, String key, byte[] value) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700149 return checkOpen(() -> proxy.remove(tableName, key, value));
150 }
Madan Jampani94c23532015-02-05 17:40:01 -0800151
Madan Jampanif1b8e172015-03-23 11:42:02 -0700152 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700153 public CompletableFuture<Result<Boolean>> remove(String tableName, String key, long version) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700154 return checkOpen(() -> proxy.remove(tableName, key, version));
155 }
Madan Jampani94c23532015-02-05 17:40:01 -0800156
Madan Jampanif1b8e172015-03-23 11:42:02 -0700157 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700158 public CompletableFuture<Result<Boolean>> replace(String tableName, String key, byte[] oldValue, byte[] newValue) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700159 return checkOpen(() -> proxy.replace(tableName, key, oldValue, newValue));
160 }
Madan Jampani94c23532015-02-05 17:40:01 -0800161
Madan Jampanif1b8e172015-03-23 11:42:02 -0700162 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700163 public CompletableFuture<Result<Boolean>> replace(String tableName, String key, long oldVersion, byte[] newValue) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700164 return checkOpen(() -> proxy.replace(tableName, key, oldVersion, newValue));
165 }
Madan Jampani94c23532015-02-05 17:40:01 -0800166
Madan Jampanif1b8e172015-03-23 11:42:02 -0700167 @Override
Madan Jampani346d4f52015-05-04 11:09:39 -0700168 public CompletableFuture<Result<UpdateResult<Versioned<byte[]>>>> replaceAndGet(String tableName,
169 String key,
170 long oldVersion,
171 byte[] newValue) {
172 return checkOpen(() -> proxy.replaceAndGet(tableName, key, oldVersion, newValue));
173 }
174
175 @Override
Madan Jampani04aeb452015-05-02 16:12:24 -0700176 public CompletableFuture<Long> counterGet(String counterName) {
177 return checkOpen(() -> proxy.counterGet(counterName));
Madan Jampanib5d72d52015-04-03 16:53:50 -0700178 }
179
180 @Override
Madan Jampani04aeb452015-05-02 16:12:24 -0700181 public CompletableFuture<Long> counterAddAndGet(String counterName, long delta) {
182 return checkOpen(() -> proxy.counterAddAndGet(counterName, delta));
183 }
184
185 @Override
186 public CompletableFuture<Long> counterGetAndAdd(String counterName, long delta) {
187 return checkOpen(() -> proxy.counterGetAndAdd(counterName, delta));
Madan Jampanib5d72d52015-04-03 16:53:50 -0700188 }
189
190 @Override
Madan Jampani63c659f2015-06-11 00:52:58 -0700191 public CompletableFuture<Long> queueSize(String queueName) {
192 return checkOpen(() -> proxy.queueSize(queueName));
193 }
194
195 @Override
196 public CompletableFuture<Set<NodeId>> queuePush(String queueName, byte[] entry) {
197 return checkOpen(() -> proxy.queuePush(queueName, entry));
198 }
199
200 @Override
201 public CompletableFuture<byte[]> queuePop(String queueName, NodeId nodeId) {
202 return checkOpen(() -> proxy.queuePop(queueName, nodeId));
203 }
204
205 @Override
206 public CompletableFuture<byte[]> queuePeek(String queueName) {
207 return checkOpen(() -> proxy.queuePeek(queueName));
208 }
209
210 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700211 public CompletableFuture<Boolean> prepareAndCommit(Transaction transaction) {
212 return checkOpen(() -> proxy.prepareAndCommit(transaction));
213 }
214
215 @Override
216 public CompletableFuture<Boolean> prepare(Transaction transaction) {
217 return checkOpen(() -> proxy.prepare(transaction));
218 }
219
220 @Override
221 public CompletableFuture<Boolean> commit(Transaction transaction) {
222 return checkOpen(() -> proxy.commit(transaction));
223 }
224
225 @Override
226 public CompletableFuture<Boolean> rollback(Transaction transaction) {
227 return checkOpen(() -> proxy.rollback(transaction));
Madan Jampanif1b8e172015-03-23 11:42:02 -0700228 }
Madan Jampani94c23532015-02-05 17:40:01 -0800229
Madan Jampanif1b8e172015-03-23 11:42:02 -0700230 @Override
231 @SuppressWarnings("unchecked")
232 public synchronized CompletableFuture<Database> open() {
233 return runStartupTasks()
234 .thenCompose(v -> stateMachine.open())
235 .thenRun(() -> {
236 this.proxy = stateMachine.createProxy(DatabaseProxy.class, this.getClass().getClassLoader());
237 })
238 .thenApply(v -> null);
239 }
240
241 @Override
242 public synchronized CompletableFuture<Void> close() {
243 proxy = null;
244 return stateMachine.close()
245 .thenCompose(v -> runShutdownTasks());
246 }
247
248 @Override
249 public int hashCode() {
250 return name().hashCode();
251 }
252
253 @Override
254 public boolean equals(Object other) {
255 if (other instanceof Database) {
256 return name().equals(((Database) other).name());
257 }
258 return false;
259 }
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700260}