/** Restart a dead avatar node as a standby avatar. */ public void restartStandby(int nnIndex) throws IOException { AvatarInfo dead = getDeadAvatar(nnIndex); if (getPrimaryAvatar(nnIndex) == null || dead == null) { throw new IOException("cannot start standby avatar: " + "primary or dead avatar not found"); } LOG.info("restarting " + dead.startupOption + " as standby"); NameNodeInfo nni = this.nameNodes[nnIndex]; String[] args; ArrayList<String> argList = new ArrayList<String>(); argList.add(dead.startupOption); argList.add(AvatarConstants.StartupOption.STANDBY.getName()); argList.add(AvatarConstants.StartupOption.REGULAR.getName()); if (federation) { argList.add(StartupOption.SERVICE.getName()); argList.add(nni.nameserviceId); } args = new String[argList.size()]; argList.toArray(args); dead.avatar = AvatarNode.createAvatarNode(args, getServerConf(dead.startupOption, nni)); dead.state = AvatarState.STANDBY; if (dead.avatar == null) { throw new IOException("cannot start avatar node"); } }
/** Kill the standby avatar node. */ public void killStandby(int nnIndex) throws IOException { AvatarInfo standby = getStandbyAvatar(nnIndex); if (standby != null) { standby.avatar.shutdownAvatar(); standby.avatar = null; standby.state = AvatarState.DEAD; try { Thread.sleep(1000); } catch (InterruptedException ignore) { // do nothing } } else { LOG.info("can't kill standby avatar, already dead"); } }
/** Make standby avatar the new primary avatar. Kill the old primary avatar first if necessary. */ public void failOver(int nnIndex) throws IOException { if (getPrimaryAvatar(nnIndex) != null) { LOG.info("killing primary avatar before failover"); killPrimary(nnIndex); } AvatarInfo standby = getStandbyAvatar(nnIndex); if (standby == null) { throw new IOException("no standby avatar running"); } standby.avatar.setAvatar(AvatarConstants.Avatar.ACTIVE); standby.state = AvatarState.ACTIVE; registerZooKeeperNode( standby.nnPort, standby.nnDnPort, standby.httpPort, standby.rpcPort, this.nameNodes[nnIndex]); }
/** * Kill the primary avatar node. * * @param clearZK clear zookeeper? */ public void killPrimary(int nnIndex, boolean clearZK) throws IOException { AvatarInfo primary = getPrimaryAvatar(nnIndex); if (primary != null) { if (clearZK) { clearZooKeeperNode(nnIndex); } primary.avatar.shutdownAvatar(); primary.avatar = null; primary.state = AvatarState.DEAD; try { Thread.sleep(1000); } catch (InterruptedException ignore) { // do nothing } } else { throw new IOException("can't kill primary avatar, already dead"); } }