From 615a023be3213eb5e14e0ef366a8780a07a4d807 Mon Sep 17 00:00:00 2001 From: Akira Ajisaka Date: Mon, 20 Jun 2016 17:07:26 +0900 Subject: [PATCH] HADOOP-13192. org.apache.hadoop.util.LineReader cannot handle multibyte delimiters correctly. Contributed by binde. (cherry picked from commit fc6b50cc574e144fd314dea6c11987c6a384bfa6) (cherry picked from commit 39ea0891d2b1369ec8c1ea4312489309e1a85227) --- .../org/apache/hadoop/util/LineReader.java | 5 +- .../apache/hadoop/util/TestLineReader.java | 61 ++++++++++++------- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/LineReader.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/LineReader.java index 153953d2736..e20a7c1084e 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/LineReader.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/LineReader.java @@ -318,7 +318,10 @@ private int readCustomLine(Text str, int maxLineLength, int maxBytesToConsume) break; } } else if (delPosn != 0) { - bufferPosn--; + bufferPosn -= delPosn; + if(bufferPosn < -1) { + bufferPosn = -1; + } delPosn = 0; } } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/TestLineReader.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/TestLineReader.java index 9d909bcebd0..52f8b9f6ef2 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/TestLineReader.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/TestLineReader.java @@ -58,7 +58,7 @@ public void testCustomDelimiter() throws Exception { * Check Condition * In the second key value pair, the value should contain * "" from next token + * "id>" from next token */ Delimiter=""; @@ -80,20 +80,21 @@ public void testCustomDelimiter() throws Exception { String TestPartOfInput = CurrentBufferTailToken+NextBufferHeadToken; int BufferSize=64 * 1024; - int numberOfCharToFillTheBuffer=BufferSize-CurrentBufferTailToken.length(); + int numberOfCharToFillTheBuffer = + BufferSize - CurrentBufferTailToken.length(); StringBuilder fillerString=new StringBuilder(); - for (int i=0;i