|
@@ -43,6 +43,7 @@ import org.apache.hadoop.hdfs.DFSUtilClient;
|
|
|
import org.apache.hadoop.security.SecurityUtil;
|
|
|
import org.apache.commons.logging.Log;
|
|
|
import org.apache.commons.logging.LogFactory;
|
|
|
+import org.eclipse.jetty.server.Response;
|
|
|
import org.apache.hadoop.classification.InterfaceAudience;
|
|
|
import org.apache.hadoop.conf.Configuration;
|
|
|
import org.apache.hadoop.hdfs.DFSUtil;
|
|
@@ -118,7 +119,7 @@ public class ImageServlet extends HttpServlet {
|
|
|
if (nnImage == null) {
|
|
|
String errorMsg = "NameNode initialization not yet complete. "
|
|
|
+ "FSImage has not been set in the NameNode.";
|
|
|
- response.sendError(HttpServletResponse.SC_FORBIDDEN, errorMsg);
|
|
|
+ sendError(response, HttpServletResponse.SC_FORBIDDEN, errorMsg);
|
|
|
throw new IOException(errorMsg);
|
|
|
}
|
|
|
return nnImage;
|
|
@@ -207,7 +208,7 @@ public class ImageServlet extends HttpServlet {
|
|
|
|
|
|
} catch (Throwable t) {
|
|
|
String errMsg = "GetImage failed. " + StringUtils.stringifyException(t);
|
|
|
- response.sendError(HttpServletResponse.SC_GONE, errMsg);
|
|
|
+ sendError(response, HttpServletResponse.SC_GONE, errMsg);
|
|
|
throw new IOException(errMsg);
|
|
|
} finally {
|
|
|
response.getOutputStream().close();
|
|
@@ -223,7 +224,7 @@ public class ImageServlet extends HttpServlet {
|
|
|
conf)) {
|
|
|
String errorMsg = "Only Namenode, Secondary Namenode, and administrators may access "
|
|
|
+ "this servlet";
|
|
|
- response.sendError(HttpServletResponse.SC_FORBIDDEN, errorMsg);
|
|
|
+ sendError(response, HttpServletResponse.SC_FORBIDDEN, errorMsg);
|
|
|
LOG.warn("Received non-NN/SNN/administrator request for image or edits from "
|
|
|
+ request.getUserPrincipal().getName()
|
|
|
+ " at "
|
|
@@ -236,7 +237,7 @@ public class ImageServlet extends HttpServlet {
|
|
|
&& !myStorageInfoString.equals(theirStorageInfoString)) {
|
|
|
String errorMsg = "This namenode has storage info " + myStorageInfoString
|
|
|
+ " but the secondary expected " + theirStorageInfoString;
|
|
|
- response.sendError(HttpServletResponse.SC_FORBIDDEN, errorMsg);
|
|
|
+ sendError(response, HttpServletResponse.SC_FORBIDDEN, errorMsg);
|
|
|
LOG.warn("Received an invalid request file transfer request "
|
|
|
+ "from a secondary with storage info " + theirStorageInfoString);
|
|
|
throw new IOException(errorMsg);
|
|
@@ -552,7 +553,7 @@ public class ImageServlet extends HttpServlet {
|
|
|
// we need a different response type here so the client can differentiate this
|
|
|
// from the failure to upload due to (1) security, or (2) other checkpoints already
|
|
|
// present
|
|
|
- response.sendError(HttpServletResponse.SC_EXPECTATION_FAILED,
|
|
|
+ sendError(response, HttpServletResponse.SC_EXPECTATION_FAILED,
|
|
|
"Nameode "+request.getLocalAddr()+" is currently not in a state which can "
|
|
|
+ "accept uploads of new fsimages. State: "+state);
|
|
|
return null;
|
|
@@ -567,7 +568,7 @@ public class ImageServlet extends HttpServlet {
|
|
|
// if the node is attempting to upload an older transaction, we ignore it
|
|
|
SortedSet<ImageUploadRequest> larger = currentlyDownloadingCheckpoints.tailSet(imageRequest);
|
|
|
if (larger.size() > 0) {
|
|
|
- response.sendError(HttpServletResponse.SC_CONFLICT,
|
|
|
+ sendError(response, HttpServletResponse.SC_CONFLICT,
|
|
|
"Another checkpointer is already in the process of uploading a" +
|
|
|
" checkpoint made up to transaction ID " + larger.last());
|
|
|
return null;
|
|
@@ -575,7 +576,7 @@ public class ImageServlet extends HttpServlet {
|
|
|
|
|
|
//make sure no one else has started uploading one
|
|
|
if (!currentlyDownloadingCheckpoints.add(imageRequest)) {
|
|
|
- response.sendError(HttpServletResponse.SC_CONFLICT,
|
|
|
+ sendError(response, HttpServletResponse.SC_CONFLICT,
|
|
|
"Either current namenode is checkpointing or another"
|
|
|
+ " checkpointer is already in the process of "
|
|
|
+ "uploading a checkpoint made at transaction ID "
|
|
@@ -622,7 +623,7 @@ public class ImageServlet extends HttpServlet {
|
|
|
(txid - lastCheckpointTxid) + " expecting at least "
|
|
|
+ checkpointTxnCount;
|
|
|
LOG.info(message);
|
|
|
- response.sendError(HttpServletResponse.SC_CONFLICT, message);
|
|
|
+ sendError(response, HttpServletResponse.SC_CONFLICT, message);
|
|
|
return null;
|
|
|
}
|
|
|
|
|
@@ -632,7 +633,7 @@ public class ImageServlet extends HttpServlet {
|
|
|
+ "another checkpointer already uploaded an "
|
|
|
+ "checkpoint for txid " + txid;
|
|
|
LOG.info(message);
|
|
|
- response.sendError(HttpServletResponse.SC_CONFLICT, message);
|
|
|
+ sendError(response, HttpServletResponse.SC_CONFLICT, message);
|
|
|
return null;
|
|
|
}
|
|
|
|
|
@@ -669,11 +670,20 @@ public class ImageServlet extends HttpServlet {
|
|
|
});
|
|
|
} catch (Throwable t) {
|
|
|
String errMsg = "PutImage failed. " + StringUtils.stringifyException(t);
|
|
|
- response.sendError(HttpServletResponse.SC_GONE, errMsg);
|
|
|
+ sendError(response, HttpServletResponse.SC_GONE, errMsg);
|
|
|
throw new IOException(errMsg);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private void sendError(HttpServletResponse response, int code, String message)
|
|
|
+ throws IOException {
|
|
|
+ if (response instanceof Response) {
|
|
|
+ ((Response)response).setStatusWithReason(code, message);
|
|
|
+ }
|
|
|
+
|
|
|
+ response.sendError(code, message);
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Params required to handle put image request
|
|
|
*/
|