106 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
Simple-IPC API
 | 
						|
==============
 | 
						|
 | 
						|
The Simple-IPC API is a collection of `ipc_` prefixed library routines
 | 
						|
and a basic communication protocol that allows an IPC-client process to
 | 
						|
send an application-specific IPC-request message to an IPC-server
 | 
						|
process and receive an application-specific IPC-response message.
 | 
						|
 | 
						|
Communication occurs over a named pipe on Windows and a Unix domain
 | 
						|
socket on other platforms.  IPC-clients and IPC-servers rendezvous at
 | 
						|
a previously agreed-to application-specific pathname (which is outside
 | 
						|
the scope of this design) that is local to the computer system.
 | 
						|
 | 
						|
The IPC-server routines within the server application process create a
 | 
						|
thread pool to listen for connections and receive request messages
 | 
						|
from multiple concurrent IPC-clients.  When received, these messages
 | 
						|
are dispatched up to the server application callbacks for handling.
 | 
						|
IPC-server routines then incrementally relay responses back to the
 | 
						|
IPC-client.
 | 
						|
 | 
						|
The IPC-client routines within a client application process connect
 | 
						|
to the IPC-server and send a request message and wait for a response.
 | 
						|
When received, the response is returned back to the caller.
 | 
						|
 | 
						|
For example, the `fsmonitor--daemon` feature will be built as a server
 | 
						|
application on top of the IPC-server library routines.  It will have
 | 
						|
threads watching for file system events and a thread pool waiting for
 | 
						|
client connections.  Clients, such as `git status`, will request a list
 | 
						|
of file system events since a point in time and the server will
 | 
						|
respond with a list of changed files and directories.  The formats of
 | 
						|
the request and response are application-specific; the IPC-client and
 | 
						|
IPC-server routines treat them as opaque byte streams.
 | 
						|
 | 
						|
 | 
						|
Comparison with sub-process model
 | 
						|
---------------------------------
 | 
						|
 | 
						|
The Simple-IPC mechanism differs from the existing `sub-process.c`
 | 
						|
model (Documentation/technical/long-running-process-protocol.txt) and
 | 
						|
used by applications like Git-LFS.  In the LFS-style sub-process model,
 | 
						|
the helper is started by the foreground process, communication happens
 | 
						|
via a pair of file descriptors bound to the stdin/stdout of the
 | 
						|
sub-process, the sub-process only serves the current foreground
 | 
						|
process, and the sub-process exits when the foreground process
 | 
						|
terminates.
 | 
						|
 | 
						|
In the Simple-IPC model the server is a very long-running service.  It
 | 
						|
can service many clients at the same time and has a private socket or
 | 
						|
named pipe connection to each active client.  It might be started
 | 
						|
(on-demand) by the current client process or it might have been
 | 
						|
started by a previous client or by the OS at boot time.  The server
 | 
						|
process is not associated with a terminal and it persists after
 | 
						|
clients terminate.  Clients do not have access to the stdin/stdout of
 | 
						|
the server process and therefore must communicate over sockets or
 | 
						|
named pipes.
 | 
						|
 | 
						|
 | 
						|
Server startup and shutdown
 | 
						|
---------------------------
 | 
						|
 | 
						|
How an application server based upon IPC-server is started is also
 | 
						|
outside the scope of the Simple-IPC design and is a property of the
 | 
						|
application using it.  For example, the server might be started or
 | 
						|
restarted during routine maintenance operations, or it might be
 | 
						|
started as a system service during the system boot-up sequence, or it
 | 
						|
might be started on-demand by a foreground Git command when needed.
 | 
						|
 | 
						|
Similarly, server shutdown is a property of the application using
 | 
						|
the simple-ipc routines.  For example, the server might decide to
 | 
						|
shutdown when idle or only upon explicit request.
 | 
						|
 | 
						|
 | 
						|
Simple-IPC protocol
 | 
						|
-------------------
 | 
						|
 | 
						|
The Simple-IPC protocol consists of a single request message from the
 | 
						|
client and an optional response message from the server.  Both the
 | 
						|
client and server messages are unlimited in length and are terminated
 | 
						|
with a flush packet.
 | 
						|
 | 
						|
The pkt-line routines (linkgit:gitprotocol-common[5])
 | 
						|
are used to simplify buffer management during message generation,
 | 
						|
transmission, and reception.  A flush packet is used to mark the end
 | 
						|
of the message.  This allows the sender to incrementally generate and
 | 
						|
transmit the message.  It allows the receiver to incrementally receive
 | 
						|
the message in chunks and to know when they have received the entire
 | 
						|
message.
 | 
						|
 | 
						|
The actual byte format of the client request and server response
 | 
						|
messages are application specific.  The IPC layer transmits and
 | 
						|
receives them as opaque byte buffers without any concern for the
 | 
						|
content within.  It is the job of the calling application layer to
 | 
						|
understand the contents of the request and response messages.
 | 
						|
 | 
						|
 | 
						|
Summary
 | 
						|
-------
 | 
						|
 | 
						|
Conceptually, the Simple-IPC protocol is similar to an HTTP REST
 | 
						|
request.  Clients connect, make an application-specific and
 | 
						|
stateless request, receive an application-specific
 | 
						|
response, and disconnect.  It is a one round trip facility for
 | 
						|
querying the server.  The Simple-IPC routines hide the socket,
 | 
						|
named pipe, and thread pool details and allow the application
 | 
						|
layer to focus on the task at hand.
 |