diff options
author | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-05-06 14:09:49 +0300 |
---|---|---|
committer | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-05-06 14:09:49 +0300 |
commit | c6c03ee079d245c66db80036c1aefe49668c1fd0 (patch) | |
tree | d2ad03ea3735803e2a697dd5bde7bc3a2f8b44d8 /library/cpp/logger/reopen.h | |
parent | f37f9be0a24ff9246db4360b6614da440b779386 (diff) | |
download | ydb-c6c03ee079d245c66db80036c1aefe49668c1fd0.tar.gz |
intermediate changes
ref:73802948623046c57dcf98a142cb281f33eea5c7
Diffstat (limited to 'library/cpp/logger/reopen.h')
-rw-r--r-- | library/cpp/logger/reopen.h | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/library/cpp/logger/reopen.h b/library/cpp/logger/reopen.h new file mode 100644 index 00000000000..47f44be11b6 --- /dev/null +++ b/library/cpp/logger/reopen.h @@ -0,0 +1,40 @@ +#pragma once + +#include "log.h" +#include "backend.h" + +#include <util/generic/fwd.h> +#include <util/generic/ptr.h> +#include <util/generic/size_literals.h> + +#include <atomic> + +class TReopenLogBackend: public TLogBackend { +public: + explicit TReopenLogBackend(THolder<TLogBackend>&& backend, ui64 bytesWrittenLimit = 1_GB) + : Backend_(std::move(backend)), BytesWrittenLimit_(bytesWrittenLimit), BytesWritten_(0) { + Y_ENSURE(BytesWrittenLimit_ > 0); + } + + void WriteData(const TLogRecord& rec) override { + const ui64 prevWritten = BytesWritten_.fetch_add(rec.Len); + if (prevWritten < BytesWrittenLimit_ && prevWritten + rec.Len >= BytesWrittenLimit_) { + try { + ReopenLog(); + } catch (...) { + } + } + Backend_->WriteData(rec); + } + + void ReopenLog() override { + BytesWritten_.store(0); + Backend_->ReopenLog(); + } + +private: + const THolder<TLogBackend> Backend_; + + const ui64 BytesWrittenLimit_; + std::atomic<ui64> BytesWritten_; +}; |