From c1db285f1eac407be57565b922bd374da95c2280 Mon Sep 17 00:00:00 2001 From: Scott Lystig Fritchie Date: Wed, 20 May 2015 12:37:28 +0900 Subject: [PATCH] EDoc update --- edoc/machi_admin_util.html | 2 +- edoc/machi_app.html | 2 +- edoc/machi_chain_manager1.html | 2 +- edoc/machi_chain_repair.html | 78 +++++++++++++++++++++++------- edoc/machi_chash.html | 2 +- edoc/machi_cr_client.html | 65 +++++++++++++++++++++++-- edoc/machi_flu1.html | 17 +++++-- edoc/machi_flu1_client.html | 31 +++++++++++- edoc/machi_flu_psup.html | 20 ++++++-- edoc/machi_flu_sup.html | 2 +- edoc/machi_projection.html | 2 +- edoc/machi_projection_store.html | 2 +- edoc/machi_proxy_flu1_client.html | 19 +++++--- edoc/machi_sequencer.html | 2 +- edoc/machi_sup.html | 2 +- edoc/machi_util.html | 2 +- edoc/machi_yessir_client.html | 2 +- edoc/overview-summary.html | 2 +- images/supervisor-2flus.png | Bin 0 -> 35240 bytes 19 files changed, 203 insertions(+), 51 deletions(-) create mode 100644 images/supervisor-2flus.png diff --git a/edoc/machi_admin_util.html b/edoc/machi_admin_util.html index dca2800..d26d2cf 100644 --- a/edoc/machi_admin_util.html +++ b/edoc/machi_admin_util.html @@ -55,6 +55,6 @@
-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_app.html b/edoc/machi_app.html index 6d4c01b..b141911 100644 --- a/edoc/machi_app.html +++ b/edoc/machi_app.html @@ -34,6 +34,6 @@
-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_chain_manager1.html b/edoc/machi_chain_manager1.html index 3fb60dd..911dfc7 100644 --- a/edoc/machi_chain_manager1.html +++ b/edoc/machi_chain_manager1.html @@ -174,6 +174,6 @@ distributed state of a single Machi Chain Replication chain.


-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_chain_repair.html b/edoc/machi_chain_repair.html index 61d23fb..d9e48e9 100644 --- a/edoc/machi_chain_repair.html +++ b/edoc/machi_chain_repair.html @@ -10,27 +10,69 @@

Module machi_chain_repair

-Erlang API for the Machi FLU TCP protocol version 1, with a -proxy-process style API for hiding messy details such as TCP -connection/disconnection with the remote Machi server. +Perform "chain repair", i.e., resynchronization of Machi file +contents and metadata as servers are (re-)added to the chain. -

Description

Erlang API for the Machi FLU TCP protocol version 1, with a -proxy-process style API for hiding messy details such as TCP -connection/disconnection with the remote Machi server.

+

Description

Perform "chain repair", i.e., resynchronization of Machi file +contents and metadata as servers are (re-)added to the chain.

-

Machi is intentionally avoiding using distributed Erlang for - Machi's communication. This design decision makes Erlang-side code - more difficult & complex, but it's the price to pay for some -language independence. Later in Machi's life cycle, we need to -(re-)implement some components in a non-Erlang/BEAM-based language.

+

The implementation here is a very basic one, and is probably a bit + slower than the original "demo day" implementation at + https://github.com/basho/machi/blob/master/prototype/demo-day-hack/file0_repair_server.escript

- This module implements a "man in the middle" proxy between the - Erlang client and Machi server (which is on the "far side" of a TCP - connection to somewhere). This proxy process will always execute - on the same Erlang node as the Erlang client that uses it. The - proxy is intended to be a stable, long-lived process that survives - TCP communication problems with the remote server. +

It's so easy to bikeshed this into a 1 year programming exercise.

+ +

General TODO note: There are a lot of areas for exploiting parallelism here. + I've set the bikeshed aside for now, but "make repair faster" has a + lot of room for exploiting concurrency, overlapping reads & writes, +etc etc. There are also lots of different trade-offs to make with +regard to RAM use vs. disk use.

+ +

There's no reason why repair can't be done:

