@Override public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { try { final GetImageParams parsedParams = new GetImageParams(request, response); // here we only support getImage if (!parsedParams.isGetImage()) { throw new IOException("Only getImage requests are supported"); } // get access to journal node storage final ServletContext context = getServletContext(); final Configuration conf = (Configuration) getServletContext() .getAttribute(JspHelper.CURRENT_CONF); final String journalId = request.getParameter(JOURNAL_ID_PARAM); QuorumJournalManager.checkJournalId(journalId); final Journal journal = JournalNodeHttpServer.getJournalFromContext( context, journalId); final JNStorage imageStorage = journal.getImageStorage(); final JournalMetrics metrics = journal.getMetrics(); if (metrics != null) { metrics.numGetImageDoGet.inc(); } // Check that the namespace info is correct if (!GetJournalEditServlet.checkStorageInfoOrSendError(imageStorage, request, response)) { return; } // we will serve image at txid long txid = parsedParams.getTxId(); File imageFile = imageStorage.getImageFile(txid); // no such image in the storage if (imageFile == null) { throw new IOException("Could not find image with txid " + txid); } // set verification headers setVerificationHeaders(response, imageFile); // send fsImage TransferFsImage.getFileServer(response.getOutputStream(), imageFile, GetImageServlet.getThrottler(conf, parsedParams.isThrottlerDisabled())); } catch (Throwable t) { GetJournalEditServlet.handleFailure(t, response, "getImage"); } }
@Override public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { FileInputStream editFileIn = null; try { final ServletContext context = getServletContext(); final Configuration conf = (Configuration) getServletContext() .getAttribute(JspHelper.CURRENT_CONF); final String journalId = request.getParameter(JOURNAL_ID_PARAM); QuorumJournalManager.checkJournalId(journalId); final JNStorage storage = JournalNodeHttpServer .getJournalFromContext(context, journalId).getStorage(); // Check security if (!checkRequestorOrSendError(conf, request, response)) { return; } // Check that the namespace info is correct if (!checkStorageInfoOrSendError(storage, request, response)) { return; } long segmentTxId = ServletUtil.parseLongParam(request, SEGMENT_TXID_PARAM); FileJournalManager fjm = storage.getJournalManager(); File editFile; synchronized (fjm) { // Synchronize on the FJM so that the file doesn't get finalized // out from underneath us while we're in the process of opening // it up. EditLogFile elf = fjm.getLogFile( segmentTxId); if (elf == null) { response.sendError(HttpServletResponse.SC_NOT_FOUND, "No edit log found starting at txid " + segmentTxId); return; } editFile = elf.getFile(); GetImageServlet.setVerificationHeaders(response, editFile); GetImageServlet.setFileNameHeaders(response, editFile); editFileIn = new FileInputStream(editFile); } DataTransferThrottler throttler = GetImageServlet.getThrottler(conf); // send edits TransferFsImage.getFileServer(response, editFile, editFileIn, throttler); } catch (Throwable t) { String errMsg = "getedit failed. " + StringUtils.stringifyException(t); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, errMsg); throw new IOException(errMsg); } finally { IOUtils.closeStream(editFileIn); } }