blob: 8a9f884734e599b04c965b3ad55b76bd043e0403 [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 */
16package org.onosproject.store.consistent.impl;
17
Flavio Castro41b1f3a2015-07-31 13:51:32 -070018import org.onosproject.store.service.AsyncAtomicCounter;
Flavio Castro41b1f3a2015-07-31 13:51:32 -070019
Madan Jampanib5d72d52015-04-03 16:53:50 -070020import java.util.concurrent.CompletableFuture;
Flavio Castro41b1f3a2015-07-31 13:51:32 -070021import static com.google.common.base.Preconditions.checkNotNull;
Madan Jampanib5d72d52015-04-03 16:53:50 -070022
23/**
24 * Default implementation for a distributed AsyncAtomicCounter backed by
25 * partitioned Raft DB.
26 * <p>
27 * The initial value will be zero.
28 */
29public class DefaultAsyncAtomicCounter implements AsyncAtomicCounter {
30
31 private final String name;
32 private final Database database;
Flavio Castro41b1f3a2015-07-31 13:51:32 -070033 private final MeteringAgent monitor;
34
35 private static final String PRIMITIVE_NAME = "atomicCounter";
36 private static final String INCREMENT_AND_GET = "incrementAndGet";
37 private static final String GET_AND_INCREMENT = "getAndIncrement";
38 private static final String GET_AND_ADD = "getAndAdd";
39 private static final String ADD_AND_GET = "addAndGet";
40 private static final String GET = "get";
Madan Jampanib5d72d52015-04-03 16:53:50 -070041
Madan Jampanif4d58f32015-06-05 17:38:22 -070042 public DefaultAsyncAtomicCounter(String name,
Flavio Castro41b1f3a2015-07-31 13:51:32 -070043 Database database,
Madan Jampania29c6772015-08-17 13:17:07 -070044 boolean meteringEnabled) {
Madan Jampanib5d72d52015-04-03 16:53:50 -070045 this.name = checkNotNull(name);
46 this.database = checkNotNull(database);
Flavio Castro41b1f3a2015-07-31 13:51:32 -070047 this.monitor = new MeteringAgent(PRIMITIVE_NAME, name, meteringEnabled);
Madan Jampanib5d72d52015-04-03 16:53:50 -070048 }
49
50 @Override
51 public CompletableFuture<Long> incrementAndGet() {
Flavio Castro41b1f3a2015-07-31 13:51:32 -070052 final MeteringAgent.Context timer = monitor.startTimer(INCREMENT_AND_GET);
53 return addAndGet(1L)
54 .whenComplete((r, e) -> timer.stop());
Madan Jampanib5d72d52015-04-03 16:53:50 -070055 }
56
57 @Override
58 public CompletableFuture<Long> get() {
Flavio Castro41b1f3a2015-07-31 13:51:32 -070059 final MeteringAgent.Context timer = monitor.startTimer(GET);
60 return database.counterGet(name)
61 .whenComplete((r, e) -> timer.stop());
Madan Jampani04aeb452015-05-02 16:12:24 -070062 }
63
64 @Override
65 public CompletableFuture<Long> getAndIncrement() {
Flavio Castro41b1f3a2015-07-31 13:51:32 -070066 final MeteringAgent.Context timer = monitor.startTimer(GET_AND_INCREMENT);
67 return getAndAdd(1L)
68 .whenComplete((r, e) -> timer.stop());
Madan Jampani04aeb452015-05-02 16:12:24 -070069 }
70
71 @Override
72 public CompletableFuture<Long> getAndAdd(long delta) {
Flavio Castro41b1f3a2015-07-31 13:51:32 -070073 final MeteringAgent.Context timer = monitor.startTimer(GET_AND_ADD);
Madan Jampania29c6772015-08-17 13:17:07 -070074 return database.counterGetAndAdd(name, delta)
75 .whenComplete((r, e) -> timer.stop());
Madan Jampani04aeb452015-05-02 16:12:24 -070076 }
77
78 @Override
79 public CompletableFuture<Long> addAndGet(long delta) {
Flavio Castro41b1f3a2015-07-31 13:51:32 -070080 final MeteringAgent.Context timer = monitor.startTimer(ADD_AND_GET);
Madan Jampania29c6772015-08-17 13:17:07 -070081 return database.counterAddAndGet(name, delta)
82 .whenComplete((r, e) -> timer.stop());
Madan Jampanif4d58f32015-06-05 17:38:22 -070083 }
84}