John Doe created HADOOP-15429: --------------------------------- Summary: unsynchronized index causes DataInputByteBuffer$Buffer.read hangs Key: HADOOP-15429 URL: https://issues.apache.org/jira/browse/HADOOP-15429 Project: Hadoop Common Issue Type: Bug Components: io Affects Versions: 0.23.0 Reporter: John Doe
In DataInputByteBuffer$Buffer class, the fields bidx and buffers, etc are unsynchronized when used in read() and reset() function. In certain circumstances, e.g., the reset() is invoked in a loop, the unsynchronized bidx and buffers triggers a concurrency bug. Here is the code snippet. {code:java} ByteBuffer[] buffers = new ByteBuffer[0]; int bidx, pos, length; @Override public int read(byte[] b, int off, int len) { if (bidx >= buffers.length) { return -1; } int cur = 0; do { int rem = Math.min(len, buffers[bidx].remaining()); buffers[bidx].get(b, off, rem); cur += rem; off += rem; len -= rem; } while (len > 0 && ++bidx < buffers.length); //bidx is unsynchronized pos += cur; return cur; } public void reset(ByteBuffer[] buffers) {//if one thread keeps calling reset() in a loop bidx = pos = length = 0; this.buffers = buffers; for (ByteBuffer b : buffers) { length += b.remaining(); } } {code} -- This message was sent by Atlassian JIRA (v7.6.3#76005) --------------------------------------------------------------------- To unsubscribe, e-mail: common-dev-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-dev-h...@hadoop.apache.org