diff options
author | samantharitter <samantha.ritter@10gen.com> | 2016-04-11 13:38:15 -0400 |
---|---|---|
committer | samantharitter <samantha.ritter@10gen.com> | 2016-05-04 13:52:48 -0400 |
commit | c8b9c6bcd9c0fd74c37570727516956656eb1b65 (patch) | |
tree | 15276c075ceb080263b54d6380aa44a7d4f5bcff /src/mongo/transport/transport_layer.h | |
parent | c1c1096d90bb335a503c87936230a9fa3e1f6a41 (diff) | |
download | mongo-c8b9c6bcd9c0fd74c37570727516956656eb1b65.tar.gz |
SERVER-23638 Headers for new ingress networking types
Diffstat (limited to 'src/mongo/transport/transport_layer.h')
-rw-r--r-- | src/mongo/transport/transport_layer.h | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/mongo/transport/transport_layer.h b/src/mongo/transport/transport_layer.h new file mode 100644 index 00000000000..0cd3745240a --- /dev/null +++ b/src/mongo/transport/transport_layer.h @@ -0,0 +1,152 @@ +/** + * Copyright (C) 2016 MongoDB Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the GNU Affero General Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ + +#pragma once + +#include "mongo/base/status.h" +#include "mongo/stdx/functional.h" +#include "mongo/transport/session.h" +#include "mongo/transport/ticket.h" +#include "mongo/util/net/message.h" +#include "mongo/util/time_support.h" + +namespace mongo { +namespace transport { + +/** + * The TransportLayer moves Messages between transport::Endpoints and the database. + * This class owns an Acceptor that generates new endpoints from which it can + * source Messages. + * + * The TransportLayer creates Session objects and maps them internally to + * endpoints. New Sessions are passed to the database (via a ServiceEntryPoint) + * to be run. The database must then call additional methods on the TransportLayer + * to manage the Session in a get-Message, handle-Message, return-Message cycle. + * It must do this on its own thread(s). + * + * References to the TransportLayer should be stored on service context objects. + */ +class TransportLayer { + MONGO_DISALLOW_COPYING(TransportLayer); + +public: + virtual ~TransportLayer() = default; + + /** + * Source (receive) a new Message for this Session. + * + * This method returns a work Ticket. The caller must complete the Ticket by + * passing it to either TransportLayer::wait() or TransportLayer::asyncWait(). + * + * If an expiration date is given, the returned Ticket will expire at that time. + * + * When run, the returned Ticket will be exchanged for a Status. If the + * TransportLayer is unable to source a Message, this will be a failed status, + * and the passed-in Message buffer may be left in an invalid state. + */ + virtual Ticket sourceMessage(const Session& session, + Message* message, + Date_t expiration = Ticket::kNoExpirationDate) = 0; + + /** + * Sink (send) a new Message for this Session. This method should be used + * to send replies to a given host. + * + * This method returns a work Ticket. The caller must complete the Ticket by + * passing it to either TransportLayer::wait() or TransportLayer::asyncWait(). + * + * If an expiration date is given, the returned Ticket will expire at that time. + * + * When run, the returned Ticket will be exchanged for a Status. If the + * TransportLayer is unable to sink the Message, this will be a failed status. + * + * This method does NOT take ownership of the sunk Message, which must be cleaned + * up by the caller. + */ + virtual Ticket sinkMessage(const Session& session, + const Message& message, + Date_t expiration = Ticket::kNoExpirationDate) = 0; + + /** + * Perform a synchronous wait on the given work Ticket. When this call returns, + * the Ticket will have been completed. A call to wait() consumes the Ticket. + * + * This thread may be used by the TransportLayer to run other Tickets that were + * enqueued prior to this call. + */ + virtual Status wait(Ticket ticket) = 0; + + /** + * Callback for Tickets that are run via asyncWait(). + */ + using TicketCallback = stdx::function<void(Status)>; + + /** + * Perform an asynchronous wait on the given work Ticket. Once the Ticket has been + * completed, the passed-in callback will be invoked. + * + * This thread will not be used by the TransportLayer to perform work. The callback + * passed to asyncWait() may be run on any thread. + */ + virtual void asyncWait(Ticket ticket, TicketCallback callback) = 0; + + /** + * End the given Session. Tickets for this Session that have already been + * started via wait() or asyncWait() will complete, but may return a failed Status. + * Future calls to wait() or asyncWait() for this Session will fail. If this + * TransportLayer implementation is networked, any connections for this Session will + * be closed. + * + * ~Session() will automatically call end() with itself. + * + * This method is idempotent and synchronous. + */ + virtual void end(const Session& session) = 0; + + /** + * End all active sessions in the TransportLayer. Tickets that have already been + * started via wait() or asyncWait() will complete, but may return a failed Status. + * This method is synchronous and will not return until all sessions have ended. + */ + virtual void endAllSessions() = 0; + + /** + * Shut the TransportLayer down. After this point, the TransportLayer will + * end all active sessions and won't accept new transport::Endpoints. Any + * future calls to wait() or asyncWait() will fail. This method is synchronous and + * will not return until all sessions have ended and any network connections have been + * closed. + */ + virtual void shutdown() = 0; + +protected: + TransportLayer() = default; +}; + +} // namespace transport +} // namespace mongo |