7575
7676import static org .apache .hadoop .hdfs .client .HdfsClientConfigKeys .DFS_CLIENT_EC_WRITE_ALLOW_END_BLOCKGROUP_INADVANCE ;
7777import static org .apache .hadoop .hdfs .client .HdfsClientConfigKeys .DFS_CLIENT_EC_WRITE_ALLOW_END_BLOCKGROUP_INADVANCE_DEFAULT ;
78+ import static org .apache .hadoop .hdfs .client .HdfsClientConfigKeys .DFS_CLIENT_EC_WRITE_MAX_END_BLOCKGROUP_INADVANCE_COUNT ;
79+ import static org .apache .hadoop .hdfs .client .HdfsClientConfigKeys .DFS_CLIENT_EC_WRITE_MAX_END_BLOCKGROUP_INADVANCE_COUNT_DEFAULT ;
7880import static org .apache .hadoop .hdfs .client .HdfsClientConfigKeys .Write .ECRedundancy .DFS_CLIENT_EC_WRITE_FAILED_BLOCKS_TOLERATED ;
7981import static org .apache .hadoop .hdfs .client .HdfsClientConfigKeys .Write .ECRedundancy .DFS_CLIENT_EC_WRITE_FAILED_BLOCKS_TOLERATED_DEFAILT ;
8082
@@ -289,6 +291,8 @@ private void flipDataBuffers() {
289291 private int blockGroupIndex ;
290292 private long datanodeRestartTimeout ;
291293 private final int failedBlocksTolerated ;
294+ private final int maxEndBlockGroupInAdvanceCount ;
295+ private int curEndBlockGroupInAdvanceCount ;
292296 private final boolean allowEndBlockGroupInAdvance ;
293297 private boolean endBlockGroupInAdvance ;
294298
@@ -342,6 +346,9 @@ private void flipDataBuffers() {
342346 allowEndBlockGroupInAdvance = dfsClient .getConfiguration ().getBoolean (
343347 DFS_CLIENT_EC_WRITE_ALLOW_END_BLOCKGROUP_INADVANCE ,
344348 DFS_CLIENT_EC_WRITE_ALLOW_END_BLOCKGROUP_INADVANCE_DEFAULT );
349+ maxEndBlockGroupInAdvanceCount = dfsClient .getConfiguration ().getInt (
350+ DFS_CLIENT_EC_WRITE_MAX_END_BLOCKGROUP_INADVANCE_COUNT ,
351+ DFS_CLIENT_EC_WRITE_MAX_END_BLOCKGROUP_INADVANCE_COUNT_DEFAULT );
345352 }
346353
347354 /** Construct a new output stream for appending to a file. */
@@ -577,12 +584,14 @@ private boolean shouldEndBlockGroup() {
577584 }
578585
579586 private boolean shouldEndBlockGroupInAdvance () {
580- if (!allowEndBlockGroupInAdvance ) {
587+ if (!allowEndBlockGroupInAdvance ||
588+ curEndBlockGroupInAdvanceCount > maxEndBlockGroupInAdvanceCount ) {
581589 return false ;
582590 }
583591 if (DFSClientFaultInjector .get ().mockEndBlockGroupInAdvance ()) {
584592 LOG .info ("Block group {} ends in advance." , currentBlockGroup );
585593 this .endBlockGroupInAdvance = true ;
594+ curEndBlockGroupInAdvanceCount ++;
586595 return true ;
587596 }
588597
@@ -594,6 +603,7 @@ private boolean shouldEndBlockGroupInAdvance() {
594603 if (overFailedStreamer && stripeFull ) {
595604 LOG .info ("Block group {} ends in advance." , currentBlockGroup );
596605 this .endBlockGroupInAdvance = true ;
606+ curEndBlockGroupInAdvanceCount ++;
597607 return true ;
598608 }
599609 return false ;
0 commit comments