Files
scylla/gms/generation-number.cc
Benny Halevy 5520d3a8e3 gossiper: version_generator: add {debug_,}validate_gossip_generation
Make sure that the int64_t generation we get over rpc
fits in the int32_t generation_type we keep locally.

Restrict this assertion to non-release builds.

Signed-off-by: Benny Halevy <bhalevy@scylladb.com>
2023-04-23 08:48:01 +03:00

37 lines
887 B
C++

/*
* Copyright 2020-present ScyllaDB
*/
/*
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#include <cassert>
#include <chrono>
#include <utility>
#include <exception>
#include <fmt/format.h>
#include "generation-number.hh"
namespace gms {
generation_type get_generation_number() {
using namespace std::chrono;
auto now = high_resolution_clock::now().time_since_epoch();
int generation_number = duration_cast<seconds>(now).count();
auto ret = generation_type(generation_number);
// Make sure the clock didn't overflow the 32 bits value
assert(ret.value() == generation_number);
return ret;
}
void validate_gossip_generation(int64_t generation_number) {
if (!std::in_range<gms::generation_type::value_type>(generation_number)) {
throw std::out_of_range(fmt::format("gossip generation {} is out of range", generation_number));
}
}
}