From 130a0908c7c4ee318b2ed07befd57d9658013dee Mon Sep 17 00:00:00 2001 From: Gabriel Levcovitz Date: Fri, 27 Sep 2024 20:59:13 -0300 Subject: [PATCH 1/2] feat: add P2P Multiprocess RFC --- .../p2p-multiprocess/0001-images/after.png | Bin 0 -> 79522 bytes .../p2p-multiprocess/0001-images/before.png | Bin 0 -> 29773 bytes .../p2p-multiprocess/0001-p2p-multiprocess.md | 234 ++++++++++++++++++ 3 files changed, 234 insertions(+) create mode 100644 projects/p2p-multiprocess/0001-images/after.png create mode 100644 projects/p2p-multiprocess/0001-images/before.png create mode 100644 projects/p2p-multiprocess/0001-p2p-multiprocess.md diff --git a/projects/p2p-multiprocess/0001-images/after.png b/projects/p2p-multiprocess/0001-images/after.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2ec7d154c652660de8f8839e3352fad7976df1 GIT binary patch literal 79522 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�e3L1{y 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 aT1N%Fm8@MEATD6&!tPl_b;eEtuI*`%8Q literal 0 HcmV?d00001 diff --git a/projects/p2p-multiprocess/0001-p2p-multiprocess.md b/projects/p2p-multiprocess/0001-p2p-multiprocess.md new file mode 100644 index 0000000..2a6306e --- /dev/null +++ b/projects/p2p-multiprocess/0001-p2p-multiprocess.md @@ -0,0 +1,234 @@ +- Feature Name: P2P Multiprocess +- Start Date: 2024-09-25 +- Initial Document: [P2P Multiprocess](https://docs.google.com/document/d/1afh9ObSgePevcZ8-WNZJU4-LwFVEKqR9F5yTDeppFjU/edit) +- Author: Gabriel Levcovitz <> + +# Summary +[summary]: #summary + +Some parts of the full node are independent and could run in separate processes, so we can improve the performance and security. We should start separating the P2P network. This would already give us some speed and the full node wouldn't stop responding to HTTP requests when a heavy P2P sync method is called. + +# Motivation +[motivation]: #motivation + +All full node components (P2P network, HTTP API, consensus, etc) currently run in a single thread, in a single process. They could be split into multiple processes, so we can scale and support more requests and transactions per second. + +Also, since the mechanism is blocking, the full node can't reply HTTP requests when we have heavy sync calls in the P2P protocol. + +# Guide-level explanation +[Guide-level explanation]: #guide-level-explanation + +The problem to be solved by this project can be described as uncoupling the P2P subsystem from the full node. In order to do this, we'll have to refactor all coupling points out of the system. This means we must separate every IO, every callback, and every connection, direct or indirect, between the P2P classes and the rest of the codebase. + +Once this is done, we should take this independent P2P subsystem and run it in different processes, one for each connection with the network. Of course, we can't use multithreading in Python because of the GIL (in Python 3.13 you can disable it, but it's still experimental). Even if we could, running on separate processes instead of threads has the added benefit that one process does not interfere with the other, as they have separate memory spaces at the OS level. + +During sync P2P agents have to query data from the full node, such as accessing the storage. Then, when processing is done, the agent sends the downloaded vertex to the full node through the `VertexHandler.on_new_vertex` method. This means we must design a way for the subprocess to communicate with the main process, bidirectionally. + +To design the solution, we have to first consider the current architecture: + +![](./0001-images/before.png) + +In this diagram, arrows represent call flow and nested blocks represent inheritance. Currently, the `HathorLineReceiver` class has a double inheritance from `LineReceiver` and `HathorProtocol`. The former is a class provided by Twisted, inheriting from `twisted.Protocol`. The latter is our sync class that actually implements and kickstarts the whole sync logic (it instantiates and handles multiple other classes). Then, `HathorLineReceiver` subclasses them both to connect their behaviors in a single protocol. Being a Twisted protocol, it also means that it is associated with a twisted factory. When a new TCP connection is made, this factory is responsible for creating a new protocol instance, which kicks off the sync process. This bit is not represented in the diagram, but this fact will be important later. Lastly, the sync process communicates with the node though multiple pointers, represented here by the single `Node` block, containing the `HathorManager`, the `ConnectionsManager`, the `TransactionStorage`, and any other class that the sync needs from the rest of the full node. Those are called from the `HathorProtocol`. + +We have to determine where to draw the process boundary line, meaning which classes are going to execute in the subprocesses, and what remains in the main process. The requirement is that each P2P agent runs in its own process, so we know for sure that the `HathorProtocol` must run in the subprocess. We also know that `Node` will remain in the main process, as it demultiplexes the agents to run new vertices through the verification process, the consensus, and to save them in the storage in the main process. + +What about the `LineReceiver`? Ideally, it would be in the subprocess too. This would mean that every TCP message would be received and handled directly in the subprocess, and then the `HathorProtocol` would use some form of IPC to communicate with the `Node` for querying the storage and sending new vertices. However, this is not possible. Being in a separate process means using a completely separate Python interpreter, which means using separate Twisted reactors. By definition, a Twisted protocol must run in the same reactor as its Twisted factory. Then, the `LineReceiver` must also remain in the main process, and its communication with the `HathorProtocol` will also have to be through IPC. + +Here's the proposed new architecture: + +![](./0001-images/after.png) + +It simply moves the `HathorProtocol` out of the inheritance tree, and changes its communication with the `LineReceiver` to use IPC. It does the same for its communication with the `Node`. + +The new `IpcLineReceiver` is a protocol, by still inheriting `LineReceiver`. Through composition, an `IpcServer` has access to it, and it has access to an `IpcClient`. Both of them are connected to an `IpcConnection`, which is simply a wrapper to Python's `multiprocessing.Connection` (which in turn wraps a UNIX socket). The `IpcConnection` is able to connect to another `IpcConnection` in a subprocess, which symmetrically connects to another client/server pair, connected to the `HathorProtocol`. The main process' `IpcServer` also has access to the rest of the `Node`. + +When a new TCP connection is created, the Twisted factory (not shown here) will instantiate a new `IpcLineReceiver` protocol. It will do so by setting up and starting a subprocess and arranging all those connections. Then, when a TCP message is received, Twisted will call `IpcLineReceiver.lineReceived`, which will call `HathorProtocol.recv_message` through the `IpcClient`. Analogously, when `HathorProtocol` needs some information from the storage, it will call `Node` through its `IpcClient`. Each client is responded by the corresponding `IpcServer` on the other process. They all share a single UNIX socket through the `IpcConnection` abstraction. Lastly, the `HathorProtocol` can also call `VertexHandler.on_new_vertex` through the same path. The underlying protocol used in the IPC is a simple binary protocol pretty analogous to the sync process itself: it sends a command and data pair via a single binary string. + +# Reference-level explanation +[Reference-level explanation]: #reference-level-explanation + +## Proof-of-Concept + +In order to validate the idea described in the Guide-level section, I created a [POC](https://github.com/HathorNetwork/hathor-core/pull/1138) that simulates both diagrams. You can run the current architecture simulation by running `python hathor/current_p2p.py` in that branch, and `python hathor/p2p_mp_poc.py` to run the new architecture. + +For both simulations, you can use netcat to send TCP messages to the system, like `nc localhost 8080 -c` for an interactive session. Try opening two separate netcat sessions, and sending a message simultaneously in each one. I put a 5-second delay on `HathorProtocol` processing to simulate a CPU-heavy method. The current architecture will take ~10 seconds to respond both requests, and the new architecture takes half that time. + +Code snippets from that POC will be in the descriptions below, but some code is omitted. For the full code, see the POC link above. + +### Current architecture simulation + +In the [`hathor/current_p2p.py`](https://github.com/HathorNetwork/hathor-core/blob/fe7e9a69db37a8032516c0715dbfbf7a46744431/hathor/current_p2p.py) file, a simple script simulates the current P2P subsystem. + +- A `HathorManager` class represents the `Node` from the diagrams above, and has two methods: `read_storage` and `save_storage`. They simulate methods for interacting with the `TransactionStorage`. +- Then, the `HathorProtocol` class represents its real homonym, providing a `do_something` method that represents the sync process. Notice that it has access to the manager and calls its methods to perform the sync. It also has an abstract `send_line` method. +- The `MyLineReceiver` protocol represents the `HathorLineReceiver`, inheriting from both `LineReceiver` and `HathorProtocol`. Its `lineReceived` method calls `HathorProtocol.do_something`, and it overrides `HathorProtocol.send_line`, implementing it. +- Lastly, `MyFactory` represents both `HathorServerFactory` and `HathorClientFactory`, simply instantiating `MyLineReceiver`. + +### Proposed architecture simulation + +The [`hathor/p2p_mp_poc.py`](https://github.com/HathorNetwork/hathor-core/blob/fe7e9a69db37a8032516c0715dbfbf7a46744431/hathor/p2p_mp_poc.py) file contains the new proposed architecture simulation script. + +- It has the same `HathorManager` class as above. +- The `HathorProtocol` class is mostly the same, except it calls manager methods and `send_line` through an `IpcClient`, instead of directly. +- The `MyLineReceiver` protocol is replaced by `IpcLineReceiver`, which doesn't have access to the `HathorProtocol` anymore, and instead calls `do_something` through an `IpcClient`, too. +- The `MyFactory` class is replaced by `IpcFactory`, and when it creates a protocol instance it calls the new `ipc.connect` function (described below) to arrange the subprocess connection. +- Lastly, it contains 2 `IpcClient`s and 2 `IpcServer`s, one pair for the main process and one for the subprocess. Those are responsible for defining the interface between the processes: which commands can be called in each of them. + +### `_IpcConnection` + +The private `_IpcConnection` class wraps `multiprocessing.Connection` objects returned by the `multiprocessing.Pipe`. A pair of those represent a single connection between the main process and a subprocess, with each instance in its respective process. It is bidirectional, meaning that each end is able to send and receive messages to the other end. In other words, each end sends and receives both requests and responses. + +Its only responsibility is to run a `twisted.LoopingCall` that polls the `Connection` for new messages. When a message is received, an ID mechanism is used to determine whether the message is a new request or a response to one of its own requests. + +It provides a `call` method to send requests, which returns a `Deferred` that will be completed when the respective response is received: + +```python +def call(self, cmd: bytes, request: bytes | None) -> Deferred[bytes]: + data = cmd if request is None else cmd + MESSAGE_SEPARATOR + request + message = self._send_message(data) + deferred: Deferred[bytes] = Deferred() + self._pending_calls[message.id] = deferred + return deferred +``` + +And the polling mechanism: + +```python +def _unsafe_poll(self) -> None: + if not self._conn.poll(): + return + + message_bytes = self._conn.recv_bytes() + message = _Message.deserialize(message_bytes) + + if pending_call := self._pending_calls.pop(message.id, None): + # The received message is a response for one of our own requests + pending_call.callback(message.data) + return + + # The received message is a new request + coro = self._server.handle_request(message.data) + deferred = Deferred.fromCoroutine(coro) + deferred.addCallback(lambda response: self._send_message(response, request_id=message.id)) +``` + +Notice that it calls a `self._server.handle_request` to handle requests. That server is an `IpcServer` that will be described below. + +To keep track of which response is associated with which request, each pair is assigned a unique message ID that is created by incrementing an `int` from a `multiprocessing.Value`, a Python object that supports atomic read/writes in multiple processes. + +### `IpcClient` and `IpcServer` + +Users of the `_IpcConnection` class do not interact with it directly. Instead, they do so through client/server abstractions: + +```python +class IpcClient(ABC): + def call(self, cmd: bytes, request: bytes | None = None) -> Deferred[bytes]: + return self._ipc_conn.call(cmd, request) + +class IpcServer(ABC): + @abstractmethod + def get_cmd_map(self) -> dict[bytes, IpcCommand]: + raise NotImplementedError +``` + +The user (in this case, the sync process) must implement classes inheriting from the `IpcClient` and `IpcServer`. The client will provide the user with a way to call commands on the other process. And through the server, the user must provide a way to handle those commands. In practice, the user must implement 4 classes: 2 clients and 2 servers, one pair for the main process and another for the subprocess. + +### The `connect()` function + +Lastly, a function is provided to arrange all connections, starting the subprocess, etc. + +```python +def connect( + *, + main_reactor: ReactorProtocol, + main_client: IpcClient, + main_server: IpcServer, + subprocess_client_builder: Callable[[], ClientT], + subprocess_server_builder: Callable[[ClientT], IpcServer], + subprocess_name: str, +) -> None: + conn1: Connection + conn2: Connection + conn1, conn2 = Pipe() + message_id = multiprocessing.Value('L', 0) + + main_ipc_conn = _IpcConnection( + reactor=main_reactor, name='main', conn=conn1, message_id=message_id, server=main_server + ) + main_client.set_ipc_conn(main_ipc_conn) + main_ipc_conn.start_listening() + + subprocess = Process( + name=subprocess_name, + target=_run_subprocess, + kwargs=dict( + name=subprocess_name, + conn=conn2, + client_builder=subprocess_client_builder, + server_builder=subprocess_server_builder, + message_id=message_id, + ), + ) + subprocess.start() + + +def _run_subprocess( + *, + name: str, + conn: Connection, + client_builder: Callable[[], IpcClient], + server_builder: Callable[[IpcClient], IpcServer], + message_id: Synchronized, +) -> None: + subprocess_reactor = initialize_global_reactor() + client = client_builder() + server = server_builder(client) + subprocess_ipc_conn = _IpcConnection( + reactor=subprocess_reactor, name=name, conn=conn, server=server, message_id=message_id + ) + client.set_ipc_conn(subprocess_ipc_conn) + subprocess_ipc_conn.start_listening() + subprocess_reactor.run() +``` + +Notice that a new Twisted reactor is initialized in the subprocess. + +### Not covered by the POC + +The following points where mostly ignored in the POC and must be addressed in the implementation: + +1. Make sure logging is consistent through all processes + - All of them should log to the same output. + - All of them should use the same configuration. +2. Deal with exceptions, specially when a remote call fails + - Close connections when appropriate. + - Send errors to the other process when appropriate. +3. Deal with process termination in both ways + - What happens when the subprocess dies? Kill the connection. + - What happens when the main process dies? We shouldn't leave zombie subprocesses. +4. Use a multiprocessing Pool? + - In the POC, one process is created for each P2P connection. We could use a pool to prevent creating a lot of process, and run many connections in each process, one for each CPU in the host machine. This has the advantage of minimizing the number of subprocesses, but then connections are not completely isolated: they would still be isolated from the rest of the node, but not from other connections. This should be investigated. +5. Further abstractions? + - In the POC, the IPC protocol relies on sending binary command and data pairs. We could create an easier abstraction to make calls more similar to calling methods by providing a method name, args, and kwargs. This is not necessary, but could be nice. + - Eventually we could extract an RPC abstraction from the IPC classes, making it work for remote connections that are not necessarily processes. This means this code could be reused by the Sync process itself, that is, for abstracting the communication between two full nodes. Sync-v2 already uses a similar deferred calls mechanism, but it is implemented ad-hoc in the protocol. By using the same abstraction, we not only simplify code but also make Sync-v2 a request/response protocol, making its logic more linear. This could be a Sync-v2.5 and is probably out of the scope of this project. + +## Sync-v2 refactors + +In order to make the solution above work with Sync-v2, some refactors will have to be made. Mainly, we must isolate all places it interacts with the full node (by calling storage methods, manager methods, etc). Some of this work was already done as part of the Multiprocess Verification project, so some of its unmerged PRs can be repurposed. + +Also, the `IpcClient` interface only provides a way to call methods in the other process through an `async` method. This means we may also have to convert some methods in the Sync-v2 to async, if possible. If not possible (that is, if the refactor would be too extensive), we could try to implement a `IpcClient.call_blocking` method, but this also has to be investigated. + +# Task breakdown + +Here's a table of main tasks: + +| Task | Dev days | +|--------------------------------------------------------------|----------| +| Finish IPC implementation (logging, exceptions, termination) | 2 | +| Sync-v2 refactors | 2 | +| Implement Sync-v2 IPC clients and servers | 1 | +| Implement CLI command to enable multiprocess P2P | 0.2 | +| Run benchmarks and tests | 1.8 | +| **Total** | **7** | + +All tasks include writing unit tests for the respective feature. From ebbdf82ea42f7f48ec952a6a562b54c8582b5f7a Mon Sep 17 00:00:00 2001 From: Gabriel Levcovitz Date: Fri, 18 Oct 2024 13:20:35 -0300 Subject: [PATCH 2/2] new design --- .../p2p-multiprocess/0001-images/after.png | Bin 79522 -> 0 bytes .../p2p-multiprocess/0001-images/before.png | Bin 29773 -> 0 bytes .../p2p-multiprocess/0001-p2p-multiprocess.md | 270 ++++++++---------- 3 files changed, 115 insertions(+), 155 deletions(-) delete mode 100644 projects/p2p-multiprocess/0001-images/after.png delete mode 100644 projects/p2p-multiprocess/0001-images/before.png diff --git a/projects/p2p-multiprocess/0001-images/after.png b/projects/p2p-multiprocess/0001-images/after.png deleted file mode 100644 index cc2ec7d154c652660de8f8839e3352fad7976df1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79522 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�e3L1{y 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 aT1N%Fm8@MEATD6&!tPl_b;eEtuI*`%8Q diff --git a/projects/p2p-multiprocess/0001-p2p-multiprocess.md b/projects/p2p-multiprocess/0001-p2p-multiprocess.md index 2a6306e..00cee03 100644 --- a/projects/p2p-multiprocess/0001-p2p-multiprocess.md +++ b/projects/p2p-multiprocess/0001-p2p-multiprocess.md @@ -20,180 +20,107 @@ Also, since the mechanism is blocking, the full node can't reply HTTP requests w The problem to be solved by this project can be described as uncoupling the P2P subsystem from the full node. In order to do this, we'll have to refactor all coupling points out of the system. This means we must separate every IO, every callback, and every connection, direct or indirect, between the P2P classes and the rest of the codebase. -Once this is done, we should take this independent P2P subsystem and run it in different processes, one for each connection with the network. Of course, we can't use multithreading in Python because of the GIL (in Python 3.13 you can disable it, but it's still experimental). Even if we could, running on separate processes instead of threads has the added benefit that one process does not interfere with the other, as they have separate memory spaces at the OS level. +Once this is done, we should take this independent P2P subsystem and run it in different processes, ideally one for each connection with the network. Of course, we can't use multithreading in Python because of the GIL (in Python 3.13 you can disable it, but it's still experimental). Even if we could, running on separate processes instead of threads has the added benefit that one process does not interfere with the other, as they have separate memory spaces at the OS level. During sync P2P agents have to query data from the full node, such as accessing the storage. Then, when processing is done, the agent sends the downloaded vertex to the full node through the `VertexHandler.on_new_vertex` method. This means we must design a way for the subprocess to communicate with the main process, bidirectionally. -To design the solution, we have to first consider the current architecture: +Currently, The P2P manager calls a Twisted factory that builds protocols that inherit from `HathorProtocol`, which drives the sync with p2p-related classes. -![](./0001-images/before.png) +Ideally we could keep the P2P manager and the factory in a secondary "P2P-main" process, and then each protocol (i.e., connection) would also have its own independent subprocess. The protocols would communicate with the P2P-main process, and in turn the P2P-main process would communicate with the main process to send and retrieve data to/from the full node. In other words, this would mean that every TCP message would be received and handled directly in each respective subprocess, and then the `HathorProtocol` would use some form of IPC to communicate with the `Node` for querying the storage and sending new vertices. -In this diagram, arrows represent call flow and nested blocks represent inheritance. Currently, the `HathorLineReceiver` class has a double inheritance from `LineReceiver` and `HathorProtocol`. The former is a class provided by Twisted, inheriting from `twisted.Protocol`. The latter is our sync class that actually implements and kickstarts the whole sync logic (it instantiates and handles multiple other classes). Then, `HathorLineReceiver` subclasses them both to connect their behaviors in a single protocol. Being a Twisted protocol, it also means that it is associated with a twisted factory. When a new TCP connection is made, this factory is responsible for creating a new protocol instance, which kicks off the sync process. This bit is not represented in the diagram, but this fact will be important later. Lastly, the sync process communicates with the node though multiple pointers, represented here by the single `Node` block, containing the `HathorManager`, the `ConnectionsManager`, the `TransactionStorage`, and any other class that the sync needs from the rest of the full node. Those are called from the `HathorProtocol`. +However, this implementation is not straightforward because being in a separate process means using a completely separate Python interpreter, which means using separate Twisted reactors. By default, a Twisted protocol must run in the same reactor as its Twisted factory. To make protocols work on separate processes, we would need at least to work with lower-level socket primitives. At worst, the intrinsic coupling between Twisted factories and protocols could be a blocking factor. -We have to determine where to draw the process boundary line, meaning which classes are going to execute in the subprocesses, and what remains in the main process. The requirement is that each P2P agent runs in its own process, so we know for sure that the `HathorProtocol` must run in the subprocess. We also know that `Node` will remain in the main process, as it demultiplexes the agents to run new vertices through the verification process, the consensus, and to save them in the storage in the main process. +Then, we propose splitting this project into two: -What about the `LineReceiver`? Ideally, it would be in the subprocess too. This would mean that every TCP message would be received and handled directly in the subprocess, and then the `HathorProtocol` would use some form of IPC to communicate with the `Node` for querying the storage and sending new vertices. However, this is not possible. Being in a separate process means using a completely separate Python interpreter, which means using separate Twisted reactors. By definition, a Twisted protocol must run in the same reactor as its Twisted factory. Then, the `LineReceiver` must also remain in the main process, and its communication with the `HathorProtocol` will also have to be through IPC. +1. **P2P Multiprocess Phase One** - Split the P2P manager, the factory, and its protocols into a new single P2P subprocess. All connections still share the same process between each other, but are isolated from the rest of the full node (Hathor manager, storage, APIs, etc.). This still has benefits for performance, and there could be a monitor on the main process watching the P2P-main process. When it detects failures, staleness, or high memory usage, it kills and restarts the subprocess. +2. **P2P Multiprocess Phase Two** - In this phase, we try to split each connection into a single subprocess. This has the advantage of isolating connections, and therefore preventing an attacker from blocking the whole sync, but with a complexity tradeoff and possibly higher IPC overhead. -Here's the proposed new architecture: - -![](./0001-images/after.png) - -It simply moves the `HathorProtocol` out of the inheritance tree, and changes its communication with the `LineReceiver` to use IPC. It does the same for its communication with the `Node`. - -The new `IpcLineReceiver` is a protocol, by still inheriting `LineReceiver`. Through composition, an `IpcServer` has access to it, and it has access to an `IpcClient`. Both of them are connected to an `IpcConnection`, which is simply a wrapper to Python's `multiprocessing.Connection` (which in turn wraps a UNIX socket). The `IpcConnection` is able to connect to another `IpcConnection` in a subprocess, which symmetrically connects to another client/server pair, connected to the `HathorProtocol`. The main process' `IpcServer` also has access to the rest of the `Node`. - -When a new TCP connection is created, the Twisted factory (not shown here) will instantiate a new `IpcLineReceiver` protocol. It will do so by setting up and starting a subprocess and arranging all those connections. Then, when a TCP message is received, Twisted will call `IpcLineReceiver.lineReceived`, which will call `HathorProtocol.recv_message` through the `IpcClient`. Analogously, when `HathorProtocol` needs some information from the storage, it will call `Node` through its `IpcClient`. Each client is responded by the corresponding `IpcServer` on the other process. They all share a single UNIX socket through the `IpcConnection` abstraction. Lastly, the `HathorProtocol` can also call `VertexHandler.on_new_vertex` through the same path. The underlying protocol used in the IPC is a simple binary protocol pretty analogous to the sync process itself: it sends a command and data pair via a single binary string. +By doing this we are able to plan and design each phase independently, possibly with different priorities, since Phase One solves most of our problems. # Reference-level explanation [Reference-level explanation]: #reference-level-explanation -## Proof-of-Concept - -In order to validate the idea described in the Guide-level section, I created a [POC](https://github.com/HathorNetwork/hathor-core/pull/1138) that simulates both diagrams. You can run the current architecture simulation by running `python hathor/current_p2p.py` in that branch, and `python hathor/p2p_mp_poc.py` to run the new architecture. +According to what was proposed in the Guide-level section, this section details the implementation for P2P Multiprocess Phase One. In order to validate the proposal, I created a [POC](https://github.com/HathorNetwork/hathor-core/pull/1161) that provides a working version of a full node that is able to sync while running P2P components in a single separate subprocess, without blocking the rest of the full node. For information on how to run it and current limitations, check the link. -For both simulations, you can use netcat to send TCP messages to the system, like `nc localhost 8080 -c` for an interactive session. Try opening two separate netcat sessions, and sending a message simultaneously in each one. I put a 5-second delay on `HathorProtocol` processing to simulate a CPU-heavy method. The current architecture will take ~10 seconds to respond both requests, and the new architecture takes half that time. +## Subprocess management -Code snippets from that POC will be in the descriptions below, but some code is omitted. For the full code, see the POC link above. +Subprocess management, that is, spawning, terminating, checking for erros, etc., is done using Twisted's `ProcessProtocol` ([docs](https://docs.twisted.org/en/stable/core/howto/process.html)). Using it facilitates implementation as it integrates seamlessly with the Twisted framework, transforming process events in events that are handled by the Twisted reactor. We override handlers to react appropriately. -### Current architecture simulation +The caveat is that it takes an executable path in the system as its target, instead of nicely integrated with Python functions (like Python's `multiprocessing` module). We work around this by creating a new P2P "main" file and executing it with Python itself. -In the [`hathor/current_p2p.py`](https://github.com/HathorNetwork/hathor-core/blob/fe7e9a69db37a8032516c0715dbfbf7a46744431/hathor/current_p2p.py) file, a simple script simulates the current P2P subsystem. +## Interprocess Communication -- A `HathorManager` class represents the `Node` from the diagrams above, and has two methods: `read_storage` and `save_storage`. They simulate methods for interacting with the `TransactionStorage`. -- Then, the `HathorProtocol` class represents its real homonym, providing a `do_something` method that represents the sync process. Notice that it has access to the manager and calls its methods to perform the sync. It also has an abstract `send_line` method. -- The `MyLineReceiver` protocol represents the `HathorLineReceiver`, inheriting from both `LineReceiver` and `HathorProtocol`. Its `lineReceived` method calls `HathorProtocol.do_something`, and it overrides `HathorProtocol.send_line`, implementing it. -- Lastly, `MyFactory` represents both `HathorServerFactory` and `HathorClientFactory`, simply instantiating `MyLineReceiver`. +Twisted's `ProcessProtocol` provides a simple way of performing IPC through file descriptors that can be mapped to the parent's file descriptors when the subprocess is spawned. Then, the parent can react accordingly when, for example, the subprocess writes to stdout. This is suitable for simple cases but not so much for our use case of performing bidirectional request/response calls between the processes. Therefore, in the POC we simply ignore this mechanism. -### Proposed architecture simulation +When the subprocess is spawned, it works as a standalone Python process with its own interpreter and reactor. We then use Twisted's AMP protocols to implement IPC. AMP is Twisted's implementation of Asynchronous Messaging Protocol, an abstraction for remote request/response calls that provides (de)serialization, typing of request and response payloads, and handling of remote exceptions ([docs](https://docs.twisted.org/en/stable/core/howto/amp.html)). While the POC uses AMP, in the Drawbacks, alternatives, and future possibilities section we describe other options for this component which could be used in the final version. -The [`hathor/p2p_mp_poc.py`](https://github.com/HathorNetwork/hathor-core/blob/fe7e9a69db37a8032516c0715dbfbf7a46744431/hathor/p2p_mp_poc.py) file contains the new proposed architecture simulation script. +We use UDS endpoints to create connections between the processes, and attach the AMP protocols to it. Since we need bidirectional communication, we create two sockets, with one AMP server/client pair for each. In the implementation, we may be able to use the file descriptor mapping described in the previous paragraph to perform those connections, instead of creating our own sockets. -- It has the same `HathorManager` class as above. -- The `HathorProtocol` class is mostly the same, except it calls manager methods and `send_line` through an `IpcClient`, instead of directly. -- The `MyLineReceiver` protocol is replaced by `IpcLineReceiver`, which doesn't have access to the `HathorProtocol` anymore, and instead calls `do_something` through an `IpcClient`, too. -- The `MyFactory` class is replaced by `IpcFactory`, and when it creates a protocol instance it calls the new `ipc.connect` function (described below) to arrange the subprocess connection. -- Lastly, it contains 2 `IpcClient`s and 2 `IpcServer`s, one pair for the main process and one for the subprocess. Those are responsible for defining the interface between the processes: which commands can be called in each of them. +There are multiple request/response calls between the P2P process and the rest of the full node. All those calls must be converted to remote, IPC calls. Since AMP's `callRemote` returns a `Deferred`, we need to convert all of them to `async`. This amounts for a few refactor PRs. They're listed below. -### `_IpcConnection` - -The private `_IpcConnection` class wraps `multiprocessing.Connection` objects returned by the `multiprocessing.Pipe`. A pair of those represent a single connection between the main process and a subprocess, with each instance in its respective process. It is bidirectional, meaning that each end is able to send and receive messages to the other end. In other words, each end sends and receives both requests and responses. - -Its only responsibility is to run a `twisted.LoopingCall` that polls the `Connection` for new messages. When a message is received, an ID mechanism is used to determine whether the message is a new request or a response to one of its own requests. - -It provides a `call` method to send requests, which returns a `Deferred` that will be completed when the respective response is received: +### Calls from the P2P process to the main process ```python -def call(self, cmd: bytes, request: bytes | None) -> Deferred[bytes]: - data = cmd if request is None else cmd + MESSAGE_SEPARATOR + request - message = self._send_message(data) - deferred: Deferred[bytes] = Deferred() - self._pending_calls[message.id] = deferred - return deferred +# Calls on VertexHandler +def on_new_vertex(self, vertex: Vertex, *, fails_silently: bool = True) -> bool: ... + +# Calls on VerificationService +def verify_basic(self, vertex: Vertex) -> None: ... + +# Calls on PubSub +def publish(self, key: HathorEvents, **kwargs: Any) -> None: ... + +# Calls on TransactionStorage and indexes +def get_genesis(self, vertex_id: VertexId) -> Vertex | None: ... +def get_vertex(self, vertex_id: VertexId) -> Vertex: ... +def get_block(self, block_id: VertexId) -> Block: ... +def get_latest_timestamp(self) -> int: ... +def get_first_timestamp(self) -> int: ... +def vertex_exists(self, vertex_id: VertexId) -> bool: ... +def can_validate_full(self, vertex: Vertex) -> bool: ... +def get_merkle_tree(self, timestamp: int) -> tuple[bytes, list[bytes]]: ... +def get_hashes_and_next_idx(self, from_idx: RangeIdx, count: int) -> tuple[list[bytes], RangeIdx | None]: ... +def compare_bytes_with_local_vertex(self, vertex: Vertex) -> bool: ... +def get_best_block(self) -> Block: ... +def get_n_height_tips(self, n_blocks: int) -> list[HeightInfo]: ... +def get_tx_tips(self, timestamp: float | None = None) -> set[Interval]: ... +def get_mempool_tips(self) -> set[VertexId]: ... +def height_index_get(self, height: int) -> VertexId | None: ... +def get_parent_block(self, block: Block) -> Block: ... +def get_best_block_tips(self) -> list[VertexId]: ... +def partial_vertex_exists(self, vertex_id: VertexId) -> bool: ... ``` -And the polling mechanism: +To minimize work, we may refactor calls that are performed by Sync-v2 only, and disable support for Multiprocess P2P when Sync-v1 is enabled, since we'll deprecate it soon. -```python -def _unsafe_poll(self) -> None: - if not self._conn.poll(): - return - - message_bytes = self._conn.recv_bytes() - message = _Message.deserialize(message_bytes) - - if pending_call := self._pending_calls.pop(message.id, None): - # The received message is a response for one of our own requests - pending_call.callback(message.data) - return - - # The received message is a new request - coro = self._server.handle_request(message.data) - deferred = Deferred.fromCoroutine(coro) - deferred.addCallback(lambda response: self._send_message(response, request_id=message.id)) -``` - -Notice that it calls a `self._server.handle_request` to handle requests. That server is an `IpcServer` that will be described below. +Since all request and response payloads are classes are serializable, it's not too hard to convert them to IPC calls. When sending vertices though, we must serialize `static_metadata` and send it together. Considering `TransactionMetadata`, there are only some asserts that we may remove (moving them to the main process) so we don't have to serialize and send it. However, in the POC the node only works as a sync client. It's possible that in the sync server version we have other edge cases that use metadata — this has not been checked yet. -To keep track of which response is associated with which request, each pair is assigned a unique message ID that is created by incrementing an `int` from a `multiprocessing.Value`, a Python object that supports atomic read/writes in multiple processes. +About converting them to `async`, this is mostly not too hard since all calls can bubble up to an async TCP message handling call. However, when we introduce `async` calls in the middle of methods that are currently serial, we must be careful to uphold any ordering invariants required by such methods. Using [DeferredLocks](https://docs.twistedmatrix.com/en/stable/api/twisted.internet.defer.DeferredLock.html) may be useful in those situations. -### `IpcClient` and `IpcServer` +### Calls from the main process to the P2P process -Users of the `_IpcConnection` class do not interact with it directly. Instead, they do so through client/server abstractions: +The full node also communicates with the `P2PManager` from some methods, such as endpoints and some control mechanisms: ```python -class IpcClient(ABC): - def call(self, cmd: bytes, request: bytes | None = None) -> Deferred[bytes]: - return self._ipc_conn.call(cmd, request) - -class IpcServer(ABC): - @abstractmethod - def get_cmd_map(self) -> dict[bytes, IpcCommand]: - raise NotImplementedError +def start(self) -> None: ... +def stop(self) -> None: ... +def get_connections(self) -> set[HathorProtocol]: ... +def get_server_factory(self) -> HathorServerFactory: ... +def get_client_factory(self) -> HathorClientFactory: ... +def enable_localhost_only(self) -> None: ... +def has_synced_peer(self) -> bool: ... +def send_tx_to_peers(self, tx: BaseTransaction) -> None: ... +def reload_entrypoints_and_connections(self) -> None: ... +def enable_sync_version(self, sync_version: SyncVersion) -> None: ... +def add_peer_discovery(self, peer_discovery: PeerDiscovery) -> None: ... +def add_listen_address_description(self, addr: str) -> None: ... +def disconnect_all_peers(self, *, force: bool = False) -> None: ... ``` -The user (in this case, the sync process) must implement classes inheriting from the `IpcClient` and `IpcServer`. The client will provide the user with a way to call commands on the other process. And through the server, the user must provide a way to handle those commands. In practice, the user must implement 4 classes: 2 clients and 2 servers, one pair for the main process and another for the subprocess. - -### The `connect()` function - -Lastly, a function is provided to arrange all connections, starting the subprocess, etc. +Those are trickier to convert to IPC, since some of those types are not serializable, unlike the previous ones. Also conversely, some of them are called from non-`async` contexts and therefore changing them to `async` will be harder. We'll have to examine each call case by case and determine the best solution for each. For example, the `get_connections` method is only called by `Metrics` and it only uses `str(connection.entrypoint)` and `connection.metrics`. Those are in fact serializable, so we should change the method to return them instead of the whole `HathorProtocol`, which is not. -```python -def connect( - *, - main_reactor: ReactorProtocol, - main_client: IpcClient, - main_server: IpcServer, - subprocess_client_builder: Callable[[], ClientT], - subprocess_server_builder: Callable[[ClientT], IpcServer], - subprocess_name: str, -) -> None: - conn1: Connection - conn2: Connection - conn1, conn2 = Pipe() - message_id = multiprocessing.Value('L', 0) - - main_ipc_conn = _IpcConnection( - reactor=main_reactor, name='main', conn=conn1, message_id=message_id, server=main_server - ) - main_client.set_ipc_conn(main_ipc_conn) - main_ipc_conn.start_listening() - - subprocess = Process( - name=subprocess_name, - target=_run_subprocess, - kwargs=dict( - name=subprocess_name, - conn=conn2, - client_builder=subprocess_client_builder, - server_builder=subprocess_server_builder, - message_id=message_id, - ), - ) - subprocess.start() - - -def _run_subprocess( - *, - name: str, - conn: Connection, - client_builder: Callable[[], IpcClient], - server_builder: Callable[[IpcClient], IpcServer], - message_id: Synchronized, -) -> None: - subprocess_reactor = initialize_global_reactor() - client = client_builder() - server = server_builder(client) - subprocess_ipc_conn = _IpcConnection( - reactor=subprocess_reactor, name=name, conn=conn, server=server, message_id=message_id - ) - client.set_ipc_conn(subprocess_ipc_conn) - subprocess_ipc_conn.start_listening() - subprocess_reactor.run() -``` -Notice that a new Twisted reactor is initialized in the subprocess. - -### Not covered by the POC +## Not covered by the POC The following points where mostly ignored in the POC and must be addressed in the implementation: @@ -206,29 +133,62 @@ The following points where mostly ignored in the POC and must be addressed in th 3. Deal with process termination in both ways - What happens when the subprocess dies? Kill the connection. - What happens when the main process dies? We shouldn't leave zombie subprocesses. -4. Use a multiprocessing Pool? - - In the POC, one process is created for each P2P connection. We could use a pool to prevent creating a lot of process, and run many connections in each process, one for each CPU in the host machine. This has the advantage of minimizing the number of subprocesses, but then connections are not completely isolated: they would still be isolated from the rest of the node, but not from other connections. This should be investigated. -5. Further abstractions? - - In the POC, the IPC protocol relies on sending binary command and data pairs. We could create an easier abstraction to make calls more similar to calling methods by providing a method name, args, and kwargs. This is not necessary, but could be nice. - - Eventually we could extract an RPC abstraction from the IPC classes, making it work for remote connections that are not necessarily processes. This means this code could be reused by the Sync process itself, that is, for abstracting the communication between two full nodes. Sync-v2 already uses a similar deferred calls mechanism, but it is implemented ad-hoc in the protocol. By using the same abstraction, we not only simplify code but also make Sync-v2 a request/response protocol, making its logic more linear. This could be a Sync-v2.5 and is probably out of the scope of this project. -## Sync-v2 refactors +## Drawbacks, alternatives, and future possibilities + +I'm condensing those sections into one as they're all related. + +### Twisted's AMP + +Specifically for using Twisted's AMP, I see two drawbacks: + +1. AMP remote calls can only be `async`. If there are any methods that are too hard to convert, this may be an issue. +2. AMP messages have a fixed limit in size: no values can be larger than 65535 bytes. Coincidentally, this the same line length limit that we have in the sync protocol, which means vertices will never be larger. However, it's possible that some of the other serialized types that are sent through IPC reach this limit. If this happens, the call will fail and the sync may stall. We have to consider this. + +To fix or prevent those problems, we can use alternative technologies to perform the IPC calls: + +#### gRPC + +[gRPC](https://grpc.io/) is a robust RPC framework by Google that uses protobufs to serialize messages. It has great support for Python and native support for both synchronous and asynchronous calls, which means it doesn't present the same drawbacks as AMP. + +The only "drawback" that I see is that it requires defining static schemas and using code generation for its services, which may not be bad, but may be a bit overkill for this use case. We must algo test whether its more expensive (de)serialization introduces a significant overhead. + +#### ZeroMQ + +[ZeroMQ](https://zeromq.org/) is a lightweight abstraction over sockets that acts as a concurrency framework. It also has great support for Python and native support for both synchronous and asynchronous calls. It doesn't provide its own serialization like gRPC, so we must provide our own or use its utilities for sending messages using json or Python's pickle. + +ZeroMQ is used in the official [bitcoin client](https://github.com/bitcoin/bitcoin/blob/master/doc/zmq.md) to provide a notification system that looks like it's similar to our Event Queue system, which uses WebSockets. + +#### Other considerations + +However, async support for both gRPC and ZeroMQ are integrated with Python's asyncio. In order to use them with Twisted, we may use the `--x-asyncio-reactor` option in the full node, which is currently experimental, or integrate with lower level future primitives. This has to be experimented. + +For ZeroMQ, there are two options, its [native support for asyncio](https://pyzmq.readthedocs.io/en/latest/howto/eventloop.html#asyncio) or the third-party [aiozmq](https://github.com/aio-libs/aiozmq/) lib, which is in the same organization as the famous `aiohttp` lib. The latter has a great abstraction for RPC calls that looks like method calls, but it looks like its repo is stale. + +Also, even though both gRPC and ZeroMQ support blocking remote calls, this must be used with caution because bidirectional blocking remote calls may cause deadlocks. When making a call from a client to a server, we may only block if we are sure that there are no callbacks from the server to client in the handling path of the initial request. This may be easy to guarantee if the communication from the P2P process to the main process only uses async calls, and use blocking calls only from the main process to the P2P process. Modularizing the P2PManager may also help with this, isolating its IPC endpoints. + +### RocksDB's secondary DB + +RocksDB has the ability to open a secondary instance of a DB from another process. This instance is read-only, and a `try_catch_up_with_primary` method has to be actively called to update its contents in relation to the primary instance. This could be used in the P2P process instead of performing IPC calls to the `TransactionStorage` and indexes, but I tested it and it was too slow. Even though the method returned quickly in my tests, the DB would actually take about 5 seconds to be updated with the contents from the primary DB, with the method being called in a loop. + +This is unusable when syncing from a full node client perspective, but may be useful for syncing from a server perspective, as we can respond the other full node with outdated data and update the secondary DB in the background. However, that would require a refactor to modularize the server and client protocols. This may also be useful for the Multiprocess HTTP API project for the same reason. -In order to make the solution above work with Sync-v2, some refactors will have to be made. Mainly, we must isolate all places it interacts with the full node (by calling storage methods, manager methods, etc). Some of this work was already done as part of the Multiprocess Verification project, so some of its unmerged PRs can be repurposed. +### Rate limit and watchdog -Also, the `IpcClient` interface only provides a way to call methods in the other process through an `async` method. This means we may also have to convert some methods in the Sync-v2 to async, if possible. If not possible (that is, if the refactor would be too extensive), we could try to implement a `IpcClient.call_blocking` method, but this also has to be investigated. +As a future possibility, to make the multiprocess system more robust, we may add a rate limit for IPC calls and a watchdog for killing a subprocess when it uses too much memory, for example. This would prevent an attacker from affecting the full node if an exploit is found in the sync. This may be a separate project implemented between the Phase One and Phase Two described in the Guide-level section. # Task breakdown Here's a table of main tasks: -| Task | Dev days | -|--------------------------------------------------------------|----------| -| Finish IPC implementation (logging, exceptions, termination) | 2 | -| Sync-v2 refactors | 2 | -| Implement Sync-v2 IPC clients and servers | 1 | -| Implement CLI command to enable multiprocess P2P | 0.2 | -| Run benchmarks and tests | 1.8 | -| **Total** | **7** | +| Task | Dev days | +|----------------------------------------------------------|----------| +| Experiment with gRPC and ZeroMQ | 1 | +| Implement P2P process IPC server (including refactors) | 2 | +| Implement main process IPC server (including refactors) | 2 | +| Implement IPC details (logging, exceptions, termination) | 2 | +| Implement CLI command to enable multiprocess P2P | 0.2 | +| Run benchmarks and tests | 1.8 | +| **Total** | **9** | All tasks include writing unit tests for the respective feature.