···100100a log will only be GC'd once all storage servers in the team have popped past a particular version.
101101102102Copysets also naturally solve the fault-tolerance issue, by their nature.
103103+104104+## Implementation
105105+106106+- In manager, always spawn TLogs in sets of `replication_factor`.
107107+ The TLog copysets are stored implicitly as each N TLogs in the list:
108108+ `[1, 2, 3, 4, 5, 6]` -> `[{1, 2, 3}, {4, 5, 6}]`
109109+- In the Manager/Distributor, shards point to a team id directly instead of to a set of storage server ids
110110+- In the CommitBuffer, mutations are tagged with a team id as above and then sent to the corresponding TLog team.
111111+ The TLog team for a storage team can be computed using the same mod trick, i.e. `rem(storage_team_id, length(tlog_teams))`
112112+- Storage servers can now safely read from any TLog in their corresponding team for a given generation.
113113+- During recovery, the Manager needs to hear from at least one TLog from every copyset in order to proceed.
114114+- The Distributor can *only* move shards between storage teams.
115115+ Storage servers can not be added to or removed from teams; teams can only be created and destroyed.
116116+ (Note that the current implementation does not do this anyway, because this was planned.)