HDFS-11877. FileJournalManager#getLogFile should ignore in progress edit logs during JN sync. Contributed by Hanisha Koneru.

This commit is contained in:
Arpit Agarwal 2017-05-24 16:09:00 -07:00 committed by Xiaoyu Yao
parent a02b908e6a
commit 0646fb2fa5
4 changed files with 30 additions and 8 deletions

View File

@ -276,7 +276,7 @@ public class IPCLoggerChannel implements AsyncLogger {
try { try {
String path = GetJournalEditServlet.buildPath( String path = GetJournalEditServlet.buildPath(
journalId, segmentTxId, nsInfo); journalId, segmentTxId, nsInfo, true);
return new URL(httpServerURL, path); return new URL(httpServerURL, path);
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
// should never get here. // should never get here.

View File

@ -72,6 +72,7 @@ public class GetJournalEditServlet extends HttpServlet {
static final String STORAGEINFO_PARAM = "storageInfo"; static final String STORAGEINFO_PARAM = "storageInfo";
static final String JOURNAL_ID_PARAM = "jid"; static final String JOURNAL_ID_PARAM = "jid";
static final String SEGMENT_TXID_PARAM = "segmentTxId"; static final String SEGMENT_TXID_PARAM = "segmentTxId";
static final String IN_PROGRESS_OK = "inProgressOk";
protected boolean isValidRequestor(HttpServletRequest request, Configuration conf) protected boolean isValidRequestor(HttpServletRequest request, Configuration conf)
throws IOException { throws IOException {
@ -186,6 +187,14 @@ public class GetJournalEditServlet extends HttpServlet {
final Configuration conf = (Configuration) getServletContext() final Configuration conf = (Configuration) getServletContext()
.getAttribute(JspHelper.CURRENT_CONF); .getAttribute(JspHelper.CURRENT_CONF);
final String journalId = request.getParameter(JOURNAL_ID_PARAM); final String journalId = request.getParameter(JOURNAL_ID_PARAM);
final String inProgressOkStr = request.getParameter(IN_PROGRESS_OK);
final boolean inProgressOk;
if (inProgressOkStr != null &&
inProgressOkStr.equalsIgnoreCase("false")) {
inProgressOk = false;
} else {
inProgressOk = true;
}
QuorumJournalManager.checkJournalId(journalId); QuorumJournalManager.checkJournalId(journalId);
final JNStorage storage = JournalNodeHttpServer final JNStorage storage = JournalNodeHttpServer
.getJournalFromContext(context, journalId).getStorage(); .getJournalFromContext(context, journalId).getStorage();
@ -210,8 +219,7 @@ public class GetJournalEditServlet extends HttpServlet {
// Synchronize on the FJM so that the file doesn't get finalized // Synchronize on the FJM so that the file doesn't get finalized
// out from underneath us while we're in the process of opening // out from underneath us while we're in the process of opening
// it up. // it up.
EditLogFile elf = fjm.getLogFile( EditLogFile elf = fjm.getLogFile(segmentTxId, inProgressOk);
segmentTxId);
if (elf == null) { if (elf == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND, response.sendError(HttpServletResponse.SC_NOT_FOUND,
"No edit log found starting at txid " + segmentTxId); "No edit log found starting at txid " + segmentTxId);
@ -239,7 +247,7 @@ public class GetJournalEditServlet extends HttpServlet {
} }
public static String buildPath(String journalId, long segmentTxId, public static String buildPath(String journalId, long segmentTxId,
NamespaceInfo nsInfo) { NamespaceInfo nsInfo, boolean inProgressOk) {
StringBuilder path = new StringBuilder("/getJournal?"); StringBuilder path = new StringBuilder("/getJournal?");
try { try {
path.append(JOURNAL_ID_PARAM).append("=") path.append(JOURNAL_ID_PARAM).append("=")
@ -248,6 +256,8 @@ public class GetJournalEditServlet extends HttpServlet {
.append(segmentTxId); .append(segmentTxId);
path.append("&" + STORAGEINFO_PARAM).append("=") path.append("&" + STORAGEINFO_PARAM).append("=")
.append(URLEncoder.encode(nsInfo.toColonSeparatedString(), "UTF-8")); .append(URLEncoder.encode(nsInfo.toColonSeparatedString(), "UTF-8"));
path.append("&" + IN_PROGRESS_OK).append("=")
.append(inProgressOk);
} catch (UnsupportedEncodingException e) { } catch (UnsupportedEncodingException e) {
// Never get here -- everyone supports UTF-8 // Never get here -- everyone supports UTF-8
throw new RuntimeException(e); throw new RuntimeException(e);

View File

@ -296,7 +296,7 @@ public class JournalNodeSyncer {
} }
String urlPath = GetJournalEditServlet.buildPath(jid, missingLog String urlPath = GetJournalEditServlet.buildPath(jid, missingLog
.getStartTxId(), nsInfo); .getStartTxId(), nsInfo, false);
url = new URL(remoteJNproxy.httpServerUrl, urlPath); url = new URL(remoteJNproxy.httpServerUrl, urlPath);
success = downloadMissingLogSegment(url, missingLog); success = downloadMissingLogSegment(url, missingLog);
} catch (MalformedURLException e) { } catch (MalformedURLException e) {

View File

@ -451,16 +451,28 @@ public class FileJournalManager implements JournalManager {
} }
public EditLogFile getLogFile(long startTxId) throws IOException { public EditLogFile getLogFile(long startTxId) throws IOException {
return getLogFile(sd.getCurrentDir(), startTxId); return getLogFile(sd.getCurrentDir(), startTxId, true);
} }
public EditLogFile getLogFile(long startTxId, boolean inProgressOk)
throws IOException {
return getLogFile(sd.getCurrentDir(), startTxId, inProgressOk);
}
public static EditLogFile getLogFile(File dir, long startTxId) public static EditLogFile getLogFile(File dir, long startTxId)
throws IOException { throws IOException {
return getLogFile(dir, startTxId, true);
}
public static EditLogFile getLogFile(File dir, long startTxId,
boolean inProgressOk) throws IOException {
List<EditLogFile> files = matchEditLogs(dir); List<EditLogFile> files = matchEditLogs(dir);
List<EditLogFile> ret = Lists.newLinkedList(); List<EditLogFile> ret = Lists.newLinkedList();
for (EditLogFile elf : files) { for (EditLogFile elf : files) {
if (elf.getFirstTxId() == startTxId) { if (elf.getFirstTxId() == startTxId) {
ret.add(elf); if (inProgressOk || !elf.isInProgress()) {
ret.add(elf);
}
} }
} }