code: @Override
  	protected void readDataBlock(byte[] data, int offset, int len, int blockHandle) throws DataStoreException
      {
      	byte[] dirtyBlock = dirtyBlockTable.get(blockHandle);
      	if (dirtyBlock != null)
      	{
      		// Copy data from memory-cached dirty block
      		System.arraycopy(dirtyBlock, 0, data, offset, len);
      	}
      	else
      	{
      		try
      		{
      			long dataOffset = (long)blockHandle*blockSize;
      			
  	    		// Make sure we do not conflict with another async operation
  	    		synchronized (dataRandomAccessFile)
  				{
  			        dataRandomAccessFile.seek(dataOffset);
  			        if (dataRandomAccessFile.read(data,offset,len) != len)
  			            throw new DataStoreException("Cannot read "+len+" bytes from store file");
  				}
      		}
      		catch (DataStoreException e)
      		{
      		    throw e;
      		}
              catch (IOException e)
              {
                  throw new DataStoreException("Could not read data block "+blockHandle,e);
              }
      	}
      }
docs: /*
  (non-Javadoc)
  @see net.timewalker.ffmq4.storage.data.impl.AbstractBlockBasedDataStore#readDataBlock(byte[], int, int, int)