Repository: mesos Updated Branches: refs/heads/master 9327d48ca -> 461c521d4
Fixed duplicated slave id in master after master failover. Generate masterInfo.id by UUID instead of "date + ip + port + pid". Review: https://reviews.apache.org/r/38003 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/461c521d Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/461c521d Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/461c521d Branch: refs/heads/master Commit: 461c521d4315ea6c718954f0ed99360c80aa2c8b Parents: 9327d48 Author: Klaus Ma <[email protected]> Authored: Fri Sep 18 14:27:02 2015 -0700 Committer: Vinod Kone <[email protected]> Committed: Fri Sep 18 16:08:11 2015 -0700 ---------------------------------------------------------------------- src/master/master.cpp | 14 ++----------- src/tests/master_tests.cpp | 45 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/461c521d/src/master/master.cpp ---------------------------------------------------------------------- diff --git a/src/master/master.cpp b/src/master/master.cpp index ca4d587..3b390d7 100644 --- a/src/master/master.cpp +++ b/src/master/master.cpp @@ -305,18 +305,8 @@ Master::Master( // NOTE: We populate 'info_' here instead of inside 'initialize()' // because 'StandaloneMasterDetector' needs access to the info. - // The master ID is currently comprised of the current date, the IP - // address and port from self() and the OS PID. - Try<string> id = strings::format( - "%s-%u-%u-%d", - DateUtils::currentDate(), - self().address.ip.in().get().s_addr, - self().address.port, - getpid()); - - CHECK(!id.isError()) << id.error(); - - info_.set_id(id.get()); + // Master ID is generated randomly based on UUID. + info_.set_id(UUID::random().toString()); // NOTE: Currently, we store ip in MasterInfo in network order, // which should be fixed. See MESOS-1201 for details. http://git-wip-us.apache.org/repos/asf/mesos/blob/461c521d/src/tests/master_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/master_tests.cpp b/src/tests/master_tests.cpp index a477794..2cb8b3c 100644 --- a/src/tests/master_tests.cpp +++ b/src/tests/master_tests.cpp @@ -3682,6 +3682,51 @@ TEST_F(MasterTest, MasterFailoverLongLivedExecutor) Shutdown(); // Must shutdown before 'containerizer' gets deallocated. } + +// This test ensures that a slave gets a unique SlaveID even after +// master fails over. Please refer to MESOS-3351 for further details. +TEST_F(MasterTest, DuplicatedSlaveIdWhenSlaveReregister) +{ + Try<PID<Master>> master = StartMaster(); + ASSERT_SOME(master); + + Future<SlaveRegisteredMessage> slaveRegisteredMessage1 = + FUTURE_PROTOBUF(SlaveRegisteredMessage(), _, _); + + StandaloneMasterDetector slaveDetector1 (master.get()); + Try<PID<Slave>> slave1 = StartSlave(&slaveDetector1); + ASSERT_SOME(slave1); + + AWAIT_READY(slaveRegisteredMessage1); + + Stop(master.get()); + master = StartMaster(); + ASSERT_SOME(master); + + Future<SlaveRegisteredMessage> slaveRegisteredMessage2 = + FUTURE_PROTOBUF(SlaveRegisteredMessage(), _, _); + + // Start a new slave and make sure it registers before the old slave. + slave::Flags slaveFlags2 = CreateSlaveFlags(); + Try<PID<Slave>> slave2 = StartSlave(slaveFlags2); + ASSERT_SOME(slave2); + + AWAIT_READY(slaveRegisteredMessage2); + + Future<SlaveReregisteredMessage> slaveReregisteredMessage1 = + FUTURE_PROTOBUF(SlaveReregisteredMessage(), master.get(), _); + + // Now let the first slave re-register. + slaveDetector1.appoint(master.get()); + + // If both the slaves get the same SlaveID, the re-registration would + // fail here. + AWAIT_READY(slaveReregisteredMessage1); + + Shutdown(); +} + + // This test ensures that if a framework scheduler provides any // labels in its FrameworkInfo message, those labels are included // in the master's state endpoint.
