📄 diskmanagerimpl.java
字号:
setState( FAULTY );
return( -1 );
}
}
fileInfo.setAccessMode( DiskManagerFileInfo.READ );
}catch (CacheFileManagerException e) {
this.errorMessage = Debug.getNestedExceptionMessage(e) +
" (allocateFiles existing:" + data_file.getAbsolutePath() + ")";
setState( FAULTY );
return( -1 );
}
allocated += target_length;
}else{ //we need to allocate it
//make sure it hasn't previously been allocated
if ( download_manager.isDataAlreadyAllocated() ){
this.errorMessage = "Data file missing: " + data_file.getAbsolutePath();
setState( FAULTY );
return( -1 );
}
while( started ){
if ( allocation_scheduler.getPermission( this )){
break;
}
}
if ( !started ){
// allocation interrupted
return( -1 );
}
try{
fileInfo.setAccessMode( DiskManagerFileInfo.WRITE );
if( COConfigurationManager.getBooleanParameter("Enable incremental file creation") ) {
// do incremental stuff
fileInfo.getCacheFile().setLength( 0 );
}else {
//fully allocate
if( COConfigurationManager.getBooleanParameter("XFS Allocation") ) {
fileInfo.getCacheFile().setLength( target_length );
String[] cmd = {"/usr/sbin/xfs_io","-c", "resvsp 0 " + target_length, data_file.getAbsolutePath()};
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
try {
Process p = Runtime.getRuntime().exec(cmd);
for (int count = p.getErrorStream().read(buffer); count > 0; count = p.getErrorStream().read(buffer)) {
os.write(buffer, 0, count);
}
os.close();
p.waitFor();
} catch (IOException e) {
String message = MessageText.getString("xfs.allocation.xfs_io.not.found", new String[] {e.getMessage()});
Logger.log(new LogAlert(LogAlert.UNREPEATABLE, LogAlert.AT_ERROR, message));
}
if (os.size() > 0) {
String message = os.toString().trim();
if (message.endsWith("is not on an XFS filesystem")) {
Logger.log(new LogEvent(LogIDs.DISK, "XFS file allocation impossible because \"" + data_file.getAbsolutePath()
+ "\" is not on an XFS filesystem. Original error reported by xfs_io : \"" + message + "\""));
} else {
throw new IOException(message);
}
}
allocated += target_length;
} else if( COConfigurationManager.getBooleanParameter("Zero New") ) { //zero fill
if ( !writer.zeroFile( fileInfo, target_length )) {
try{
// failed to zero it, delete it so it gets done next start
fileInfo.getCacheFile().close();
fileInfo.getCacheFile().delete();
}catch( Throwable e ){
}
setState( FAULTY );
return( -1 );
}
}else{
//reserve the full file size with the OS file system
fileInfo.getCacheFile().setLength( target_length );
allocated += target_length;
}
}
}catch ( Exception e ) {
this.errorMessage = Debug.getNestedExceptionMessage(e)
+ " (allocateFiles new:" + data_file.toString() + ")";
setState( FAULTY );
return( -1 );
}
numNewFiles++;
}
}
// make sure that "files" doens't become visible to the rest of the world until all
// entries have been populated
files = allocated_files;
loadFilePriorities();
download_manager.setDataAlreadyAllocated( true );
return( numNewFiles );
}finally{
allocation_scheduler.unregister( this );
// if we failed to do the allocation make sure we close all the files that
// we might have opened
if ( files == null ){
for (int i=0;i<allocated_files.length;i++){
if ( allocated_files[i] != null ){
try{
allocated_files[i].getCacheFile().close();
}catch( Throwable e ){
}
}
}
}
}
}
public DiskAccessController
getDiskAccessController()
{
return( disk_access_controller );
}
public void
enqueueReadRequest(
DiskManagerReadRequest request,
DiskManagerReadRequestListener listener )
{
reader.readBlock( request, listener );
}
public int
getNbPieces()
{
return nbPieces;
}
public int
getPercentDone()
{
return percentDone;
}
public void
setPercentDone(
int num )
{
percentDone = num;
}
public long
getRemaining() {
return remaining;
}
public long
getRemainingExcludingDND()
{
if ( skipped_file_set_changed ){
DiskManagerFileInfoImpl[] current_files = files;
if ( current_files != null ){
skipped_file_set_changed = false;
try{
file_piece_mon.enter();
skipped_file_set_size = 0;
skipped_but_downloaded = 0;
for (int i=0;i<current_files.length;i++){
DiskManagerFileInfoImpl file = current_files[i];
if ( file.isSkipped()){
skipped_file_set_size += file.getLength();
skipped_but_downloaded += file.getDownloaded();
}
}
}finally{
file_piece_mon.exit();
}
}
}
long rem = ( remaining - ( skipped_file_set_size - skipped_but_downloaded ));
if ( rem < 0 ){
rem = 0;
}
return( rem );
}
public long
getAllocated()
{
return( allocated );
}
public void
setAllocated(
long num )
{
allocated = num;
}
// called when status has CHANGED and should only be called by DiskManagerPieceImpl
protected void
setPieceDone(
DiskManagerPieceImpl dmPiece,
boolean done )
{
int piece_number =dmPiece.getPieceNumber();
int piece_length =dmPiece.getLength();
DMPieceList piece_list =pieceMap[piece_number];
try
{
file_piece_mon.enter();
if (dmPiece.isDone() !=done)
{
dmPiece.setDoneSupport(done);
if (done)
remaining -=piece_length;
else
remaining +=piece_length;
for (int i =0; i <piece_list.size(); i++)
{
DMPieceMapEntry piece_map_entry =piece_list.get(i);
DiskManagerFileInfoImpl this_file =piece_map_entry.getFile();
long file_length =this_file.getLength();
long file_done =this_file.getDownloaded();
long file_done_before =file_done;
if (done)
file_done +=piece_map_entry.getLength();
else
file_done -=piece_map_entry.getLength();
if (file_done <0)
{
Debug.out("piece map entry length negative");
file_done =0;
} else if (file_done >file_length)
{
Debug.out("piece map entry length too large");
file_done =file_length;
}
if (this_file.isSkipped())
{
skipped_but_downloaded +=(file_done -file_done_before);
}
this_file.setDownloaded(file_done);
// change file modes based on whether or not the file is complete or not
if (file_done ==file_length &&this_file.getAccessMode() ==DiskManagerFileInfo.WRITE)
{
try
{
this_file.setAccessMode(DiskManagerFileInfo.READ);
} catch (Exception e)
{
setFailed("Disk access error - " +Debug.getNestedExceptionMessage(e));
Debug.printStackTrace(e);
}
// note - we don't set the access mode to write if incomplete as we may
// be rechecking a file and during this process the "file_done" amount
// will not be file_length until the end. If the file is read-only then
// changing to write will cause trouble!
}
}
listeners.dispatch(LDT_PIECE_DONE_CHANGED, dmPiece);
}
} finally
{
file_piece_mon.exit();
}
}
public void
accessModeChanged(
DiskManagerFileInfoImpl file,
int old_mode,
int new_mode )
{
listeners.dispatch(
LDT_ACCESS_MODE_CHANGED,
new Object[]{ file, new Integer(old_mode), new Integer(new_mode)});
}
public DiskManagerPiece[] getPieces()
{
return pieces;
}
public DiskManagerPiece getPiece(int PieceNumber)
{
return pieces[PieceNumber];
}
public int getPieceLength() {
return pieceLength;
}
public long getTotalLength() {
return totalLength;
}
public int getLastPieceLength() {
return lastPieceLength;
}
public int getState() {
return state_set_via_method;
}
protected void
setState(
int _state )
{
// we never move from a faulty state
if ( state_set_via_method == FAULTY ){
if ( _state != FAULTY ){
Debug.out( "DiskManager: attempt to move from faulty state to " + _state );
}
return;
}
if ( state_set_via_method != _state ){
int params[] = {state_set_via_method, _state};
state_set_via_method = _state;
listeners.dispatch( LDT_STATECHANGED, params);
}
}
public DiskManagerFileInfo[]
getFiles()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -