HDFS-5519. COMMIT handler should update the commit status after sync. Contributed by Brandon Li

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1542437 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Brandon Li 2013-11-16 00:57:26 +00:00
parent f7efa0b86e
commit a2200a6417
3 changed files with 14 additions and 3 deletions

View File

@ -726,6 +726,7 @@ public COMMIT_STATUS checkCommit(DFSClient dfsClient, long commitOffset,
try { try {
// Sync file data and length // Sync file data and length
fos.hsync(EnumSet.of(SyncFlag.UPDATE_LENGTH)); fos.hsync(EnumSet.of(SyncFlag.UPDATE_LENGTH));
ret = COMMIT_STATUS.COMMIT_FINISHED; // Remove COMMIT_DO_SYNC status
// Nothing to do for metadata since attr related change is pass-through // Nothing to do for metadata since attr related change is pass-through
} catch (ClosedChannelException cce) { } catch (ClosedChannelException cce) {
if (pendingWrites.isEmpty()) { if (pendingWrites.isEmpty()) {
@ -747,7 +748,8 @@ public COMMIT_STATUS checkCommit(DFSClient dfsClient, long commitOffset,
* return one commit status: COMMIT_FINISHED, COMMIT_WAIT, * return one commit status: COMMIT_FINISHED, COMMIT_WAIT,
* COMMIT_INACTIVE_CTX, COMMIT_INACTIVE_WITH_PENDING_WRITE, COMMIT_ERROR * COMMIT_INACTIVE_CTX, COMMIT_INACTIVE_WITH_PENDING_WRITE, COMMIT_ERROR
*/ */
private synchronized COMMIT_STATUS checkCommitInternal(long commitOffset, @VisibleForTesting
synchronized COMMIT_STATUS checkCommitInternal(long commitOffset,
Channel channel, int xid, Nfs3FileAttributes preOpAttr) { Channel channel, int xid, Nfs3FileAttributes preOpAttr) {
if (!activeState) { if (!activeState) {
if (pendingWrites.isEmpty()) { if (pendingWrites.isEmpty()) {

View File

@ -150,10 +150,16 @@ public void testCheckCommit() throws IOException {
// Test request with non zero commit offset // Test request with non zero commit offset
ctx.setActiveStatusForTest(true); ctx.setActiveStatusForTest(true);
Mockito.when(fos.getPos()).thenReturn((long) 10); Mockito.when(fos.getPos()).thenReturn((long) 10);
COMMIT_STATUS status = ctx.checkCommitInternal(5, null, 1, attr);
Assert.assertTrue(status == COMMIT_STATUS.COMMIT_DO_SYNC);
// Do_SYNC state will be updated to FINISHED after data sync
ret = ctx.checkCommit(dfsClient, 5, null, 1, attr); ret = ctx.checkCommit(dfsClient, 5, null, 1, attr);
Assert.assertTrue(ret == COMMIT_STATUS.COMMIT_DO_SYNC); Assert.assertTrue(ret == COMMIT_STATUS.COMMIT_FINISHED);
status = ctx.checkCommitInternal(10, null, 1, attr);
Assert.assertTrue(status == COMMIT_STATUS.COMMIT_DO_SYNC);
ret = ctx.checkCommit(dfsClient, 10, null, 1, attr); ret = ctx.checkCommit(dfsClient, 10, null, 1, attr);
Assert.assertTrue(ret == COMMIT_STATUS.COMMIT_DO_SYNC); Assert.assertTrue(ret == COMMIT_STATUS.COMMIT_FINISHED);
ConcurrentNavigableMap<Long, CommitCtx> commits = ctx ConcurrentNavigableMap<Long, CommitCtx> commits = ctx
.getPendingCommitsForTest(); .getPendingCommitsForTest();

View File

@ -661,6 +661,9 @@ Release 2.2.1 - UNRELEASED
HDFS-5469. Add configuration property for the sub-directroy export path HDFS-5469. Add configuration property for the sub-directroy export path
(brandonli) (brandonli)
HDFS-5519. COMMIT handler should update the commit status after sync
(brandonli)
Release 2.2.0 - 2013-10-13 Release 2.2.0 - 2013-10-13
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES