Files
scylladb/utils/rate_limiter.hh
Nadav Har'El fe1ba753ce Avoid semaphore's default initial value
The fact that Seastar's semaphore has a default initializer of 1 if not
explicitly initialized is confusing and unexpected and recently lead to
two bugs. So ScyllaDB should not rely on this default behavior, and specify
the initial value of each semaphore explicitly.

In several cases in the ScyllaDB code, the explict initialization was
missing, and this patch adds it. In one case (rate_limiter) I even think
the default of 1 was a bit strange, and 0 makes more sense.

Signed-off-by: Nadav Har'El <nyh@scylladb.com>
Message-Id: <1474530745-23951-1-git-send-email-nyh@scylladb.com>
2016-09-24 19:25:02 +03:00

48 lines
1.2 KiB
C++

/*
* Copyright (C) 2015 ScyllaDB
*/
/*
* This file is part of Scylla.
*
* Scylla is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Scylla is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Scylla. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "core/timer.hh"
#include "core/semaphore.hh"
#include "core/reactor.hh"
namespace utils {
/**
* 100% naive rate limiter. Consider it a placeholder
* Will let you process X "units" per second, then reset this every s.
* Obviously, accuracy is virtually non-existant and steady rate will fluctuate.
*/
class rate_limiter {
private:
timer<lowres_clock> _timer;
size_t _units_per_s;
semaphore _sem {0};
void on_timer();
public:
rate_limiter(size_t rate);
future<> reserve(size_t u);
};
}