#include "session_config.h" #include <util/generic/strbuf.h> #include <util/string/hex.h> using namespace NBus; TBusSessionConfig::TSecret::TSecret() : TimeoutPeriod(TDuration::Seconds(1)) , StatusFlushPeriod(TDuration::MilliSeconds(400)) { } TBusSessionConfig::TBusSessionConfig() : BUS_SESSION_CONFIG_MAP(STRUCT_FIELD_INIT, COMMA) { } TString TBusSessionConfig::PrintToString() const { TStringStream ss; BUS_SESSION_CONFIG_MAP(STRUCT_FIELD_PRINT, ) return ss.Str(); } static int ParseDurationForMessageBus(const char* option) { return TDuration::Parse(option).MilliSeconds(); } static int ParseToSForMessageBus(const char* option) { int tos; TStringBuf str(option); if (str.StartsWith("0x")) { str = str.Tail(2); Y_ABORT_UNLESS(str.length() == 2, "ToS must be a number between 0x00 and 0xFF"); tos = String2Byte(str.data()); } else { tos = FromString<int>(option); } Y_ABORT_UNLESS(tos >= 0 && tos <= 255, "ToS must be between 0x00 and 0xFF"); return tos; } template <class T> static T ParseWithKmgSuffixT(const char* option) { TStringBuf str(option); T multiplier = 1; if (str.EndsWith('k')) { multiplier = 1024; str = str.Head(str.size() - 1); } else if (str.EndsWith('m')) { multiplier = 1024 * 1024; str = str.Head(str.size() - 1); } else if (str.EndsWith('g')) { multiplier = 1024 * 1024 * 1024; str = str.Head(str.size() - 1); } return FromString<T>(str) * multiplier; } static ui64 ParseWithKmgSuffix(const char* option) { return ParseWithKmgSuffixT<ui64>(option); } static i64 ParseWithKmgSuffixS(const char* option) { return ParseWithKmgSuffixT<i64>(option); } void TBusSessionConfig::ConfigureLastGetopt(NLastGetopt::TOpts& opts, const TString& prefix) { opts.AddLongOption(prefix + "total-timeout") .RequiredArgument("MILLISECONDS") .DefaultValue(ToString(TotalTimeout)) .StoreMappedResultT<const char*>(&TotalTimeout, &ParseDurationForMessageBus); opts.AddLongOption(prefix + "connect-timeout") .RequiredArgument("MILLISECONDS") .DefaultValue(ToString(ConnectTimeout)) .StoreMappedResultT<const char*>(&ConnectTimeout, &ParseDurationForMessageBus); opts.AddLongOption(prefix + "send-timeout") .RequiredArgument("MILLISECONDS") .DefaultValue(ToString(SendTimeout)) .StoreMappedResultT<const char*>(&SendTimeout, &ParseDurationForMessageBus); opts.AddLongOption(prefix + "send-threshold") .RequiredArgument("BYTES") .DefaultValue(ToString(SendThreshold)) .StoreMappedResultT<const char*>(&SendThreshold, &ParseWithKmgSuffix); opts.AddLongOption(prefix + "max-in-flight") .RequiredArgument("COUNT") .DefaultValue(ToString(MaxInFlight)) .StoreMappedResultT<const char*>(&MaxInFlight, &ParseWithKmgSuffix); opts.AddLongOption(prefix + "max-in-flight-by-size") .RequiredArgument("BYTES") .DefaultValue( ToString(MaxInFlightBySize)) .StoreMappedResultT<const char*>(&MaxInFlightBySize, &ParseWithKmgSuffixS); opts.AddLongOption(prefix + "per-con-max-in-flight") .RequiredArgument("COUNT") .DefaultValue(ToString(PerConnectionMaxInFlight)) .StoreMappedResultT<const char*>(&PerConnectionMaxInFlight, &ParseWithKmgSuffix); opts.AddLongOption(prefix + "per-con-max-in-flight-by-size") .RequiredArgument("BYTES") .DefaultValue( ToString(PerConnectionMaxInFlightBySize)) .StoreMappedResultT<const char*>(&PerConnectionMaxInFlightBySize, &ParseWithKmgSuffix); opts.AddLongOption(prefix + "default-buffer-size") .RequiredArgument("BYTES") .DefaultValue(ToString(DefaultBufferSize)) .StoreMappedResultT<const char*>(&DefaultBufferSize, &ParseWithKmgSuffix); opts.AddLongOption(prefix + "max-buffer-size") .RequiredArgument("BYTES") .DefaultValue(ToString(MaxBufferSize)) .StoreMappedResultT<const char*>(&MaxBufferSize, &ParseWithKmgSuffix); opts.AddLongOption(prefix + "max-message-size") .RequiredArgument("BYTES") .DefaultValue(ToString(MaxMessageSize)) .StoreMappedResultT<const char*>(&MaxMessageSize, &ParseWithKmgSuffix); opts.AddLongOption(prefix + "socket-recv-buffer-size") .RequiredArgument("BYTES") .DefaultValue(ToString(SocketRecvBufferSize)) .StoreMappedResultT<const char*>(&SocketRecvBufferSize, &ParseWithKmgSuffix); opts.AddLongOption(prefix + "socket-send-buffer-size") .RequiredArgument("BYTES") .DefaultValue(ToString(SocketSendBufferSize)) .StoreMappedResultT<const char*>(&SocketSendBufferSize, &ParseWithKmgSuffix); opts.AddLongOption(prefix + "socket-tos") .RequiredArgument("[0x00, 0xFF]") .StoreMappedResultT<const char*>(&SocketToS, &ParseToSForMessageBus); ; opts.AddLongOption(prefix + "tcp-cork") .RequiredArgument("BOOL") .DefaultValue(ToString(TcpCork)) .StoreResult(&TcpCork); opts.AddLongOption(prefix + "cork") .RequiredArgument("SECONDS") .DefaultValue( ToString(Cork.Seconds())) .StoreMappedResultT<const char*>(&Cork, &TDuration::Parse); opts.AddLongOption(prefix + "on-message-in-pool") .RequiredArgument("BOOL") .DefaultValue(ToString(ExecuteOnMessageInWorkerPool)) .StoreResult(&ExecuteOnMessageInWorkerPool); opts.AddLongOption(prefix + "on-reply-in-pool") .RequiredArgument("BOOL") .DefaultValue(ToString(ExecuteOnReplyInWorkerPool)) .StoreResult(&ExecuteOnReplyInWorkerPool); }