for (int i = 0; i < pieceList.size(); i++) {
DMPieceMapEntry piece_entry = pieceList.get(i);
DiskManagerFileInfoImpl file_info = piece_entry.getFile();
CacheFile cache_file = file_info.getCacheFile();
if ( cache_file.compareLength( piece_entry.getOffset()) < 0 ){
listener.checkCompleted( request, false );
return;
}
if ( all_compact ){
int st = cache_file.getStorageType();
if (( st != CacheFile.CT_COMPACT && st != CacheFile.CT_PIECE_REORDER_COMPACT ) || file_info.getNbPieces() <= 2 ){
all_compact = false;
}
}
}
if ( all_compact ){
// System.out.println( "Piece " + pieceNumber + " is all compact, failing hash check" );
listener.checkCompleted( request, false );
return;
}
}catch( Throwable e ){
// we can fail here if the disk manager has been stopped as the cache file length access may be being
// performed on a "closed" (i.e. un-owned) file
listener.checkCancelled( request );
return;
}
int this_piece_length = disk_manager.getPieceLength( pieceNumber );
DiskManagerReadRequest read_request = disk_manager.createReadRequest( pieceNumber, 0, this_piece_length );
try{
this_mon.enter();
if ( stopped ){
listener.checkCancelled( request );
return;
}
async_reads++;
}finally{
this_mon.exit();
}
read_request.setFlush( read_flush );
read_request.setUseCache( !request.isAdHoc());
disk_manager.enqueueReadRequest(
read_request,
new DiskManagerReadRequestListener()
{
public void
readCompleted(
DiskManagerReadRequest read_request,
DirectByteBuffer buffer )
{
complete();
try{
this_mon.enter();
if ( stopped ){
buffer.returnToPool();
listener.checkCancelled( request );
return;
}
async_checks++;
}finally{
this_mon.exit();
}
try{
final DirectByteBuffer f_buffer = buffer;
ConcurrentHasher.getSingleton().addRequest(
buffer.getBuffer(DirectByteBuffer.SS_DW),
new ConcurrentHasherRequestListener()
{
public void
complete(
ConcurrentHasherRequest hash_request )
{
int async_result = 3; // cancelled
try{
byte[] actual_hash = hash_request.getResult();
if ( actual_hash != null ){
request.setHash( actual_hash );
async_result = 1; // success
for (int i = 0; i < actual_hash.length; i++){
if ( actual_hash[i] != required_hash[i]){
async_result = 2; // failed;
break;
}
}
}
}finally{
try{
if ( async_result == 1 ){
try{
for (int i = 0; i < pieceList.size(); i++) {
DMPieceMapEntry piece_entry = pieceList.get(i);
DiskManagerFileInfoImpl file_info = piece_entry.getFile();
// edge case here for skipped zero length files that have been deleted
if ( file_info.getLength() > 0 || !file_info.isSkipped()){
CacheFile cache_file = file_info.getCacheFile();
cache_file.setPieceComplete( pieceNumber, f_buffer );
}
}
}catch( Throwable e ){