mirror of
https://github.com/XRPLF/rippled.git
synced 2026-06-05 17:56:49 +00:00
Summary: This diff merges pull request #208. Contributor: ankgup87 [Java] Optimize statistics collector * Optimize statistics collector by collecting statistics of multiple DBs in a single thread rather than starting up a new thread for each DB. * Also, fix packaging of jnilib file on OS_X platform. * Diff review: https://reviews.facebook.net/D20265 [Java] Add documentation on interdependency of dispose call of RocksObjects * Remove transferCppRawPointersOwnershipFrom function. - This function was setting opt.filter_ and thus filter_ to be null. This way there is no one holding reference for filter object and can thus be GC'd which is not the intention. Replaced it with storeOptionsInstace which stores options instance. Options class internally holds Filter instance. Thus when Options is GC'd, filter reference will be GC'd automatically. * Added documentation explaining interdependency of Filter, Options and DB. * Diff review: https://reviews.facebook.net/D20379 Test Plan: described in their diff reviews Reviewers: haobo sdong swapnilghike zzbennett rsumbaly yhchiang Reviewed by: yhchiang
99 lines
3.6 KiB
Java
99 lines
3.6 KiB
Java
// Copyright (c) 2014, Facebook, Inc. All rights reserved.
|
|
// This source code is licensed under the BSD-style license found in the
|
|
// LICENSE file in the root directory of this source tree. An additional grant
|
|
// of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
package org.rocksdb;
|
|
|
|
import java.util.List;
|
|
import java.util.concurrent.ArrayBlockingQueue;
|
|
import java.util.concurrent.Executors;
|
|
import java.util.concurrent.ExecutorService;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
/**
|
|
* Helper class to collect DB statistics periodically at a period specified in
|
|
* constructor. Callback function (provided in constructor) is called with
|
|
* every statistics collection.
|
|
*
|
|
* Caller should call start() to start statistics collection. Shutdown() should
|
|
* be called to stop stats collection and should be called before statistics (
|
|
* provided in constructor) reference has been disposed.
|
|
*/
|
|
public class StatisticsCollector {
|
|
private final List<StatsCollectorInput> _statsCollectorInputList;
|
|
private final ExecutorService _executorService;
|
|
private final int _statsCollectionInterval;
|
|
private volatile boolean _isRunning = true;
|
|
|
|
/**
|
|
* Constructor for statistics collector.
|
|
*
|
|
* @param statsCollectorInputList List of statistics collector input.
|
|
* @param statsCollectionIntervalInMilliSeconds Statistics collection time
|
|
* period (specified in milliseconds).
|
|
*/
|
|
public StatisticsCollector(List<StatsCollectorInput> statsCollectorInputList,
|
|
int statsCollectionIntervalInMilliSeconds) {
|
|
_statsCollectorInputList = statsCollectorInputList;
|
|
_statsCollectionInterval = statsCollectionIntervalInMilliSeconds;
|
|
|
|
_executorService = Executors.newSingleThreadExecutor();
|
|
}
|
|
|
|
public void start() {
|
|
_executorService.submit(collectStatistics());
|
|
}
|
|
|
|
public void shutDown() throws InterruptedException {
|
|
_isRunning = false;
|
|
|
|
_executorService.shutdown();
|
|
// Wait for collectStatistics runnable to finish so that disposal of
|
|
// statistics does not cause any exceptions to be thrown.
|
|
_executorService.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
|
|
}
|
|
|
|
private Runnable collectStatistics() {
|
|
return new Runnable() {
|
|
|
|
@Override
|
|
public void run() {
|
|
while (_isRunning) {
|
|
try {
|
|
for(StatsCollectorInput statsCollectorInput :
|
|
_statsCollectorInputList) {
|
|
Statistics statistics = statsCollectorInput.getStatistics();
|
|
StatisticsCollectorCallback statsCallback =
|
|
statsCollectorInput.getCallback();
|
|
|
|
// Collect ticker data
|
|
for(TickerType ticker : TickerType.values()) {
|
|
long tickerValue = statistics.getTickerCount(ticker);
|
|
statsCallback.tickerCallback(ticker, tickerValue);
|
|
}
|
|
|
|
// Collect histogram data
|
|
for(HistogramType histogramType : HistogramType.values()) {
|
|
HistogramData histogramData =
|
|
statistics.geHistogramData(histogramType);
|
|
statsCallback.histogramCallback(histogramType, histogramData);
|
|
}
|
|
|
|
Thread.sleep(_statsCollectionInterval);
|
|
}
|
|
}
|
|
catch (InterruptedException e) {
|
|
Thread.currentThread().interrupt();
|
|
throw new RuntimeException("Thread got interrupted!", e);
|
|
}
|
|
catch (Exception e) {
|
|
throw new RuntimeException("Error while calculating statistics", e);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
}
|