'Tries to read up to length bytes, but will often read fewer, since
a single call will not read across a block boundary.'

@require_open
def _read_in_block(self, length=DEFAULT_READ_SIZE):

    end_pos = min((self.pos + length), self._stat().length)
    if (end_pos == self.pos):
        return ''
    block = self._get_block(self.pos)
    assert _block_contains_pos(block, self.pos)
    assert (block.path == self.path)
    in_block_pos = (self.pos - block.startOffset)
    assert (in_block_pos >= 0)
    in_block_len = min(length, (block.numBytes - in_block_pos))
    result = self.fs._read_block(block, in_block_pos, in_block_len)
    self.pos += len(result)
    assert (self.pos <= end_pos)
    return result
