blob: 8033bcf9859f29abc03636071533d6744053fff0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.internal.cache.eviction;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.geode.Statistics;
class EvictionCountersImpl implements EvictionCounters {
/** The Statistics object that we delegate most behavior to */
private final EvictionStats stats;
// Note: the following atomics have been added so that the eviction code
// does not depend on the value of a statistic for its operations.
// In particular they optimize the "get" methods for these items.
// Striped stats optimize inc but cause set and get to be more expensive.
private final AtomicLong counter = new AtomicLong();
private final AtomicLong limit = new AtomicLong();
private final AtomicLong destroys = new AtomicLong();
private final AtomicLong evictions = new AtomicLong();
public EvictionCountersImpl(EvictionStats stats) {
this.stats = stats;
}
@Override
public void incEvictions() {
this.evictions.getAndAdd(1);
this.stats.incEvictions();
}
/** common counter for different eviction types */
@Override
public long getCounter() {
return this.counter.get();
}
@Override
public long getLimit() {
return this.limit.get();
}
@Override
public void updateCounter(long delta) {
if (delta != 0) {
this.counter.getAndAdd(delta);
this.stats.updateCounter(delta);
}
}
@Override
public long getEvictions() {
return this.evictions.get();
}
@Override
public Statistics getStatistics() {
return this.stats.getStatistics();
}
@Override
public void incDestroys() {
this.destroys.getAndAdd(1);
this.stats.incDestroys();
}
@Override
public void close() {
this.stats.close();
}
@Override
public void setLimit(long newValue) {
long oldValue = this.limit.get();
if (oldValue != newValue) {
this.limit.set(newValue);
this.stats.setLimit(newValue);
}
}
@Override
public void resetCounter() {
if (this.counter.get() != 0) {
this.counter.set(0);
this.stats.setCounter(0L);
}
}
@Override
public void decrementCounter(long delta) {
if (delta != 0) {
long newValue = this.counter.addAndGet(-delta);
this.stats.setCounter(newValue);
}
}
@Override
public long getDestroys() {
return this.destroys.get();
}
@Override
public void incEvaluations(long evaluations) {
this.stats.incEvaluations(evaluations);
}
@Override
public void incGreedyReturns(long greedyReturns) {
this.stats.incGreedyReturns(greedyReturns);
}
}