Skip to content

Commit 1c22b0a

Browse files
Aman Sharmameta-codesync[bot]
authored andcommitted
Use MloggerFactory within the MoQServer
Summary: Previously, we just had one `MLogger` for the whole `MoQServer`. Instead, we'd like to have one `MLogger` per `MoQSession`, which is similar to how we have one `QLogger` for each QUIC connection in mvfst. In order to do this, I'm creating an `MLoggerFactory` member of the `MoQServer` that would allow us to create a new `MLogger` whenever a new session is created. Reviewed By: sandarsh Differential Revision: D89326321 fbshipit-source-id: 3b2b6990f764f98a5a5fbdf09c1937c73ba00b7f
1 parent b755ec7 commit 1c22b0a

File tree

7 files changed

+70
-28
lines changed

7 files changed

+70
-28
lines changed

moxygen/MoQServer.cpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ void MoQServer::createMoQQuicSession(
115115
auto evb = qevb->getTypedEventBase<quic::FollyQuicEventBase>()
116116
->getBackingEventBase();
117117
auto moqSession = createSession(std::move(wt), getOrCreateExecutor(evb));
118+
if (mLoggerFactory_) {
119+
auto logger = createLogger();
120+
moqSession->setLogger(logger);
121+
}
118122

119123
// Configure session based on negotiated ALPN
120124
if (alpn) {
@@ -283,8 +287,8 @@ folly::Try<ServerSetup> MoQServer::onClientSetup(
283287
};
284288

285289
// Log Server Setup
286-
if (logger_) {
287-
logger_->logServerSetup(serverSetup);
290+
if (auto logger = session->getLogger()) {
291+
logger->logServerSetup(serverSetup);
288292
}
289293

290294
return folly::Try<ServerSetup>(serverSetup);
@@ -351,6 +355,10 @@ void MoQServer::Handler::onHeadersComplete(
351355
clientSession_ = server_.createSession(
352356
folly::MaybeManagedPtr<proxygen::WebTransport>(wt),
353357
server_.getOrCreateExecutor(evb));
358+
if (server_.mLoggerFactory_) {
359+
auto logger = server_.createLogger();
360+
clientSession_->setLogger(logger);
361+
}
354362

355363
// Configure session based on negotiated WebTransport protocol
356364
if (negotiatedProtocol) {
@@ -360,12 +368,15 @@ void MoQServer::Handler::onHeadersComplete(
360368
co_withExecutor(evb, server_.handleClientSession(clientSession_)).start();
361369
}
362370

363-
void MoQServer::setLogger(std::shared_ptr<MLogger> logger) {
364-
logger_ = std::move(logger);
371+
void MoQServer::setMLoggerFactory(std::shared_ptr<MLoggerFactory> factory) {
372+
mLoggerFactory_ = std::move(factory);
365373
}
366374

367-
std::shared_ptr<MLogger> MoQServer::getLogger() const {
368-
return logger_;
375+
std::shared_ptr<MLogger> MoQServer::createLogger() const {
376+
if (mLoggerFactory_) {
377+
return mLoggerFactory_->createMLogger();
378+
}
379+
return nullptr;
369380
}
370381

371382
void MoQServer::setQuicStatsFactory(
@@ -384,10 +395,11 @@ std::shared_ptr<MoQExecutor> MoQServer::getOrCreateExecutor(
384395
std::shared_ptr<MoQSession> MoQServer::createSession(
385396
folly::MaybeManagedPtr<proxygen::WebTransport> wt,
386397
std::shared_ptr<MoQExecutor> executor) {
387-
return std::make_shared<MoQSession>(
398+
auto session = std::make_shared<MoQSession>(
388399
folly::MaybeManagedPtr<proxygen::WebTransport>(std::move(wt)),
389400
*this,
390401
std::move(executor));
402+
return session;
391403
}
392404

393405
} // namespace moxygen

moxygen/MoQServer.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#pragma once
88

99
#include <proxygen/httpserver/samples/hq/HQServer.h>
10-
#include <moxygen/mlog/MLogger.h>
10+
#include <moxygen/mlog/MLoggerFactory.h>
1111

1212
#include <folly/init/Init.h>
1313
#include <folly/io/async/EventBaseLocal.h>
@@ -48,8 +48,7 @@ class MoQServer : public MoQSession::ServerSetupCallback {
4848
return hqServer_->getWorkerEvbs();
4949
}
5050

51-
void setLogger(std::shared_ptr<MLogger> logger);
52-
std::shared_ptr<MLogger> getLogger() const;
51+
void setMLoggerFactory(std::shared_ptr<MLoggerFactory> factory);
5352

5453
// QUIC stats factory setter
5554
void setQuicStatsFactory(
@@ -104,6 +103,9 @@ class MoQServer : public MoQSession::ServerSetupCallback {
104103
// Register ALPN handlers for direct QUIC connections (internal use)
105104
void registerAlpnHandler(const std::vector<std::string>& alpns);
106105

106+
// Create a logger from the factory if one is set
107+
std::shared_ptr<MLogger> createLogger() const;
108+
107109
private:
108110
// AUTHORITY parameter validation methods
109111
// Not called for HTTP inside proxygen, we leave it to applications.
@@ -183,7 +185,9 @@ class MoQServer : public MoQSession::ServerSetupCallback {
183185
std::unique_ptr<quic::samples::HQServerTransportFactory> factory_;
184186
std::unique_ptr<quic::samples::HQServer> hqServer_;
185187
std::string endpoint_;
186-
std::shared_ptr<MLogger> logger_;
188+
std::shared_ptr<MLoggerFactory> mLoggerFactory_;
187189
folly::EventBaseLocal<std::shared_ptr<MoQExecutor>> executorLocal_;
190+
191+
friend class Handler;
188192
};
189193
} // namespace moxygen

moxygen/MoQSession.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2074,6 +2074,9 @@ MoQSession::MoQSession(
20742074

20752075
MoQSession::~MoQSession() {
20762076
cleanup();
2077+
if (logger_) {
2078+
logger_->outputLogsToFile();
2079+
}
20772080
XLOG(DBG1) << __func__ << " sess=" << this;
20782081
}
20792082

@@ -2166,6 +2169,10 @@ void MoQSession::setLogger(const std::shared_ptr<MLogger>& logger) {
21662169
logger_ = logger;
21672170
}
21682171

2172+
std::shared_ptr<MLogger> MoQSession::getLogger() const {
2173+
return logger_;
2174+
}
2175+
21692176
void MoQSession::drain() {
21702177
XLOG(DBG1) << __func__ << " sess=" << this;
21712178
draining_ = true;

moxygen/MoQSession.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ class MoQSession : public Subscriber,
376376
RequestID requestID);
377377

378378
void setLogger(const std::shared_ptr<MLogger>& logger);
379+
std::shared_ptr<MLogger> getLogger() const;
379380
RequestID peekNextRequestID() const {
380381
return nextRequestID_;
381382
}

moxygen/moqtest/MoQTestServer.h

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,24 @@ class MoQTestServer : public moxygen::Publisher,
5959
public:
6060
MoQTestServer(const std::string& cert = "", const std::string& key = "");
6161

62+
// Server-level logger methods
63+
void setLogger(std::shared_ptr<MLogger> logger) {
64+
logger_ = std::move(logger);
65+
}
66+
67+
std::shared_ptr<MLogger> getLogger() const {
68+
return logger_;
69+
}
70+
6271
// Override onNewSession to set publisher handler to be this object
6372
virtual void onNewSession(
6473
std::shared_ptr<MoQSession> clientSession) override {
6574
clientSession->setPublishHandler(shared_from_this());
66-
if (getLogger()) {
67-
clientSession->setLogger(getLogger());
75+
// Use server-level logger if set, otherwise try factory
76+
if (logger_) {
77+
clientSession->setLogger(logger_);
78+
} else if (auto logger = createLogger()) {
79+
clientSession->setLogger(std::move(logger));
6880
}
6981
}
7082

@@ -139,6 +151,9 @@ class MoQTestServer : public moxygen::Publisher,
139151
std::shared_ptr<MoQRelaySession> relaySession_;
140152
std::shared_ptr<Subscriber::AnnounceHandle> announceHandle_;
141153
std::shared_ptr<MoQFollyExecutorImpl> moqEvb_;
154+
155+
// Server-level logger
156+
std::shared_ptr<MLogger> logger_;
142157
};
143158

144159
} // namespace moxygen

moxygen/relay/MoQRelayClient.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,11 @@ class MoQRelayClient {
112112
}
113113
}
114114
announceHandles_.clear();
115+
// Flush mLogs before closing the session, since closeSession() does not
116+
// trigger onSessionEnd callback (where logs would normally be flushed)
117+
if (moqClient_ && moqClient_->logger_) {
118+
moqClient_->logger_->outputLogsToFile();
119+
}
115120
if (moqClient_ && moqClient_->moqSession_) {
116121
// Break strong references held by the session to the Publisher/Subscriber
117122
moqClient_->moqSession_->setPublishHandler(nullptr);

moxygen/samples/date/MoQDateServer.cpp

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <moxygen/MoQLocation.h>
1212
#include <moxygen/MoQServer.h>
1313
#include <moxygen/MoQWebTransportClient.h>
14+
#include <moxygen/mlog/FileMLoggerFactory.h>
1415
#include <moxygen/relay/MoQForwarder.h>
1516
#include <moxygen/relay/MoQRelayClient.h>
1617
#include <moxygen/util/InsecureVerifierDangerousDoNotUseInProduction.h>
@@ -130,8 +131,8 @@ class MoQDateServer : public MoQServer,
130131
MoQRelaySession::createRelaySessionFactory(),
131132
verifier)));
132133

133-
if (getLogger()) {
134-
relayClient_->setLogger(getLogger());
134+
if (auto logger = createLogger()) {
135+
relayClient_->setLogger(logger);
135136
}
136137

137138
// Default to experimental protocols, override to legacy if flag set
@@ -162,8 +163,11 @@ class MoQDateServer : public MoQServer,
162163

163164
void onNewSession(std::shared_ptr<MoQSession> clientSession) override {
164165
clientSession->setPublishHandler(shared_from_this());
165-
if (getLogger()) {
166-
clientSession->setLogger(getLogger());
166+
}
167+
168+
void shutdownRelayClient() {
169+
if (relayClient_) {
170+
relayClient_->shutdown();
167171
}
168172
}
169173

@@ -644,10 +648,9 @@ int main(int argc, char* argv[]) {
644648
}
645649

646650
if (!FLAGS_mlog_path.empty()) {
647-
auto logger =
648-
std::make_shared<moxygen::MLogger>(moxygen::VantagePoint::SERVER);
649-
logger->setPath(FLAGS_mlog_path);
650-
server->setLogger(logger);
651+
auto factory = std::make_shared<moxygen::FileMLoggerFactory>(
652+
FLAGS_mlog_path, moxygen::VantagePoint::SERVER);
653+
server->setMLoggerFactory(factory);
651654
}
652655

653656
folly::SocketAddress addr("::", FLAGS_port);
@@ -656,17 +659,12 @@ int main(int argc, char* argv[]) {
656659
return 1;
657660
}
658661

659-
SigHandler handler(&evb, [&server, &evb](int) {
660-
if (server->getLogger()) {
661-
server->getLogger()->outputLogsToFile();
662-
}
662+
SigHandler handler(&evb, [&evb, server](int) {
663+
server->shutdownRelayClient();
663664
evb.terminateLoopSoon();
664665
});
665666

666667
evb.loopForever();
667668

668-
if (server->getLogger()) {
669-
server->getLogger()->outputLogsToFile();
670-
}
671669
return 0;
672670
}

0 commit comments

Comments
 (0)