diff options
Diffstat (limited to 'src/mongo/db/storage/wiredtiger/wiredtiger_begin_transaction_block.cpp')
-rw-r--r-- | src/mongo/db/storage/wiredtiger/wiredtiger_begin_transaction_block.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_begin_transaction_block.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_begin_transaction_block.cpp index 1ad70b3d11b..c3421f81987 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_begin_transaction_block.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_begin_transaction_block.cpp @@ -91,10 +91,16 @@ WiredTigerBeginTxnBlock::~WiredTigerBeginTxnBlock() { Status WiredTigerBeginTxnBlock::setReadSnapshot(Timestamp readTimestamp) { invariant(_rollback); - std::string readTSConfigString = "read_timestamp={:x}"_format(readTimestamp.asULL()); + // Avoid heap allocation in favour of a stack allocation for the configuration string. + constexpr auto configFmtString = "read_timestamp={:x}"; + constexpr auto numBytesRequired = std::char_traits<char>::length(configFmtString) + + (sizeof(decltype(readTimestamp.asULL())) * 2) + 1; + std::array<char, numBytesRequired> configString; + auto end = + fmt::format_to(configString.begin(), FMT_STRING(configFmtString), readTimestamp.asULL()); + *end = '\0'; - return wtRCToStatus(_session->timestamp_transaction(_session, readTSConfigString.c_str()), - _session); + return wtRCToStatus(_session->timestamp_transaction(_session, configString.begin()), _session); } void WiredTigerBeginTxnBlock::done() { |