+ +
    +
  1. Repair in parallel across multiple repairees ... Optimization. +
  2. +
  3. Repair multiple byte ranges concurrently ... Optimization. +
  4. +
  5. Use bigger chunks than the client originally used to write the file +... Optimization ... but it would be the easiest to implement, e.g. use +constant-sized 4MB chunks. Unfortuntely, it would also destroy +the ability to verify here that the chunk checksums are correct +*and* also propagate the correct checksum metadata to the +destination FLU.

    + + As an additional optimization, add a bit of #2 to start the next + read while the current write is still in progress. +
  6. +
  7. The current method centralizes the "smarts" required to compare + checksum differences ... move some computation to each FLU, then use + a Merkle- or other-compression-style scheme to reduce the amount of + data sent across a network. +
  8. +
+ +

Most/all of this could be executed in parallel on each FLU relative to +its own files. Then, in another TODO option, perhaps build a Merkle tree +or other summary of the local files and send that data structure to the +repair coordinator.

+ +

Also, as another TODO note, repair_both_present() in the +prototype/demo-day code uses an optimization of calculating the MD5 +checksum of the chunk checksum data as it arrives, and if the two MD5s +match, then we consider the two files in sync. If there isn't a match, +then we sort the lines and try another MD5, and if they match, then we're +in sync. In theory, that's lower overhead than the procedure used here.

+ + NOTE that one reason I chose the "directives list" method is to have an + option, later, of choosing to repair a subset of repairee FLUs if there + is a big discrepency between out of sync files: e.g., if FLU x has N + bytes out of sync but FLU y has 50N bytes out of sync, then it's likely + better to repair x only so that x can return to the UPI list quickly. + Also, in the event that all repairees are roughly comparably out of sync, + then the repair network traffic can be minimized by reading each chunk + only once.

Function Index

repair/7
@@ -44,6 +86,6 @@ language independence. Later in Machi's life cycle, we need to
-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_chash.html b/edoc/machi_chash.html index 58f523b..1fec12b 100644 --- a/edoc/machi_chash.html +++ b/edoc/machi_chash.html @@ -166,6 +166,6 @@ list.


-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_cr_client.html b/edoc/machi_cr_client.html index 32e7384..0b7f72f 100644 --- a/edoc/machi_cr_client.html +++ b/edoc/machi_cr_client.html @@ -18,6 +18,65 @@

Description

Erlang API for the Machi client-implemented Chain Replication (CORFU-style) protocol.

+

See also the docs for machi_flu1_client for additional +details on data types and operation descriptions.

+ +

The API here is much simpler than the machi_flu1_client or + machi_proxy_flu1_client APIs. This module's API is a + proposed simple-but-complete form for clients who are not + interested in being an active participant in a Machi cluster and to + have the responsibility for Machi internals, i.e., client-side + Chain Replication, client-side read repair, client-side tracking of + internal Machi epoch & projection changes, etc.

+ +

This client is implemented as a long-lived Erlang process using + gen_server-style OTP code practice. A naive client can expect + that this process will manage all transient TCP session + disconnections and Machi chain reconfigurations. This client's + efforts are best-effort and can require some time to retry + operations in certain failure cases, i.e., up to several seconds + during a Machi projection & epoch change when a new server is +added to the chain.

+ +

Doc TODO: Once this API stabilizes, add all relevant data type details +to the EDoc here.

+ + +

Missing API features

+ +

So far, there is one missing client API feature that ought to be +added to Machi in the near future: more flexible checksum +management.

+ +

Add a source annotation to all checksums to indicate where the +checksum was calculated. For example,

+ + + +

Client-side checksums would be the "strongest" type of +checksum, meaning that any data corruption (of the original +data and/or of the checksum itself) can be detected after the +client-side calculation. There are too many horror stories on +The Net about IP PDUs that are corrupted but unnoticed due to +weak TCP checksums, buggy hardware, buggy OS drivers, etc. +Checksum versioning is also desirable if/when the current checksum +implementation changes from SHA-1 to something else.

+ + +

Implementation notes

+

The major operation processing is implemented in a state machine-like manner. Before attempting an operation X, there's an initial operation pre-X that takes care of updating the epoch id, @@ -56,7 +115,7 @@ function name.)

