[tahoe-lafs-trac-stream] [Tahoe-LAFS] #2925: Design a replacement for the Foolscap-based storage node API

Tahoe-LAFS trac at tahoe-lafs.org
Mon May 14 15:27:46 UTC 2018


#2925: Design a replacement for the Foolscap-based storage node API
--------------------------+---------------------------
 Reporter:  exarkun       |          Owner:
     Type:  enhancement   |         Status:  new
 Priority:  major         |      Milestone:  undecided
Component:  code-network  |        Version:
 Keywords:                |  Launchpad Bug:
--------------------------+---------------------------
 Storage nodes expose their functionality by way of a Foolscap-based
 network interface.  Foolscap offers a very rich set of functionality for
 defining such interfaces but this comes with certain costs.

 For example, Foolscap is presently only implement in Python 2.  As the
 planned de-support of Python 2 by python-dev looms (presently less than 2
 years of support officially remain and _practically_ Python 2 is already
 orphaned from a number of interesting perspectives), this poses an
 increasingly relevant challenge to the Tahoe-LAFS project (will Tahoe-LAFS
 require an unsupported runtime?  Will Tahoe-LAFS abandon CPython and
 require PyPy?  etc).

 Further, as there are no non-Python implementations at all, any efforts to
 create a non-Python Tahoe-LAFS implementation must start at the low level
 of implementing the Foolscap protocol (and due to the rich featureset of
 Foolscap, this is no simple task).

 Then, despite the rich feature set of Foolscap, Tahoe-LAFS does not
 actually make extensive use of these features.  Instead, Tahoe-LAFS
 network interactions are largely request/response-driven.  Certain
 security properties granted automatically by Foolscap are interesting and
 important but many other features (asynchronous server-side requests, for
 example) are essentially ignored.  However, despite not using these
 features, much of the complexity related to implementing them is still
 implicated in Tahoe-LAFS.  This manifests, for example, as reduced runtime
 efficiency compared to similar operations performed with a simpler
 protocol.  Consequently, significant CPU resources must be allocated to
 allow a Tahoe-LAFS storage node to make full use of relatively modest
 storage resources.

 The complexity of Foolscap comes with other burdens.  The complexity makes
 a security audit more difficult.  This is largely a consequence of the
 complexity making the code more difficult to understand - partly a result
 of the inherent complexity of Foolscap, partly a result of Foolscap simply
 being a relatively narrowly used protocol (and so almost no developers
 coming to Tahoe-LAFS will have prior experience with it).

 For all these reasons, it would be greatly beneficial if Tahoe-LAFS
 storage nodes exposed their functionality via a different protocol - a
 protocol which avoids some of these shortcomings of Foolscap.

 To sum up, the dimensions for consideration are (in no particular order):

   * the existence of implementations for many languages/runtimes
   * the degree to which the protocol is considered "standard"
   * the runtime performance of the protocol for the necessary operations
   * the implementation complexity of the protocol
   * the provision by the protocol of the security properties Tahoe-LAFS
 requires (or the ability to build these on top of the protocol with
 minimal additional complexity)

 With all these in mind, only one serious candidate really comes to mind.
 TLS (with a certain peer validation and verification configuration)
 carrying HTTP (either 1.2 or 2) carrying a raw data and/or a compact
 general-purpose serialization format (such as BSON - but given
 standardized content negotiation features of HTTP, multiple formats may be
 possible).

 Supposing this line of reasoning is valid, it then remains to detail the
 precise network interface which can replace the current Foolscap-based
 interface (while addressing the above outlined concerns).  This is the
 focus of this ticket.

 Then, as a follow-up, the protocol can be implemented for both the storage
 and client nodes, and released (alongside the existing Foolscap protocol).
 After an acceptable transitional period, the Foolscap protocol can be
 removed (presumably with some period of deprecation-style notice to end
 users to ensure they don't upgrade themselves into a broken configuration
 accidentally).

--
Ticket URL: <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2925>
Tahoe-LAFS <https://Tahoe-LAFS.org>
secure decentralized storage


More information about the tahoe-lafs-trac-stream mailing list