updates from summit

This commit is contained in:
Brian Warner 2016-11-14 16:24:26 -08:00 committed by meejah
parent 17cff7a176
commit 211dc602fa

View File

@ -108,36 +108,53 @@ Calculating Share Placements
We calculate share placement like so: We calculate share placement like so:
1. Query 2n servers for existing shares. 0. Start with an ordered list of servers. Maybe *2N* of them.
2. Construct a bipartite graph of readonly servers to shares, where an edge 1. Query all servers for existing shares.
exists between an arbitrary readonly server s and an arbitrary share n if and only if s
holds n.
3. Calculate the maximum matching graph of the bipartite graph. The maxmum matching 2. Construct a bipartite graph G1 of *readonly* servers to pre-existing
is the matching which contains the largest possible number of edges. shares, where an edge exists between an arbitrary readonly server S and an
arbitrary share T if and only if S currently holds T.
4. Construct a bipartite graph of servers to shares, removing any servers and 3. Calculate a maximum matching graph of G1 (a set of S->T edges that has or
shares used in the maximum matching graph from step 3. Let an edge exist between is-tied-for the highest "happiness score"). There is a clever efficient
server s and share n if and only if s holds n. algorithm for this, named "Ford-Fulkerson". There may be more than one
maximum matching for this graph; we choose one of them arbitrarily, but
prefer earlier servers. Call this particular placement M1. The placement
maps shares to servers, where each share appears at most once, and each
server appears at most once.
5. Calculate the maximum matching graph of the new graph. 4. Construct a bipartite graph G2 of readwrite servers to pre-existing
shares. Then remove any edge (from G2) that uses a server or a share found
in M1. Let an edge exist between server S and share T if and only if S
already holds T.
6. Construct a bipartite graph of servers to share, removing any servers and 5. Calculate a maximum matching graph of G2, call this M2, again preferring
shares used in the maximum matching graphs from steps 3 and 5. Let an edge exist earlier servers.
between server s and share n if and only if s can hold n.
7. Calculate the maximum matching graph of the new graph. 6. Construct a bipartite graph G3 of (only readwrite) servers to shares. Let
an edge exist between server S and share T if and only if S already has T,
or *could* hold T (i.e. S has enough available space to hold a share of at
least T's size). Then remove (from G3) any servers and shares used in M1
or M2 (note that we retain servers/shares that were in G1/G2 but *not* in
the M1/M2 subsets)
8. Renew the shares on their respective servers from steps 3 7. Calculate a maximum matching graph of G3, call this M3, preferring earlier
and 5. servers. The final placement table is the union of M1+M2+M3.
9. Place share n on server s if an edge exists between s and n in the 8. Renew the shares on their respective servers from M1 and M2.
maximum matching graph from step 7.
10. If any placements from step 7 fail, remove the server from the set of possible 9. Upload share T to server S if an edge exists between S and T in M3.
servers and regenerate the matchings.
10. If any placements from step 9 fail, mark the server as read-only. Go back
to step 2 (since we may discover a server is/has-become read-only, or has
failed, during step 9).
Rationale (Step 4): when we see pre-existing shares on read-only servers, we
prefer to rely upon those (rather than the ones on read-write servers), so we
can maybe use the read-write servers for new shares. If we picked the
read-write server's share, then we couldn't re-use that server for new ones
(we only rely upon each server for one share, more or less).
Properties of Upload Strategy of Happiness Properties of Upload Strategy of Happiness
========================================== ==========================================