list_files/2Fetch the list of all files on the remote FLU. quit/1Quit & close the connection to remote FLU and stop our proxy process. -read_chunk/4 +read_chunk/4Read a chunk of data of size Size from File at Offset. read_chunk/5Read a chunk of data of size Size from File at Offset. start_link/1Start a local, long-lived process that will be our steady & reliable communication proxy with the fickle & flaky @@ -144,7 +203,7 @@ function name.)

read_chunk/4

read_chunk(PidSpec, File, Offset, Size) -> any()

-
+

Read a chunk of data of size Size from File at Offset.

read_chunk/5

@@ -165,6 +224,6 @@ function name.)


-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_flu1.html b/edoc/machi_flu1.html index 2c003c4..145d298 100644 --- a/edoc/machi_flu1.html +++ b/edoc/machi_flu1.html @@ -21,7 +21,18 @@ Please see the EDoc "Overview" for details about the FLU as a primitive file server process vs. the larger Machi design of a FLU as a sequencer + file server + chain manager group of processes.

-

For the moment, this module also implements a rudimentary TCP-based +

The FLU is named after the CORFU server "FLU" or "FLash Unit" server.

+ +

Protocol origins

+ +

The protocol implemented here is an artisanal, hand-crafted, silly +thing that was very quick to put together for a "demo day" proof of +concept. It will almost certainly be replaced with something else, +both in terms of wire format and better code separation of +serialization/deserialization vs. network transport management, +etc.

+ +

For the moment, this module implements a rudimentary TCP-based protocol as the sole supported access method to the server, sequencer, and projection store. Conceptually, those three services are independent and ought to have their own protocols. As @@ -30,7 +41,7 @@ compatibility. Furthermore, from the perspective of failure detection, it is very convenient that all three FLU-related services are accessed using the same single TCP port.

-

The FLU is named after the CORFU server "FLU" or "FLash Unit" server.

+

TODO items

TODO There is a major missing feature in this FLU implementation: there is no "write-once" enforcement for any position in a Machi @@ -90,6 +101,6 @@ replication/chain repair.


-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_flu1_client.html b/edoc/machi_flu1_client.html index 8bc99af..e2520d9 100644 --- a/edoc/machi_flu1_client.html +++ b/edoc/machi_flu1_client.html @@ -13,7 +13,34 @@ Erlang API for the Machi FLU TCP protocol version 1. -

Description

Erlang API for the Machi FLU TCP protocol version 1. +

Description

Erlang API for the Machi FLU TCP protocol version 1.

+ +

This client API handles low-level PDU serialization/deserialization + and low-level TCP session management, e.g. open, receive, write, + close. The API for higher-level session management and Machi state + management can be found in machi_proxy_flu1_client and + machi_cr_client.

+ +

TODO This EDoc was written first, and the EDoc and also -type and + -spec definitions for machi_proxy_flu1_client and machi_cr_client must be improved.

+ +

Protocol origins

+ +

The protocol implemented here is an artisanal, hand-crafted, silly +thing that was very quick to put together for a "demo day" proof of +concept. It will almost certainly be replaced with something else, +both in terms of wire format and better code separation of +serialization/deserialization vs. network transport management, +etc.

+ + For the moment, this module implements a rudimentary TCP-based + protocol as the sole supported access method to the server, + sequencer, and projection store. Conceptually, those three + services are independent and ought to have their own protocols. As + a practical matter, there is no need for wire protocol + compatibility. Furthermore, from the perspective of failure + detection, it is very convenient that all three FLU-related + services are accessed using the same single TCP port.

Data Types

chunk()

@@ -337,6 +364,6 @@
-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_flu_psup.html b/edoc/machi_flu_psup.html index 502d194..137abfc 100644 --- a/edoc/machi_flu_psup.html +++ b/edoc/machi_flu_psup.html @@ -10,13 +10,23 @@

Module machi_flu_psup

-Supervisor for Machi FLU servers and their related support - servers. +Supervisor for Machi FLU servers and their related support +servers.

Behaviours: supervisor.

-

Description

Supervisor for Machi FLU servers and their related support - servers. +

Description

Supervisor for Machi FLU servers and their related support +servers.

+ +

