Page History

Turn Off History

Design Doc: Mixed Mode IPv4/IPv6

In progress.

Author: Alan De Smet (adesmet@cs).

Goal

Be able to run an HTCondor with some nodes only speaking IPv4, some only speaking IPv6, and some speaking both. Matchmaking must avoid matching an IPv4-only computer to an IPv6-only computer.

Assumptions

Many of these are things we would hope to change in the future, but are not required for the initial implementation of mixed-mode.

Open design questions

Plan

  1. Dual mode collector
    1. Teach collector to respond to commands on both IPv4 and IPv6. (Likely side effect: all daemons do.)
    2. Teach collector to hold both IPv4 and IPv6 ads. (Probably no work at all.)

  2. Dual address sinful strings
    • Allow encoding both IPv4 and IPv6 addresses in a sinful string. Needs to simultaneously work with CCB and shared port. If we bother with backward compatbility, make the IPv4 address the backward compatible one.
    • May need to support different port numbers for different addresses; trying to synchronize port numbers across TCP and UDP for both IPv4 and IPv6 seems like a pain in the ass.
    • Design such that if in the future we wanted to have arbitrarily long lists of addresses, we could do so while maintaining backward compatbility (older versions would just use the head of a list). This seems likely to be functionality we'll want in the future, and while we're messing with the sinful strings in the time to ensure the futureproofing is done.
    • Rejected: MyAddress (implicitly IPv4) and new attribute MyAddressIPv6. It means multiple places need to look in multiple attributes to find the appropriate address. We want to be able to hand a sinful string around and assume it's everything you need to contact someone. We made this same tradeoff of CCB and shared port.

  3. Teach startd to listen on and advertise both IPv4 and IPv6 addresses. (Likely side effect: all daemons do.)
    • Likely just done at the DaemonCore level where the attributes are automatically added. Indeed, likely even lower, at the "Gimme a sinful string for myself" level.
    • There will be breakage at this point, as the negotiator begins trying to match IPv4-only hosts to IPv6-only hosts.

  4. Teach schedd to listen on and advertise both IPv4 and IPv6 addresses. (Possibly done by "teach startd" step.)
    • There will be breakage at this point, as the negotiator begins trying to match IPv4-only hosts to IPv6-only hosts.

  5. Teach negotiator to make matchmaking decisions based on IPv4 and IPv6 capabilities of the involved parties.
    1. New function: CanCommunicate, takes two sinful strings, returns true or false.
    2. Negotiator implicitly adds CanCommunicate to Requirements for the Machine (or the Job; whichever).
      • Rejected: Explicitly add. Risks trashing autoclusters, as every machine and job has a unique sinful string.
    3. Rejected: add SpeaksIPv6=TRUE; SpeaksIPv4=TRUE then adding to Job/Machine adds (Requirements=SpeaksIPv6 && TARGET.SpeaksIPv6)||(Requirements=SpeaksIPv4 && TARGET.SpeaksIPv4). Not backward compatible. Could assume anyone lacking both only speaks IPv4, but breaks existance IPv6 pools. Not future proof: no hope for subtle things like "are these hosts on the same subnet and thus able to use link local IPv6?"

  6. Teach other daemons to listen on and advertise both IPv4 and IPv6 addresses. (Possibly done by "teach startds" step).

  7. Gracefully handle impossible connection requests.
    1. Daemons that only handle one protocol shouldn't ever have a reason to connect to the other. But just in case, ensure the failure is graceful: complain to the log and carry on. EXCEPTing is absolutely not acceptable.
    2. Command line tools could easily be asked to do the impossible. "condor_q -name ipv6-only-host.example.com" on an IPv4 host, for example. We need to give a reasonable message to the end user.