@Test public void testClientFailoverWhenStandbyNNHasStaleCredentials() throws IOException { Configuration conf = DFSTestUtil.newHAConfiguration(LOGICAL_NAME); conf.setBoolean(DFSConfigKeys .DFS_NAMENODE_DELEGATION_TOKEN_ALWAYS_USE_KEY, true); MiniDFSCluster cluster = null; WebHdfsFileSystem fs = null; try { cluster = new MiniDFSCluster.Builder(conf).nnTopology(topo).numDataNodes( 0).build(); HATestUtil.setFailoverConfigurations(cluster, conf, LOGICAL_NAME); cluster.waitActive(); fs = (WebHdfsFileSystem) FileSystem.get(WEBHDFS_URI, conf); cluster.transitionToActive(0); Token<?> token = fs.getDelegationToken(null); final DelegationTokenIdentifier identifier = new DelegationTokenIdentifier(); identifier.readFields( new DataInputStream(new ByteArrayInputStream(token.getIdentifier()))); cluster.transitionToStandby(0); cluster.transitionToActive(1); final DelegationTokenSecretManager secretManager = NameNodeAdapter.getDtSecretManager( cluster.getNamesystem(0)); ExceptionHandler eh = new ExceptionHandler(); eh.initResponse(mock(HttpServletResponse.class)); Response resp = null; try { secretManager.retrievePassword(identifier); } catch (IOException e) { // Mimic the UserProvider class logic (server side) by throwing // SecurityException here Assert.assertTrue(e instanceof SecretManager.InvalidToken); resp = eh.toResponse(new SecurityException(e)); } // The Response (resp) below is what the server will send to client // // BEFORE HDFS-6475 fix, the resp.entity is // {"RemoteException":{"exception":"SecurityException", // "javaClassName":"java.lang.SecurityException", // "message":"Failed to obtain user group information: // org.apache.hadoop.security.token.SecretManager$InvalidToken: // StandbyException"}} // AFTER the fix, the resp.entity is // {"RemoteException":{"exception":"StandbyException", // "javaClassName":"org.apache.hadoop.ipc.StandbyException", // "message":"Operation category READ is not supported in // state standby"}} // // Mimic the client side logic by parsing the response from server // Map<?, ?> m = (Map<?, ?>) JSON.parse(resp.getEntity().toString()); RemoteException re = JsonUtilClient.toRemoteException(m); Exception unwrapped = re.unwrapRemoteException(StandbyException.class); Assert.assertTrue(unwrapped instanceof StandbyException); } finally { IOUtils.cleanup(null, fs); if (cluster != null) { cluster.shutdown(); } } }