To achieve fault-tolerance for the maintenance primitives, we will need to add the maintenance information to the registry.
The registry currently stores all of the slave information, which is quite large (~ 17MB for 50,000 slaves from my testing), which results in a protobuf object that is extremely expensive to copy.
As far as I can tell, reads / writes to maintenance information is independent of reads / writes to the existing 'registry' information. So there are two approach here:
- The advantage of this approach is that we don't further grow the large Registry object.
- This approach assumes that writes to 'maintenance' are independent of writes to the 'registry'.
If these writes are not independent, this approach requires that we add transactional support to the State abstraction. This approach requires adding compaction to LogStorage.
- This approach likely requires some refactoring to the Registrar.
- The advantage of this approach is that it's the easiest to implement.
- This will further grow the single 'registry' object, but doesn't preclude it being split apart in the future.
- This approach may require using the diff support in LogStorage and/or adding compression support to LogStorage snapshots to deal with the increased size of the registry.