blob: 52a1b20a7d7e7a10361d926a3231a5b9832314fb [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 Jampanibff6d8f2015-03-31 16:53:47 -070031import org.onosproject.store.service.Transaction;
Madan Jampani393e0f02015-02-12 07:35:39 +053032import org.onosproject.store.service.Versioned;
33
Madan Jampani94c23532015-02-05 17:40:01 -080034/**
35 * Default database.
36 */
37public class DefaultDatabase extends AbstractResource<Database> implements Database {
Madan Jampanif1b8e172015-03-23 11:42:02 -070038 private final StateMachine<DatabaseState<String, byte[]>> stateMachine;
39 private DatabaseProxy<String, byte[]> proxy;
Madan Jampani94c23532015-02-05 17:40:01 -080040
Madan Jampanibff6d8f2015-03-31 16:53:47 -070041 @SuppressWarnings({ "unchecked", "rawtypes" })
Madan Jampanied1b7fc2015-04-27 23:30:07 -070042 public DefaultDatabase(ResourceManager context) {
Madan Jampanif1b8e172015-03-23 11:42:02 -070043 super(context);
44 this.stateMachine = new DefaultStateMachine(context, DatabaseState.class, DefaultDatabaseState.class);
Madan Jampani94c23532015-02-05 17:40:01 -080045 }
Madan Jampani94c23532015-02-05 17:40:01 -080046
Madan Jampanif1b8e172015-03-23 11:42:02 -070047 /**
48 * If the database is closed, returning a failed CompletableFuture. Otherwise, calls the given supplier to
49 * return the completed future result.
50 *
51 * @param supplier The supplier to call if the database is open.
52 * @param <T> The future result type.
53 * @return A completable future that if this database is closed is immediately failed.
54 */
55 protected <T> CompletableFuture<T> checkOpen(Supplier<CompletableFuture<T>> supplier) {
56 if (proxy == null) {
57 return Futures.exceptionalFuture(new IllegalStateException("Database closed"));
58 }
59 return supplier.get();
60 }
Madan Jampani94c23532015-02-05 17:40:01 -080061
Madan Jampanif1b8e172015-03-23 11:42:02 -070062 @Override
Madan Jampania89f8f92015-04-01 14:39:54 -070063 public CompletableFuture<Set<String>> tableNames() {
64 return checkOpen(() -> proxy.tableNames());
65 }
66
67 @Override
Madan Jampanib5d72d52015-04-03 16:53:50 -070068 public CompletableFuture<Map<String, Long>> counters() {
69 return checkOpen(() -> proxy.counters());
70 }
71
72 @Override
Madan Jampanif1b8e172015-03-23 11:42:02 -070073 public CompletableFuture<Integer> size(String tableName) {
74 return checkOpen(() -> proxy.size(tableName));
75 }
Madan Jampani94c23532015-02-05 17:40:01 -080076
Madan Jampanif1b8e172015-03-23 11:42:02 -070077 @Override
78 public CompletableFuture<Boolean> isEmpty(String tableName) {
79 return checkOpen(() -> proxy.isEmpty(tableName));
80 }
Madan Jampani94c23532015-02-05 17:40:01 -080081
Madan Jampanif1b8e172015-03-23 11:42:02 -070082 @Override
83 public CompletableFuture<Boolean> containsKey(String tableName, String key) {
84 return checkOpen(() -> proxy.containsKey(tableName, key));
85 }
Madan Jampani94c23532015-02-05 17:40:01 -080086
Madan Jampanif1b8e172015-03-23 11:42:02 -070087 @Override
88 public CompletableFuture<Boolean> containsValue(String tableName, byte[] value) {
89 return checkOpen(() -> proxy.containsValue(tableName, value));
90 }
Madan Jampani94c23532015-02-05 17:40:01 -080091
Madan Jampanif1b8e172015-03-23 11:42:02 -070092 @Override
93 public CompletableFuture<Versioned<byte[]>> get(String tableName, String key) {
94 return checkOpen(() -> proxy.get(tableName, key));
95 }
Madan Jampani94c23532015-02-05 17:40:01 -080096
Madan Jampanif1b8e172015-03-23 11:42:02 -070097 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -070098 public CompletableFuture<Result<Versioned<byte[]>>> put(String tableName, String key, byte[] value) {
Madan Jampanif1b8e172015-03-23 11:42:02 -070099 return checkOpen(() -> proxy.put(tableName, key, value));
100 }
Madan Jampani94c23532015-02-05 17:40:01 -0800101
Madan Jampanif1b8e172015-03-23 11:42:02 -0700102 @Override
Madan Jampani346d4f52015-05-04 11:09:39 -0700103 public CompletableFuture<Result<UpdateResult<Versioned<byte[]>>>> putAndGet(String tableName,
104 String key,
105 byte[] value) {
106 return checkOpen(() -> proxy.putAndGet(tableName, key, value));
107 }
108
109 @Override
110 public CompletableFuture<Result<UpdateResult<Versioned<byte[]>>>> putIfAbsentAndGet(String tableName,
111 String key,
112 byte[] value) {
113 return checkOpen(() -> proxy.putIfAbsentAndGet(tableName, key, value));
114 }
115
116 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700117 public CompletableFuture<Result<Versioned<byte[]>>> remove(String tableName, String key) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700118 return checkOpen(() -> proxy.remove(tableName, key));
119 }
Madan Jampani94c23532015-02-05 17:40:01 -0800120
Madan Jampanif1b8e172015-03-23 11:42:02 -0700121 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700122 public CompletableFuture<Result<Void>> clear(String tableName) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700123 return checkOpen(() -> proxy.clear(tableName));
124 }
Madan Jampani94c23532015-02-05 17:40:01 -0800125
Madan Jampanif1b8e172015-03-23 11:42:02 -0700126 @Override
127 public CompletableFuture<Set<String>> keySet(String tableName) {
128 return checkOpen(() -> proxy.keySet(tableName));
129 }
Madan Jampani94c23532015-02-05 17:40:01 -0800130
Madan Jampanif1b8e172015-03-23 11:42:02 -0700131 @Override
132 public CompletableFuture<Collection<Versioned<byte[]>>> values(String tableName) {
133 return checkOpen(() -> proxy.values(tableName));
134 }
Madan Jampani94c23532015-02-05 17:40:01 -0800135
Madan Jampanif1b8e172015-03-23 11:42:02 -0700136 @Override
137 public CompletableFuture<Set<Map.Entry<String, Versioned<byte[]>>>> entrySet(String tableName) {
138 return checkOpen(() -> proxy.entrySet(tableName));
139 }
Madan Jampani94c23532015-02-05 17:40:01 -0800140
Madan Jampanif1b8e172015-03-23 11:42:02 -0700141 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700142 public CompletableFuture<Result<Versioned<byte[]>>> putIfAbsent(String tableName, String key, byte[] value) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700143 return checkOpen(() -> proxy.putIfAbsent(tableName, key, value));
144 }
Madan Jampani94c23532015-02-05 17:40:01 -0800145
Madan Jampanif1b8e172015-03-23 11:42:02 -0700146 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700147 public CompletableFuture<Result<Boolean>> remove(String tableName, String key, byte[] value) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700148 return checkOpen(() -> proxy.remove(tableName, key, value));
149 }
Madan Jampani94c23532015-02-05 17:40:01 -0800150
Madan Jampanif1b8e172015-03-23 11:42:02 -0700151 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700152 public CompletableFuture<Result<Boolean>> remove(String tableName, String key, long version) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700153 return checkOpen(() -> proxy.remove(tableName, key, version));
154 }
Madan Jampani94c23532015-02-05 17:40:01 -0800155
Madan Jampanif1b8e172015-03-23 11:42:02 -0700156 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700157 public CompletableFuture<Result<Boolean>> replace(String tableName, String key, byte[] oldValue, byte[] newValue) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700158 return checkOpen(() -> proxy.replace(tableName, key, oldValue, newValue));
159 }
Madan Jampani94c23532015-02-05 17:40:01 -0800160
Madan Jampanif1b8e172015-03-23 11:42:02 -0700161 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700162 public CompletableFuture<Result<Boolean>> replace(String tableName, String key, long oldVersion, byte[] newValue) {
Madan Jampanif1b8e172015-03-23 11:42:02 -0700163 return checkOpen(() -> proxy.replace(tableName, key, oldVersion, newValue));
164 }
Madan Jampani94c23532015-02-05 17:40:01 -0800165
Madan Jampanif1b8e172015-03-23 11:42:02 -0700166 @Override
Madan Jampani346d4f52015-05-04 11:09:39 -0700167 public CompletableFuture<Result<UpdateResult<Versioned<byte[]>>>> replaceAndGet(String tableName,
168 String key,
169 long oldVersion,
170 byte[] newValue) {
171 return checkOpen(() -> proxy.replaceAndGet(tableName, key, oldVersion, newValue));
172 }
173
174 @Override
Madan Jampani04aeb452015-05-02 16:12:24 -0700175 public CompletableFuture<Long> counterGet(String counterName) {
176 return checkOpen(() -> proxy.counterGet(counterName));
Madan Jampanib5d72d52015-04-03 16:53:50 -0700177 }
178
179 @Override
Madan Jampani04aeb452015-05-02 16:12:24 -0700180 public CompletableFuture<Long> counterAddAndGet(String counterName, long delta) {
181 return checkOpen(() -> proxy.counterAddAndGet(counterName, delta));
182 }
183
184 @Override
185 public CompletableFuture<Long> counterGetAndAdd(String counterName, long delta) {
186 return checkOpen(() -> proxy.counterGetAndAdd(counterName, delta));
Madan Jampanib5d72d52015-04-03 16:53:50 -0700187 }
188
189 @Override
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700190 public CompletableFuture<Boolean> prepareAndCommit(Transaction transaction) {
191 return checkOpen(() -> proxy.prepareAndCommit(transaction));
192 }
193
194 @Override
195 public CompletableFuture<Boolean> prepare(Transaction transaction) {
196 return checkOpen(() -> proxy.prepare(transaction));
197 }
198
199 @Override
200 public CompletableFuture<Boolean> commit(Transaction transaction) {
201 return checkOpen(() -> proxy.commit(transaction));
202 }
203
204 @Override
205 public CompletableFuture<Boolean> rollback(Transaction transaction) {
206 return checkOpen(() -> proxy.rollback(transaction));
Madan Jampanif1b8e172015-03-23 11:42:02 -0700207 }
Madan Jampani94c23532015-02-05 17:40:01 -0800208
Madan Jampanif1b8e172015-03-23 11:42:02 -0700209 @Override
210 @SuppressWarnings("unchecked")
211 public synchronized CompletableFuture<Database> open() {
212 return runStartupTasks()
213 .thenCompose(v -> stateMachine.open())
214 .thenRun(() -> {
215 this.proxy = stateMachine.createProxy(DatabaseProxy.class, this.getClass().getClassLoader());
216 })
217 .thenApply(v -> null);
218 }
219
220 @Override
221 public synchronized CompletableFuture<Void> close() {
222 proxy = null;
223 return stateMachine.close()
224 .thenCompose(v -> runShutdownTasks());
225 }
226
227 @Override
228 public int hashCode() {
229 return name().hashCode();
230 }
231
232 @Override
233 public boolean equals(Object other) {
234 if (other instanceof Database) {
235 return name().equals(((Database) other).name());
236 }
237 return false;
238 }
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700239}