HDFS-11877. FileJournalManager#getLogFile should ignore in progress edit logs during JN sync. Contributed by Hanisha Koneru.
This commit is contained in:
parent
a02b908e6a
commit
0646fb2fa5
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue