blob: 6a792922ca5beacdf2f99e0ea315872d51bf46b1 [file] [log] [blame]
Madan Jampanib5d72d52015-04-03 16:53:50 -07001/*
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 */
Madan Jampanif4c88502016-01-21 12:35:36 -080016package org.onosproject.store.primitives.impl;
Madan Jampanib5d72d52015-04-03 16:53:50 -070017
Flavio Castro41b1f3a2015-07-31 13:51:32 -070018import org.onosproject.store.service.AsyncAtomicCounter;
Aaron Kruglikov1110b2c2016-02-02 16:24:37 -080019import org.onosproject.utils.MeteringAgent;
Flavio Castro41b1f3a2015-07-31 13:51:32 -070020
Madan Jampanib5d72d52015-04-03 16:53:50 -070021import java.util.concurrent.CompletableFuture;
andreafd912ac2015-10-02 14:58:35 -070022
Flavio Castro41b1f3a2015-07-31 13:51:32 -070023import static com.google.common.base.Preconditions.checkNotNull;
Madan Jampanib5d72d52015-04-03 16:53:50 -070024
25/**
26 * Default implementation for a distributed AsyncAtomicCounter backed by
27 * partitioned Raft DB.
28 * <p>
29 * The initial value will be zero.
30 */
31public class DefaultAsyncAtomicCounter implements AsyncAtomicCounter {
32
33 private final String name;
34 private final Database database;
Flavio Castro41b1f3a2015-07-31 13:51:32 -070035 private final MeteringAgent monitor;
36
37 private static final String PRIMITIVE_NAME = "atomicCounter";
38 private static final String INCREMENT_AND_GET = "incrementAndGet";
39 private static final String GET_AND_INCREMENT = "getAndIncrement";
40 private static final String GET_AND_ADD = "getAndAdd";
41 private static final String ADD_AND_GET = "addAndGet";
42 private static final String GET = "get";
andreafd912ac2015-10-02 14:58:35 -070043 private static final String SET = "set";
Aaron Kruglikov82fd6322015-10-06 12:02:46 -070044 private static final String COMPARE_AND_SET = "compareAndSet";
Madan Jampanib5d72d52015-04-03 16:53:50 -070045
Madan Jampanif4d58f32015-06-05 17:38:22 -070046 public DefaultAsyncAtomicCounter(String name,
Flavio Castro41b1f3a2015-07-31 13:51:32 -070047 Database database,
Madan Jampania29c6772015-08-17 13:17:07 -070048 boolean meteringEnabled) {
Madan Jampanib5d72d52015-04-03 16:53:50 -070049 this.name = checkNotNull(name);
50 this.database = checkNotNull(database);
Flavio Castro41b1f3a2015-07-31 13:51:32 -070051 this.monitor = new MeteringAgent(PRIMITIVE_NAME, name, meteringEnabled);
Madan Jampanib5d72d52015-04-03 16:53:50 -070052 }
53
54 @Override
Madan Jampania090a112016-01-18 16:38:17 -080055 public String name() {
56 return name;
57 }
58
59 @Override
Madan Jampanib5d72d52015-04-03 16:53:50 -070060 public CompletableFuture<Long> incrementAndGet() {
Flavio Castro41b1f3a2015-07-31 13:51:32 -070061 final MeteringAgent.Context timer = monitor.startTimer(INCREMENT_AND_GET);
62 return addAndGet(1L)
Flavio Castro6e044612015-08-13 14:13:58 -070063 .whenComplete((r, e) -> timer.stop(e));
Madan Jampanib5d72d52015-04-03 16:53:50 -070064 }
65
66 @Override
67 public CompletableFuture<Long> get() {
Flavio Castro41b1f3a2015-07-31 13:51:32 -070068 final MeteringAgent.Context timer = monitor.startTimer(GET);
69 return database.counterGet(name)
Flavio Castro6e044612015-08-13 14:13:58 -070070 .whenComplete((r, e) -> timer.stop(e));
Madan Jampani04aeb452015-05-02 16:12:24 -070071 }
72
73 @Override
74 public CompletableFuture<Long> getAndIncrement() {
Flavio Castro41b1f3a2015-07-31 13:51:32 -070075 final MeteringAgent.Context timer = monitor.startTimer(GET_AND_INCREMENT);
76 return getAndAdd(1L)
Flavio Castro6e044612015-08-13 14:13:58 -070077 .whenComplete((r, e) -> timer.stop(e));
Madan Jampani04aeb452015-05-02 16:12:24 -070078 }
79
80 @Override
81 public CompletableFuture<Long> getAndAdd(long delta) {
Flavio Castro41b1f3a2015-07-31 13:51:32 -070082 final MeteringAgent.Context timer = monitor.startTimer(GET_AND_ADD);
Madan Jampania29c6772015-08-17 13:17:07 -070083 return database.counterGetAndAdd(name, delta)
andreafd912ac2015-10-02 14:58:35 -070084 .whenComplete((r, e) -> timer.stop(e));
Madan Jampani04aeb452015-05-02 16:12:24 -070085 }
86
87 @Override
88 public CompletableFuture<Long> addAndGet(long delta) {
Flavio Castro41b1f3a2015-07-31 13:51:32 -070089 final MeteringAgent.Context timer = monitor.startTimer(ADD_AND_GET);
Madan Jampania29c6772015-08-17 13:17:07 -070090 return database.counterAddAndGet(name, delta)
andreafd912ac2015-10-02 14:58:35 -070091 .whenComplete((r, e) -> timer.stop(e));
92 }
93
94 @Override
95 public CompletableFuture<Void> set(long value) {
96 final MeteringAgent.Context timer = monitor.startTimer(SET);
97 return database.counterSet(name, value)
98 .whenComplete((r, e) -> timer.stop(e));
Madan Jampanif4d58f32015-06-05 17:38:22 -070099 }
Aaron Kruglikov82fd6322015-10-06 12:02:46 -0700100
101 @Override
102 public CompletableFuture<Boolean> compareAndSet(long expectedValue, long updateValue) {
103 final MeteringAgent.Context timer = monitor.startTimer(COMPARE_AND_SET);
104 return database.counterCompareAndSet(name, expectedValue, updateValue)
105 .whenComplete((r, e) -> timer.stop(e));
106 }
Flavio Castro6e044612015-08-13 14:13:58 -0700107}