blob: e64bbbf1028b429a4390b889a2f81c1069db0f95 [file] [log] [blame]
Madan Jampani5e5b3d62016-02-01 16:03:33 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Madan Jampani5e5b3d62016-02-01 16:03:33 -08003 *
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 */
16package org.onosproject.store.primitives.resources.impl;
17
18import io.atomix.catalyst.buffer.BufferInput;
19import io.atomix.catalyst.buffer.BufferOutput;
20import io.atomix.catalyst.serializer.CatalystSerializable;
Madan Jampanifc981772016-02-16 09:46:42 -080021import io.atomix.catalyst.serializer.SerializableTypeResolver;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080022import io.atomix.catalyst.serializer.Serializer;
Madan Jampanifc981772016-02-16 09:46:42 -080023import io.atomix.catalyst.serializer.SerializerRegistry;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080024import io.atomix.catalyst.util.Assert;
Madan Jampani3a9911c2016-02-21 11:25:45 -080025import io.atomix.copycat.Command;
26import io.atomix.copycat.Query;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080027
28import java.util.Collection;
29import java.util.Map;
30import java.util.Set;
31
32import org.onlab.util.Match;
Madan Jampanicadd70b2016-02-08 13:45:43 -080033import org.onosproject.store.primitives.TransactionId;
Madan Jampani74da78b2016-02-09 21:18:36 -080034import org.onosproject.store.service.MapTransaction;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080035import org.onosproject.store.service.Versioned;
36
37import com.google.common.base.MoreObjects;
38
39/**
40 * {@link AtomixConsistentMap} resource state machine operations.
41 */
42public final class AtomixConsistentMapCommands {
43
44 private AtomixConsistentMapCommands() {
45 }
46
47 /**
48 * Abstract map command.
49 */
50 @SuppressWarnings("serial")
51 public abstract static class MapCommand<V> implements Command<V>, CatalystSerializable {
52
53 @Override
Madan Jampani5e5b3d62016-02-01 16:03:33 -080054 public String toString() {
55 return MoreObjects.toStringHelper(getClass())
56 .toString();
57 }
58
59 @Override
60 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
61 }
62
63 @Override
64 public void readObject(BufferInput<?> buffer, Serializer serializer) {
65 }
66 }
67
68 /**
69 * Abstract map query.
70 */
71 @SuppressWarnings("serial")
72 public abstract static class MapQuery<V> implements Query<V>, CatalystSerializable {
73
74 @Override
75 public ConsistencyLevel consistency() {
Madan Jampani5ddaf192016-04-04 07:39:31 -070076 return ConsistencyLevel.SEQUENTIAL;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080077 }
78
79 @Override
80 public String toString() {
81 return MoreObjects.toStringHelper(getClass())
82 .toString();
83 }
84
85 @Override
86 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
87 }
88
89 @Override
90 public void readObject(BufferInput<?> buffer, Serializer serializer) {
91 }
92 }
93
94 /**
95 * Abstract key-based query.
96 */
97 @SuppressWarnings("serial")
98 public abstract static class KeyQuery<V> extends MapQuery<V> {
99 protected String key;
100
101 public KeyQuery() {
102 }
103
104 public KeyQuery(String key) {
105 this.key = Assert.notNull(key, "key");
106 }
107
108 /**
109 * Returns the key.
110 * @return key
111 */
112 public String key() {
113 return key;
114 }
115
116 @Override
117 public String toString() {
118 return MoreObjects.toStringHelper(getClass())
119 .add("key", key)
120 .toString();
121 }
122
123 @Override
124 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
125 super.writeObject(buffer, serializer);
126 serializer.writeObject(key, buffer);
127 }
128
129 @Override
130 public void readObject(BufferInput<?> buffer, Serializer serializer) {
131 super.readObject(buffer, serializer);
132 key = serializer.readObject(buffer);
133 }
134 }
135
136 /**
Aaron Kruglikov56423ba2016-04-19 13:39:16 -0700137 * Abstract value-based query.
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800138 */
139 @SuppressWarnings("serial")
140 public abstract static class ValueQuery<V> extends MapQuery<V> {
141 protected byte[] value;
142
143 public ValueQuery() {
144 }
145
146 public ValueQuery(byte[] value) {
147 this.value = Assert.notNull(value, "value");
148 }
149
150 /**
Aaron Kruglikov56423ba2016-04-19 13:39:16 -0700151 * Returns the value.
152 * @return value
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800153 */
154 public byte[] value() {
155 return value;
156 }
157
158 @Override
Aaron Kruglikovb56c2962016-04-04 17:03:24 -0700159 public String toString() {
160 return MoreObjects.toStringHelper(getClass())
161 .add("value", value)
162 .toString();
163 }
164
165 @Override
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800166 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
167 super.writeObject(buffer, serializer);
168 serializer.writeObject(value, buffer);
169 }
170
171 @Override
172 public void readObject(BufferInput<?> buffer, Serializer serializer) {
173 super.readObject(buffer, serializer);
174 value = serializer.readObject(buffer);
175 }
176 }
177
178 /**
179 * Contains key command.
180 */
181 @SuppressWarnings("serial")
182 public static class ContainsKey extends KeyQuery<Boolean> {
183 public ContainsKey() {
184 }
185
186 public ContainsKey(String key) {
187 super(key);
188 }
189 }
190
191 /**
Aaron Kruglikov56423ba2016-04-19 13:39:16 -0700192 * Contains value command.
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800193 */
194 @SuppressWarnings("serial")
195 public static class ContainsValue extends ValueQuery<Boolean> {
196 public ContainsValue() {
197 }
198
199 public ContainsValue(byte[] value) {
200 super(value);
201 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800202 }
203
204 /**
205 * Map prepare command.
206 */
207 @SuppressWarnings("serial")
208 public static class TransactionPrepare extends MapCommand<PrepareResult> {
Madan Jampani74da78b2016-02-09 21:18:36 -0800209 private MapTransaction<String, byte[]> mapTransaction;
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800210
211 public TransactionPrepare() {
212 }
213
Madan Jampani74da78b2016-02-09 21:18:36 -0800214 public TransactionPrepare(MapTransaction<String, byte[]> mapTransaction) {
215 this.mapTransaction = mapTransaction;
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800216 }
217
Madan Jampani74da78b2016-02-09 21:18:36 -0800218 public MapTransaction<String, byte[]> transaction() {
219 return mapTransaction;
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800220 }
221
222 @Override
223 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
224 super.writeObject(buffer, serializer);
Madan Jampani74da78b2016-02-09 21:18:36 -0800225 serializer.writeObject(mapTransaction, buffer);
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800226 }
227
228 @Override
229 public void readObject(BufferInput<?> buffer, Serializer serializer) {
230 super.readObject(buffer, serializer);
Madan Jampani74da78b2016-02-09 21:18:36 -0800231 mapTransaction = serializer.readObject(buffer);
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800232 }
233
234 @Override
235 public String toString() {
236 return MoreObjects.toStringHelper(getClass())
Madan Jampani74da78b2016-02-09 21:18:36 -0800237 .add("mapTransaction", mapTransaction)
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800238 .toString();
239 }
240 }
241
242 /**
Madan Jampani542d9e22016-04-05 15:39:55 -0700243 * Map prepareAndCommit command.
244 */
245 @SuppressWarnings("serial")
246 public static class TransactionPrepareAndCommit extends TransactionPrepare {
247 public TransactionPrepareAndCommit() {
248 }
249
250 public TransactionPrepareAndCommit(MapTransaction<String, byte[]> mapTransaction) {
251 super(mapTransaction);
252 }
Jordan Halterman820e39f2017-02-05 22:15:36 -0800253
254 @Override
255 public CompactionMode compaction() {
256 return CompactionMode.QUORUM;
257 }
Madan Jampani542d9e22016-04-05 15:39:55 -0700258 }
259
260 /**
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800261 * Map transaction commit command.
262 */
263 @SuppressWarnings("serial")
264 public static class TransactionCommit extends MapCommand<CommitResult> {
265 private TransactionId transactionId;
266
267 public TransactionCommit() {
268 }
269
270 public TransactionCommit(TransactionId transactionId) {
271 this.transactionId = transactionId;
272 }
273
274 /**
275 * Returns the transaction identifier.
276 * @return transaction id
277 */
278 public TransactionId transactionId() {
279 return transactionId;
280 }
281
282 @Override
283 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
284 super.writeObject(buffer, serializer);
285 serializer.writeObject(transactionId, buffer);
286 }
287
288 @Override
289 public void readObject(BufferInput<?> buffer, Serializer serializer) {
290 super.readObject(buffer, serializer);
291 transactionId = serializer.readObject(buffer);
292 }
293
294 @Override
Jordan Halterman820e39f2017-02-05 22:15:36 -0800295 public CompactionMode compaction() {
296 return CompactionMode.TOMBSTONE;
297 }
298
299 @Override
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800300 public String toString() {
301 return MoreObjects.toStringHelper(getClass())
302 .add("transactionId", transactionId)
303 .toString();
304 }
305 }
306
307 /**
308 * Map transaction rollback command.
309 */
310 @SuppressWarnings("serial")
311 public static class TransactionRollback extends MapCommand<RollbackResult> {
312 private TransactionId transactionId;
313
314 public TransactionRollback() {
315 }
316
317 public TransactionRollback(TransactionId transactionId) {
318 this.transactionId = transactionId;
319 }
320
321 /**
322 * Returns the transaction identifier.
323 * @return transaction id
324 */
325 public TransactionId transactionId() {
326 return transactionId;
327 }
328
329 @Override
330 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
331 super.writeObject(buffer, serializer);
332 serializer.writeObject(transactionId, buffer);
333 }
334
335 @Override
336 public void readObject(BufferInput<?> buffer, Serializer serializer) {
337 super.readObject(buffer, serializer);
338 transactionId = serializer.readObject(buffer);
339 }
340
341 @Override
Jordan Halterman820e39f2017-02-05 22:15:36 -0800342 public CompactionMode compaction() {
343 return CompactionMode.TOMBSTONE;
344 }
345
346 @Override
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800347 public String toString() {
348 return MoreObjects.toStringHelper(getClass())
349 .add("transactionId", transactionId)
350 .toString();
351 }
352 }
353
354 /**
355 * Map update command.
356 */
357 @SuppressWarnings("serial")
358 public static class UpdateAndGet extends MapCommand<MapEntryUpdateResult<String, byte[]>> {
359 private String key;
360 private byte[] value;
361 private Match<byte[]> valueMatch;
362 private Match<Long> versionMatch;
363
364 public UpdateAndGet() {
365 }
366
367 public UpdateAndGet(String key,
368 byte[] value,
369 Match<byte[]> valueMatch,
370 Match<Long> versionMatch) {
371 this.key = key;
372 this.value = value;
373 this.valueMatch = valueMatch;
374 this.versionMatch = versionMatch;
375 }
376
377 /**
378 * Returns the key.
379 * @return key
380 */
381 public String key() {
382 return this.key;
383 }
384
385 /**
386 * Returns the value.
387 * @return value
388 */
389 public byte[] value() {
390 return this.value;
391 }
392
393 /**
394 * Returns the value match.
395 * @return value match
396 */
397 public Match<byte[]> valueMatch() {
398 return this.valueMatch;
399 }
400
401 /**
402 * Returns the version match.
403 * @return version match
404 */
405 public Match<Long> versionMatch() {
406 return this.versionMatch;
407 }
408
409 @Override
410 public CompactionMode compaction() {
Jordan Halterman820e39f2017-02-05 22:15:36 -0800411 return value == null ? CompactionMode.TOMBSTONE : CompactionMode.QUORUM;
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800412 }
413
414 @Override
415 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
416 super.writeObject(buffer, serializer);
417 serializer.writeObject(key, buffer);
418 serializer.writeObject(value, buffer);
419 serializer.writeObject(valueMatch, buffer);
420 serializer.writeObject(versionMatch, buffer);
421 }
422
423 @Override
424 public void readObject(BufferInput<?> buffer, Serializer serializer) {
425 super.readObject(buffer, serializer);
426 key = serializer.readObject(buffer);
427 value = serializer.readObject(buffer);
428 valueMatch = serializer.readObject(buffer);
429 versionMatch = serializer.readObject(buffer);
430 }
431
432 @Override
433 public String toString() {
434 return MoreObjects.toStringHelper(getClass())
435 .add("key", key)
436 .add("value", value)
437 .add("valueMatch", valueMatch)
438 .add("versionMatch", versionMatch)
439 .toString();
440 }
441 }
442
443 /**
444 * Get query.
445 */
446 @SuppressWarnings("serial")
447 public static class Get extends KeyQuery<Versioned<byte[]>> {
448 public Get() {
449 }
450
451 public Get(String key) {
452 super(key);
453 }
454 }
455
456 /**
457 * Is empty query.
458 */
459 @SuppressWarnings("serial")
460 public static class IsEmpty extends MapQuery<Boolean> {
461 }
462
463 /**
464 * KeySet query.
465 */
466 @SuppressWarnings("serial")
467 public static class KeySet extends MapQuery<Set<String>> {
468 }
469
470 /**
Aaron Kruglikovb56c2962016-04-04 17:03:24 -0700471 * ValueSet query.
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800472 */
473 @SuppressWarnings("serial")
474 public static class Values extends MapQuery<Collection<Versioned<byte[]>>> {
475 }
476
477 /**
Aaron Kruglikovb56c2962016-04-04 17:03:24 -0700478 * EntrySet query.
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800479 */
480 @SuppressWarnings("serial")
481 public static class EntrySet extends MapQuery<Set<Map.Entry<String, Versioned<byte[]>>>> {
482 }
483
484 /**
485 * Size query.
486 */
487 @SuppressWarnings("serial")
488 public static class Size extends MapQuery<Integer> {
489 }
490
491 /**
492 * Clear command.
493 */
494 @SuppressWarnings("serial")
495 public static class Clear extends MapCommand<MapEntryUpdateResult.Status> {
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800496 @Override
497 public CompactionMode compaction() {
Jordan Halterman820e39f2017-02-05 22:15:36 -0800498 return CompactionMode.TOMBSTONE;
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800499 }
500 }
501
502 /**
503 * Change listen.
504 */
505 @SuppressWarnings("serial")
506 public static class Listen implements Command<Void>, CatalystSerializable {
507 @Override
508 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
509 }
510
511 @Override
512 public void readObject(BufferInput<?> buffer, Serializer serializer) {
513 }
Jordan Halterman820e39f2017-02-05 22:15:36 -0800514
515 @Override
516 public CompactionMode compaction() {
517 return CompactionMode.QUORUM;
518 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800519 }
520
521 /**
522 * Change unlisten.
523 */
524 @SuppressWarnings("serial")
525 public static class Unlisten implements Command<Void>, CatalystSerializable {
526 @Override
527 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
528 }
529
530 @Override
531 public void readObject(BufferInput<?> buffer, Serializer serializer) {
532 }
Jordan Halterman820e39f2017-02-05 22:15:36 -0800533
534 @Override
535 public CompactionMode compaction() {
536 return CompactionMode.TOMBSTONE;
537 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800538 }
Madan Jampanifc981772016-02-16 09:46:42 -0800539
540 /**
541 * Map command type resolver.
542 */
543 public static class TypeResolver implements SerializableTypeResolver {
544 @Override
545 public void resolve(SerializerRegistry registry) {
546 registry.register(ContainsKey.class, -761);
547 registry.register(ContainsValue.class, -762);
548 registry.register(Get.class, -763);
549 registry.register(EntrySet.class, -764);
550 registry.register(Values.class, -765);
551 registry.register(KeySet.class, -766);
552 registry.register(Clear.class, -767);
553 registry.register(IsEmpty.class, -768);
554 registry.register(Size.class, -769);
555 registry.register(Listen.class, -770);
556 registry.register(Unlisten.class, -771);
557 registry.register(TransactionPrepare.class, -772);
558 registry.register(TransactionCommit.class, -773);
559 registry.register(TransactionRollback.class, -774);
Madan Jampani542d9e22016-04-05 15:39:55 -0700560 registry.register(TransactionPrepareAndCommit.class, -775);
561 registry.register(UpdateAndGet.class, -776);
Madan Jampanifc981772016-02-16 09:46:42 -0800562 }
563 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800564}