/** * Creates a MasterInfo protobuf from the process's UPID. * * This is only used by the `StandaloneMasterDetector` (used in tests * and outside tests when ZK is not used). * * For example, when we start a slave with * `[email protected]:5050`, since the slave (and consequently * its detector) doesn't have enough information about `MasterInfo`, it * tries to construct it based on the only available information * (`UPID`). * * @param pid The process's assigned untyped PID. * @return A fully formed `MasterInfo` with the IP/hostname information * as derived from the `UPID`. */ MasterInfo createMasterInfo(const UPID& pid) { MasterInfo info; info.set_id(stringify(pid) + "-" + UUID::random().toString()); // NOTE: Currently, we store the ip in network order, which should // be fixed. See MESOS-1201 for more details. // TODO(marco): `ip` and `port` are deprecated in favor of `address`; // remove them both after the deprecation cycle. info.set_ip(pid.address.ip.in().get().s_addr); info.set_port(pid.address.port); info.mutable_address()->set_ip(stringify(pid.address.ip)); info.mutable_address()->set_port(pid.address.port); info.set_pid(pid); Try<string> hostname = net::getHostname(pid.address.ip); if (hostname.isSome()) { // Hostname is deprecated; but we need to update it // to maintain backward compatibility. // TODO(marco): Remove once we deprecate it. info.set_hostname(hostname.get()); info.mutable_address()->set_hostname(hostname.get()); } return info; }
MasterInfo createMasterInfo(const process::UPID& pid) { MasterInfo info; info.set_id(stringify(pid) + "-" + UUID::random().toString()); info.set_ip(pid.address.ip); info.set_port(pid.address.port); info.set_pid(pid); Try<string> hostname = net::getHostname(pid.address.ip); if (hostname.isSome()) { info.set_hostname(hostname.get()); } return info; }
/** * Creates a MasterInfo protobuf from the process's UPID. * * This is only used by the `StandaloneMasterDetector` (used in tests * and outside tests when ZK is not used). * * For example, when we start a slave with * `[email protected]:5050`, since the slave (and consequently * its detector) doesn't have enough information about `MasterInfo`, it * tries to construct it based on the only available information * (`UPID`). * * @param pid The process's assigned untyped PID. * @return A fully formed `MasterInfo` with the IP/hostname information * as derived from the `UPID`. */ MasterInfo createMasterInfo(const process::UPID& pid) { MasterInfo info; info.set_id(stringify(pid) + "-" + UUID::random().toString()); // NOTE: Currently, we store the ip in network order, which should // be fixed. See MESOS-1201 for more details. info.set_ip(pid.address.ip.in().get().s_addr); info.set_port(pid.address.port); info.set_pid(pid); Try<string> hostname = net::getHostname(pid.address.ip); if (hostname.isSome()) { info.set_hostname(hostname.get()); } return info; }
TEST_F(RegistrarTest, recover) { Registrar registrar(state); SlaveInfo slave; slave.set_hostname("localhost"); SlaveID id; id.set_value("1"); slave.mutable_id()->CopyFrom(id); // Operations preceding recovery will fail. AWAIT_EXPECT_FAILED(registrar.admit(slave)); AWAIT_EXPECT_FAILED(registrar.readmit(slave)); AWAIT_EXPECT_FAILED(registrar.remove(slave)); MasterInfo info; info.set_id("foobar"); info.set_ip(0); info.set_port(5050); info.set_pid("0:5050"); Future<Registry> registry = registrar.recover(info); // Before waiting for the recovery to complete, invoke some // operations to ensure they do not fail. Future<bool> admit = registrar.admit(slave); Future<bool> readmit = registrar.readmit(slave); Future<bool> remove = registrar.remove(slave); AWAIT_READY(registry); EXPECT_EQ(info, registry.get().master().info()); AWAIT_EQ(true, admit); AWAIT_EQ(true, readmit); AWAIT_EQ(true, remove); }