blob: 954008c2d4a42017db43ab135be90615663905d3 [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
Madan Jampani5e5b3d62016-02-01 16:03:33 -080018import java.util.concurrent.CompletableFuture;
19
Jordan Halterman2bf177c2017-06-29 01:49:08 -070020import io.atomix.protocols.raft.proxy.RaftProxy;
21import org.onlab.util.KryoNamespace;
22import org.onosproject.store.serializers.KryoNamespaces;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080023import org.onosproject.store.service.AsyncAtomicCounter;
Jordan Halterman2bf177c2017-06-29 01:49:08 -070024import org.onosproject.store.service.Serializer;
25
26import static org.onosproject.store.primitives.resources.impl.AtomixCounterOperations.ADD_AND_GET;
27import static org.onosproject.store.primitives.resources.impl.AtomixCounterOperations.AddAndGet;
28import static org.onosproject.store.primitives.resources.impl.AtomixCounterOperations.COMPARE_AND_SET;
29import static org.onosproject.store.primitives.resources.impl.AtomixCounterOperations.CompareAndSet;
30import static org.onosproject.store.primitives.resources.impl.AtomixCounterOperations.GET;
31import static org.onosproject.store.primitives.resources.impl.AtomixCounterOperations.GET_AND_ADD;
32import static org.onosproject.store.primitives.resources.impl.AtomixCounterOperations.GET_AND_INCREMENT;
33import static org.onosproject.store.primitives.resources.impl.AtomixCounterOperations.GetAndAdd;
34import static org.onosproject.store.primitives.resources.impl.AtomixCounterOperations.INCREMENT_AND_GET;
35import static org.onosproject.store.primitives.resources.impl.AtomixCounterOperations.SET;
36import static org.onosproject.store.primitives.resources.impl.AtomixCounterOperations.Set;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080037
38/**
Jordan Halterman2bf177c2017-06-29 01:49:08 -070039 * Atomix counter implementation.
Madan Jampani5e5b3d62016-02-01 16:03:33 -080040 */
Jordan Halterman2bf177c2017-06-29 01:49:08 -070041public class AtomixCounter extends AbstractRaftPrimitive implements AsyncAtomicCounter {
42 private static final Serializer SERIALIZER = Serializer.using(KryoNamespace.newBuilder()
43 .register(KryoNamespaces.BASIC)
44 .register(AtomixCounterOperations.NAMESPACE)
45 .build());
Madan Jampani5e5b3d62016-02-01 16:03:33 -080046
Jordan Halterman2bf177c2017-06-29 01:49:08 -070047 public AtomixCounter(RaftProxy proxy) {
48 super(proxy);
Madan Jampani5e5b3d62016-02-01 16:03:33 -080049 }
50
Jordan Halterman2bf177c2017-06-29 01:49:08 -070051 private long nullOrZero(Long value) {
52 return value != null ? value : 0;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080053 }
54
55 @Override
56 public CompletableFuture<Long> get() {
Jordan Halterman2bf177c2017-06-29 01:49:08 -070057 return proxy.<Long>invoke(GET, SERIALIZER::decode).thenApply(this::nullOrZero);
Madan Jampani5e5b3d62016-02-01 16:03:33 -080058 }
59
60 @Override
61 public CompletableFuture<Void> set(long value) {
Jordan Halterman2bf177c2017-06-29 01:49:08 -070062 return proxy.invoke(SET, SERIALIZER::encode, new Set(value));
Madan Jampani5e5b3d62016-02-01 16:03:33 -080063 }
64
65 @Override
Madan Jampanie14a09c2016-02-11 10:43:21 -080066 public CompletableFuture<Boolean> compareAndSet(long expectedValue, long updateValue) {
Jordan Halterman2bf177c2017-06-29 01:49:08 -070067 return proxy.invoke(COMPARE_AND_SET, SERIALIZER::encode,
68 new CompareAndSet(expectedValue, updateValue), SERIALIZER::decode);
69 }
70
71 @Override
72 public CompletableFuture<Long> addAndGet(long delta) {
73 return proxy.invoke(ADD_AND_GET, SERIALIZER::encode, new AddAndGet(delta), SERIALIZER::decode);
74 }
75
76 @Override
77 public CompletableFuture<Long> getAndAdd(long delta) {
78 return proxy.invoke(GET_AND_ADD, SERIALIZER::encode, new GetAndAdd(delta), SERIALIZER::decode);
79 }
80
81 @Override
82 public CompletableFuture<Long> incrementAndGet() {
83 return proxy.invoke(INCREMENT_AND_GET, SERIALIZER::decode);
84 }
85
86 @Override
87 public CompletableFuture<Long> getAndIncrement() {
88 return proxy.invoke(GET_AND_INCREMENT, SERIALIZER::decode);
Madan Jampani5e5b3d62016-02-01 16:03:33 -080089 }
90}