Our parent supervisor, machi_flu_sup, is responsible for + managing FLUs as a single entity. However, the actual + implementation of a FLU includes three major Erlang processes (not + including support/worker procs): the FLU itself, the FLU's + projection store, and the FLU's local chain manager. This + supervisor is responsible for managing those three major services + as a single "package", to be started & stopped together.

+ +

Function Index

@@ -72,6 +82,6 @@
init/1
make_mgr_supname/1
Overviewerlang logo
-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_flu_sup.html b/edoc/machi_flu_sup.html index e90de72..8628dca 100644 --- a/edoc/machi_flu_sup.html +++ b/edoc/machi_flu_sup.html @@ -36,6 +36,6 @@
-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_projection.html b/edoc/machi_projection.html index 21ca159..b7622ca 100644 --- a/edoc/machi_projection.html +++ b/edoc/machi_projection.html @@ -89,6 +89,6 @@ correctly.


-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_projection_store.html b/edoc/machi_projection_store.html index feb45d6..91ac187 100644 --- a/edoc/machi_projection_store.html +++ b/edoc/machi_projection_store.html @@ -164,6 +164,6 @@ module's API.


-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_proxy_flu1_client.html b/edoc/machi_proxy_flu1_client.html index b65a72a..ee2d2fb 100644 --- a/edoc/machi_proxy_flu1_client.html +++ b/edoc/machi_proxy_flu1_client.html @@ -23,15 +23,18 @@ connection/disconnection with the remote Machi server.

Machi is intentionally avoiding using distributed Erlang for Machi's communication. This design decision makes Erlang-side code more difficult & complex, but it's the price to pay for some -language independence. Later in Machi's life cycle, we need to +language independence. Later in Machi's life cycle, we may (?) need to (re-)implement some components in a non-Erlang/BEAM-based language.

- This module implements a "man in the middle" proxy between the - Erlang client and Machi server (which is on the "far side" of a TCP - connection to somewhere). This proxy process will always execute - on the same Erlang node as the Erlang client that uses it. The - proxy is intended to be a stable, long-lived process that survives - TCP communication problems with the remote server. +

This module implements a "man in the middle" proxy between the +Erlang client and Machi server (which is on the "far side" of a TCP +connection to somewhere). This proxy process will always execute +on the same Erlang node as the Erlang client that uses it. The +proxy is intended to be a stable, long-lived process that survives +TCP communication problems with the remote server.

+ + For a higher level interface, see machi_cr_client. + For a lower level interface, see machi_flu1_client.

Function Index

@@ -285,6 +288,6 @@ language independence. Later in Machi's life cycle, we need to
append_chunk/4Append a chunk (binary- or iolist-style) of data to a file with Prefix.
Overviewerlang logo
-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_sequencer.html b/edoc/machi_sequencer.html index 3e8a04c..3f5cc45 100644 --- a/edoc/machi_sequencer.html +++ b/edoc/machi_sequencer.html @@ -18,6 +18,6 @@ the future?
-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_sup.html b/edoc/machi_sup.html index ff618ef..bf2e47e 100644 --- a/edoc/machi_sup.html +++ b/edoc/machi_sup.html @@ -34,6 +34,6 @@
-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_util.html b/edoc/machi_util.html index 713c56a..69f7bf6 100644 --- a/edoc/machi_util.html +++ b/edoc/machi_util.html @@ -163,6 +163,6 @@
-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/machi_yessir_client.html b/edoc/machi_yessir_client.html index b690143..091b17d 100644 --- a/edoc/machi_yessir_client.html +++ b/edoc/machi_yessir_client.html @@ -337,6 +337,6 @@
-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/edoc/overview-summary.html b/edoc/overview-summary.html index 43c0343..6928b8e 100644 --- a/edoc/overview-summary.html +++ b/edoc/overview-summary.html @@ -180,6 +180,6 @@ the code, is a reminder signal of unfinished work.


-

Generated by EDoc, May 20 2015, 11:11:34.

+

Generated by EDoc, May 20 2015, 12:36:35.

diff --git a/images/supervisor-2flus.png b/images/supervisor-2flus.png new file mode 100644 index 0000000000000000000000000000000000000000..13023606433a018118cad3d663c86e159f46a404 GIT binary patch literal 35240 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 PH`7atD|`lt>IeQW)$mrU literal 0 HcmV?d00001