Client write refactor

Rewriting how client writes out blocks to make it easier to add remote blocks.

The current design is as follows:

Users requests access to a block

```java
Block block = Blocks.createBlock(tachyonFS, blockId, blockCapacityByte);
```

From there, the user can write to it by accessing its `Channel`.

```java
WritableBlockChannel channel = block.write();
channel.write(byteBuffer);
channel.close();
```

When the block is full, write returns -1, so you do this in a loop and create new blocks.

```java
while (buffer.remaining() > 0) {
  int n = mCurrentBlockChannel.write(buffer);
  if (n <= 0) {
    // block full, get new block
    getNextBlock();
  }
}
```

There is still one bug that I am tracking down (TachyonFSTest.unlockBlockTest2 and TachyonFSTest.lockBlockTest2 are failing), but I think the design is good enough to share.
Current code doesn't handle direct.  Would be nice to make it off heap.
Will change if people are OK with style
On Sep 11, 2014 3:25 AM, "shimingfei" <notifications@github.com> wrote:

> In core/src/main/java/tachyon/client/FileOutStream.java:
>
> > -        mCurrentBlockLeftByte --;
> > -        mCachedBytes ++;
> > -      } catch (IOException e) {
> > -        if (mWriteType.isMustCache()) {
> > -          LOG.error(e.getMessage(), e);
> > -          throw new IOException("Fail to cache: " + mWriteType, e);
> > -        } else {
> > -          LOG.warn("Fail to cache for: ", e);
> > -        }
> > -      }
> > -    }
> > -
> > -    if (mWriteType.isThrough()) {
> > -      mCheckpointOutputStream.write(b);
> > -    }
> > +    ByteBuffer buffer = ByteBuffer.allocate(1);
>
> maybe ByteBuffer.allocateDirect is better ?
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/amplab/tachyon/pull/427/files#r17413918>.
>