Merge pull request #39867 from ClickHouse/keeper-block-memory-tracker-commit

Block memory tracker in Keeper during commit
This commit is contained in:
Alexey Milovidov 2022-08-06 02:02:29 +03:00 committed by GitHub
commit adc880f362
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 3 deletions

2
contrib/NuRaft vendored

@ -1 +1 @@
Subproject commit 2ef198694e10c86175ee6ead389346d199060437
Subproject commit 1b0af760b3506b8e35b50cb7df098cbad5064ff2

View File

@ -20,6 +20,7 @@
#include <libnuraft/raft_server.hxx>
#include <Poco/Util/AbstractConfiguration.h>
#include <Poco/Util/Application.h>
#include <Common/LockMemoryExceptionInThread.h>
#include <Common/ZooKeeper/ZooKeeperIO.h>
#include <Common/Stopwatch.h>
@ -174,6 +175,17 @@ struct KeeperServer::KeeperRaftServer : public nuraft::raft_server
reconfigure(new_config);
}
void commit_in_bg() override
{
// For NuRaft, if any commit fails (uncaught exception) the whole server aborts as a safety
// This includes failed allocation which can produce an unknown state for the storage,
// making it impossible to handle correctly.
// We block the memory tracker for all the commit operations (including KeeperStateMachine::commit)
// assuming that the allocations are small
LockMemoryExceptionInThread blocker{VariableContext::Global};
nuraft::raft_server::commit_in_bg();
}
using nuraft::raft_server::raft_server;
// peers are initially marked as responding because at least one cycle

View File

@ -14,7 +14,7 @@
#include <Common/hex.h>
#include <Common/logger_useful.h>
#include <Common/setThreadName.h>
#include <Common/MemoryTrackerBlockerInThread.h>
#include <Common/LockMemoryExceptionInThread.h>
#include <Coordination/pathUtils.h>
#include <Coordination/KeeperConstants.h>
#include <sstream>
@ -2127,7 +2127,7 @@ void KeeperStorage::rollbackRequest(int64_t rollback_zxid, bool allow_missing)
// if an exception occurs during rollback, the best option is to terminate because we can end up in an inconsistent state
// we block memory tracking so we can avoid terminating if we're rollbacking because of memory limit
MemoryTrackerBlockerInThread temporarily_ignore_any_memory_limits;
LockMemoryExceptionInThread blocker{VariableContext::Global};
try
{
uncommitted_transactions.pop_back();