Packages
rocksdb
1.9.0
3.1.1
3.1.0
3.0.0
2.6.2
2.6.1
retired
2.6.0
retired
2.5.0
2.4.1
2.4.0
2.3.0
2.2.0
2.1.0
2.0.0
1.9.0
1.8.0
1.7.0
1.6.0
1.5.1
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.1
1.1.0
1.0.0
0.26.2
0.26.1
0.26.0
0.25.0
0.24.0
0.23.3
0.23.2
0.23.1
0.23.0
0.22.0
0.21.0
0.20.1
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.1
0.7.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
RocksDB for Erlang
Current section
Files
Jump to
Current section
Files
c_src/statistics.cc
// Copyright (c) 2020 Josep-Angel Herrero Bajo
// Copyright (c) 2020-2025 Benoit Chesneau:w
//
// This file is provided 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.
//
#include <array>
#include "rocksdb/statistics.h"
#include "atoms.h"
#include "statistics.h"
#include "util.h"
namespace erocksdb {
ErlNifResourceType* Statistics::m_Statistics_RESOURCE(NULL);
void
Statistics::CreateStatisticsType(ErlNifEnv* env)
{
ErlNifResourceFlags flags = (ErlNifResourceFlags)(ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER);
m_Statistics_RESOURCE = enif_open_resource_type(env, NULL, "erocksdb_Statistics",
&Statistics::StatisticsResourceCleanup,
flags, NULL);
} // Statistics::CreateStatisticsType
void
Statistics::StatisticsResourceCleanup(ErlNifEnv* /*env*/, void* arg)
{
Statistics* statistics_ptr = (Statistics*)arg;
statistics_ptr->~Statistics();
} // Statistics::StatisticsResourceCleanup
Statistics*
Statistics::CreateStatisticsResource(std::shared_ptr<rocksdb::Statistics> statistics)
{
Statistics* ret_ptr;
void* alloc_ptr;
alloc_ptr = enif_alloc_resource(m_Statistics_RESOURCE, sizeof(Statistics));
ret_ptr = new (alloc_ptr) Statistics(statistics);
return ret_ptr;
}
Statistics*
Statistics::RetrieveStatisticsResource(ErlNifEnv* Env, const ERL_NIF_TERM& StatisticsTerm)
{
Statistics* ret_ptr;
if (!enif_get_resource(Env, StatisticsTerm, m_Statistics_RESOURCE, (void **)&ret_ptr))
return nullptr;
return ret_ptr;
}
Statistics::Statistics(std::shared_ptr<rocksdb::Statistics> statistics_arg) : statistics_(statistics_arg) {}
Statistics::~Statistics()
{
if(statistics_)
{
statistics_ = NULL;
}
return;
}
std::shared_ptr<rocksdb::Statistics> Statistics::statistics() {
return statistics_;
}
ERL_NIF_TERM
NewStatistics(
ErlNifEnv* env,
int /*argc*/,
const ERL_NIF_TERM[] /*argv[]*/)
{
Statistics *statistics_ptr = Statistics::CreateStatisticsResource(rocksdb::CreateDBStatistics());
// create a resource reference to send erlang
ERL_NIF_TERM result = enif_make_resource(env, statistics_ptr);
// clear the automatic reference from enif_alloc_resource in EnvObject
enif_release_resource(statistics_ptr);
return enif_make_tuple2(env, ATOM_OK, result);
}
ERL_NIF_TERM
ReleaseStatistics(ErlNifEnv* env, int /*argc*/, const ERL_NIF_TERM argv[])
{
Statistics* statistics_ptr = erocksdb::Statistics::RetrieveStatisticsResource(env, argv[0]);
if(NULL==statistics_ptr)
return ATOM_OK;
statistics_ptr->~Statistics();
return ATOM_OK;
}
bool StatsLevelAtomToEnum(ERL_NIF_TERM atom, rocksdb::StatsLevel* stats_level)
{
if (atom == ATOM_STATS_DISABLE_ALL)
{
*stats_level = rocksdb::StatsLevel::kDisableAll;
return true;
}
else if (atom == ATOM_STATS_EXCEPT_TICKERS)
{
*stats_level = rocksdb::StatsLevel::kExceptTickers;
return true;
}
else if (atom == ATOM_STATS_EXCEPT_HISTOGRAM_OR_TIMERS)
{
*stats_level = rocksdb::StatsLevel::kExceptHistogramOrTimers;
return true;
}
else if (atom == ATOM_STATS_EXCEPT_TIMERS)
{
*stats_level = rocksdb::StatsLevel::kExceptTimers;
return true;
}
else if (atom == ATOM_STATS_EXCEPT_DETAILED_TIMERS)
{
*stats_level = rocksdb::StatsLevel::kExceptDetailedTimers;
return true;
}
else if (atom == ATOM_STATS_EXCEPT_TIME_FOR_MUTEX)
{
*stats_level = rocksdb::StatsLevel::kExceptTimeForMutex;
return true;
}
else if (atom == ATOM_STATS_ALL)
{
*stats_level = rocksdb::StatsLevel::kAll;
return true;
}
return false;
}
ERL_NIF_TERM StatsLevelEnumToAtom(rocksdb::StatsLevel stats_level)
{
if (stats_level == rocksdb::StatsLevel::kDisableAll)
{
return ATOM_STATS_DISABLE_ALL;
}
else if (stats_level == rocksdb::StatsLevel::kExceptTickers)
{
return ATOM_STATS_EXCEPT_TICKERS;
}
else if (stats_level == rocksdb::StatsLevel::kExceptHistogramOrTimers)
{
return ATOM_STATS_EXCEPT_HISTOGRAM_OR_TIMERS;
}
else if (stats_level == rocksdb::StatsLevel::kExceptTimers)
{
return ATOM_STATS_EXCEPT_TIMERS;
}
else if (stats_level == rocksdb::StatsLevel::kExceptDetailedTimers)
{
return ATOM_STATS_EXCEPT_DETAILED_TIMERS;
}
else if (stats_level == rocksdb::StatsLevel::kExceptTimeForMutex)
{
return ATOM_STATS_EXCEPT_TIME_FOR_MUTEX;
}
return ATOM_STATS_ALL;
}
ERL_NIF_TERM
SetStatsLevel(
ErlNifEnv* env,
int /*argc*/,
const ERL_NIF_TERM argv[])
{
Statistics* statistics_ptr = erocksdb::Statistics::RetrieveStatisticsResource(env, argv[0]);
if (statistics_ptr == nullptr)
return enif_make_badarg(env);
std::lock_guard<std::mutex> guard(statistics_ptr->mu);
std::shared_ptr<rocksdb::Statistics> statistics = statistics_ptr->statistics();
rocksdb::StatsLevel stats_level;
if (StatsLevelAtomToEnum(argv[1], &stats_level)) {
statistics->set_stats_level(stats_level);
}
return ATOM_OK;
}
ERL_NIF_TERM
StatisticsInfo(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
Statistics* statistics_ptr = erocksdb::Statistics::RetrieveStatisticsResource(env, argv[0]);
if (statistics_ptr == nullptr)
return enif_make_badarg(env);
std::lock_guard<std::mutex> guard(statistics_ptr->mu);
std::shared_ptr<rocksdb::Statistics> statistics = statistics_ptr->statistics();
ERL_NIF_TERM stats_level = StatsLevelEnumToAtom(statistics->get_stats_level());
ERL_NIF_TERM info = enif_make_list(env, 0);
return enif_make_list_cell(env,
enif_make_tuple2(env, erocksdb::ATOM_STATS_LEVEL, stats_level),
info);
}
}