mirror of https://github.com/aria2/aria2
Added new file allocation method called 'trunc'
--file-allocation option can now take new value 'trunc'. 'trunc' uses ftruncate() system call or platform-specific counterpart to truncate a file to a specified length.pull/25/merge
parent
e2fcd6d72c
commit
d734ff7d29
|
@ -1078,7 +1078,11 @@ Advanced Options
|
||||||
entirely until allocation finishes. ``falloc`` may
|
entirely until allocation finishes. ``falloc`` may
|
||||||
not be available if your system doesn't have
|
not be available if your system doesn't have
|
||||||
:manpage:`posix_fallocate(3)` function.
|
:manpage:`posix_fallocate(3)` function.
|
||||||
Possible Values: ``none``, ``prealloc``, ``falloc``
|
``trunc`` uses :manpage:`ftruncate(2)` system call or
|
||||||
|
platform-specific counterpart to truncate a file to a specified
|
||||||
|
length.
|
||||||
|
|
||||||
|
Possible Values: ``none``, ``prealloc``, ``trunc``, ``falloc``
|
||||||
Default: ``prealloc``
|
Default: ``prealloc``
|
||||||
|
|
||||||
.. option:: --hash-check-only[=true|false]
|
.. option:: --hash-check-only[=true|false]
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "AdaptiveFileAllocationIterator.h"
|
#include "AdaptiveFileAllocationIterator.h"
|
||||||
#include "DiskWriter.h"
|
#include "DiskWriter.h"
|
||||||
#include "FileEntry.h"
|
#include "FileEntry.h"
|
||||||
|
#include "TruncFileAllocationIterator.h"
|
||||||
#ifdef HAVE_SOME_FALLOCATE
|
#ifdef HAVE_SOME_FALLOCATE
|
||||||
# include "FallocFileAllocationIterator.h"
|
# include "FallocFileAllocationIterator.h"
|
||||||
#endif // HAVE_SOME_FALLOCATE
|
#endif // HAVE_SOME_FALLOCATE
|
||||||
|
@ -107,6 +108,12 @@ AbstractSingleDiskAdaptor::fileAllocationIterator()
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
#endif // HAVE_SOME_FALLOCATE
|
#endif // HAVE_SOME_FALLOCATE
|
||||||
|
case(DiskAdaptor::FILE_ALLOC_TRUNC): {
|
||||||
|
SharedHandle<TruncFileAllocationIterator> h
|
||||||
|
(new TruncFileAllocationIterator
|
||||||
|
(diskWriter_.get(), size(), totalLength_));
|
||||||
|
return h;
|
||||||
|
}
|
||||||
default: {
|
default: {
|
||||||
SharedHandle<AdaptiveFileAllocationIterator> h
|
SharedHandle<AdaptiveFileAllocationIterator> h
|
||||||
(new AdaptiveFileAllocationIterator
|
(new AdaptiveFileAllocationIterator
|
||||||
|
|
|
@ -635,6 +635,8 @@ void DefaultPieceStorage::initStorage()
|
||||||
}
|
}
|
||||||
if(option_->get(PREF_FILE_ALLOCATION) == V_FALLOC) {
|
if(option_->get(PREF_FILE_ALLOCATION) == V_FALLOC) {
|
||||||
diskAdaptor_->setFileAllocationMethod(DiskAdaptor::FILE_ALLOC_FALLOC);
|
diskAdaptor_->setFileAllocationMethod(DiskAdaptor::FILE_ALLOC_FALLOC);
|
||||||
|
} else if(option_->get(PREF_FILE_ALLOCATION) == V_TRUNC) {
|
||||||
|
diskAdaptor_->setFileAllocationMethod(DiskAdaptor::FILE_ALLOC_TRUNC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,8 @@ class DiskAdaptor:public BinaryStream {
|
||||||
public:
|
public:
|
||||||
enum FileAllocationMethod {
|
enum FileAllocationMethod {
|
||||||
FILE_ALLOC_ADAPTIVE,
|
FILE_ALLOC_ADAPTIVE,
|
||||||
FILE_ALLOC_FALLOC
|
FILE_ALLOC_FALLOC,
|
||||||
|
FILE_ALLOC_TRUNC
|
||||||
};
|
};
|
||||||
|
|
||||||
DiskAdaptor();
|
DiskAdaptor();
|
||||||
|
|
|
@ -192,6 +192,7 @@ SRCS = Socket.h\
|
||||||
ContextAttribute.h\
|
ContextAttribute.h\
|
||||||
TorrentAttribute.cc TorrentAttribute.h\
|
TorrentAttribute.cc TorrentAttribute.h\
|
||||||
AdaptiveFileAllocationIterator.cc AdaptiveFileAllocationIterator.h\
|
AdaptiveFileAllocationIterator.cc AdaptiveFileAllocationIterator.h\
|
||||||
|
TruncFileAllocationIterator.cc TruncFileAllocationIterator.h\
|
||||||
StreamFilter.cc StreamFilter.h\
|
StreamFilter.cc StreamFilter.h\
|
||||||
SinkStreamFilter.cc SinkStreamFilter.h\
|
SinkStreamFilter.cc SinkStreamFilter.h\
|
||||||
ChunkedDecodingStreamFilter.cc ChunkedDecodingStreamFilter.h\
|
ChunkedDecodingStreamFilter.cc ChunkedDecodingStreamFilter.h\
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "MultiDiskAdaptor.h"
|
#include "MultiDiskAdaptor.h"
|
||||||
#include "FileEntry.h"
|
#include "FileEntry.h"
|
||||||
#include "AdaptiveFileAllocationIterator.h"
|
#include "AdaptiveFileAllocationIterator.h"
|
||||||
|
#include "TruncFileAllocationIterator.h"
|
||||||
#ifdef HAVE_SOME_FALLOCATE
|
#ifdef HAVE_SOME_FALLOCATE
|
||||||
# include "FallocFileAllocationIterator.h"
|
# include "FallocFileAllocationIterator.h"
|
||||||
#endif // HAVE_SOME_FALLOCATE
|
#endif // HAVE_SOME_FALLOCATE
|
||||||
|
@ -76,6 +77,12 @@ void MultiFileAllocationIterator::allocateChunk()
|
||||||
fileEntry->getLength()));
|
fileEntry->getLength()));
|
||||||
break;
|
break;
|
||||||
#endif // HAVE_SOME_FALLOCATE
|
#endif // HAVE_SOME_FALLOCATE
|
||||||
|
case(DiskAdaptor::FILE_ALLOC_TRUNC):
|
||||||
|
fileAllocationIterator_.reset
|
||||||
|
(new TruncFileAllocationIterator(entry->getDiskWriter().get(),
|
||||||
|
entry->size(),
|
||||||
|
fileEntry->getLength()));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fileAllocationIterator_.reset
|
fileAllocationIterator_.reset
|
||||||
(new AdaptiveFileAllocationIterator(entry->getDiskWriter().get(),
|
(new AdaptiveFileAllocationIterator(entry->getDiskWriter().get(),
|
||||||
|
|
|
@ -354,14 +354,17 @@ OptionHandlerFactory::createOptionHandlers()
|
||||||
handlers.push_back(op);
|
handlers.push_back(op);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
const std::string params[] = { V_NONE, V_PREALLOC, V_TRUNC,
|
||||||
|
#ifdef HAVE_SOME_FALLOCATE
|
||||||
|
V_FALLOC
|
||||||
|
#endif // HAVE_SOME_FALLOCATE
|
||||||
|
};
|
||||||
SharedHandle<OptionHandler> op(new ParameterOptionHandler
|
SharedHandle<OptionHandler> op(new ParameterOptionHandler
|
||||||
(PREF_FILE_ALLOCATION,
|
(PREF_FILE_ALLOCATION,
|
||||||
TEXT_FILE_ALLOCATION,
|
TEXT_FILE_ALLOCATION,
|
||||||
V_PREALLOC,
|
V_PREALLOC,
|
||||||
V_NONE, V_PREALLOC,
|
std::vector<std::string>
|
||||||
#ifdef HAVE_SOME_FALLOCATE
|
(vbegin(params), vend(params)),
|
||||||
V_FALLOC,
|
|
||||||
#endif // HAVE_SOME_FALLOCATE
|
|
||||||
'a'));
|
'a'));
|
||||||
op->addTag(TAG_BASIC);
|
op->addTag(TAG_BASIC);
|
||||||
op->addTag(TAG_FILE);
|
op->addTag(TAG_FILE);
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
/* <!-- copyright */
|
||||||
|
/*
|
||||||
|
* aria2 - The high speed download utility
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Tatsuhiro Tsujikawa
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give
|
||||||
|
* permission to link the code of portions of this program with the
|
||||||
|
* OpenSSL library under certain conditions as described in each
|
||||||
|
* individual source file, and distribute linked combinations
|
||||||
|
* including the two.
|
||||||
|
* You must obey the GNU General Public License in all respects
|
||||||
|
* for all of the code used other than OpenSSL. If you modify
|
||||||
|
* file(s) with this exception, you may extend this exception to your
|
||||||
|
* version of the file(s), but you are not obligated to do so. If you
|
||||||
|
* do not wish to do so, delete this exception statement from your
|
||||||
|
* version. If you delete this exception statement from all source
|
||||||
|
* files in the program, then also delete it here.
|
||||||
|
*/
|
||||||
|
/* copyright --> */
|
||||||
|
#include "TruncFileAllocationIterator.h"
|
||||||
|
#include "DlAbortEx.h"
|
||||||
|
|
||||||
|
namespace aria2 {
|
||||||
|
|
||||||
|
TruncFileAllocationIterator::TruncFileAllocationIterator
|
||||||
|
(BinaryStream* stream, int64_t offset, int64_t totalLength)
|
||||||
|
: stream_(stream),
|
||||||
|
offset_(offset),
|
||||||
|
totalLength_(totalLength)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void TruncFileAllocationIterator::allocateChunk()
|
||||||
|
{
|
||||||
|
stream_->truncate(totalLength_);
|
||||||
|
offset_ = totalLength_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TruncFileAllocationIterator::finished()
|
||||||
|
{
|
||||||
|
return offset_ == totalLength_;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t TruncFileAllocationIterator::getCurrentLength()
|
||||||
|
{
|
||||||
|
return offset_;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t TruncFileAllocationIterator::getTotalLength()
|
||||||
|
{
|
||||||
|
return totalLength_;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace aria2
|
|
@ -0,0 +1,66 @@
|
||||||
|
/* <!-- copyright */
|
||||||
|
/*
|
||||||
|
* aria2 - The high speed download utility
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Tatsuhiro Tsujikawa
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give
|
||||||
|
* permission to link the code of portions of this program with the
|
||||||
|
* OpenSSL library under certain conditions as described in each
|
||||||
|
* individual source file, and distribute linked combinations
|
||||||
|
* including the two.
|
||||||
|
* You must obey the GNU General Public License in all respects
|
||||||
|
* for all of the code used other than OpenSSL. If you modify
|
||||||
|
* file(s) with this exception, you may extend this exception to your
|
||||||
|
* version of the file(s), but you are not obligated to do so. If you
|
||||||
|
* do not wish to do so, delete this exception statement from your
|
||||||
|
* version. If you delete this exception statement from all source
|
||||||
|
* files in the program, then also delete it here.
|
||||||
|
*/
|
||||||
|
/* copyright --> */
|
||||||
|
#ifndef D_TRUNC_FILE_ALLOCATION_ITERATOR_H
|
||||||
|
#define D_TRUNC_FILE_ALLOCATION_ITERATOR_H
|
||||||
|
|
||||||
|
#include "FileAllocationIterator.h"
|
||||||
|
#include "BinaryStream.h"
|
||||||
|
|
||||||
|
namespace aria2 {
|
||||||
|
|
||||||
|
// Use ftruncate() system call or platform-specific counterpart to set
|
||||||
|
// file length. This allocator may not allocate file space, it just
|
||||||
|
// changes file length information.
|
||||||
|
class TruncFileAllocationIterator:public FileAllocationIterator {
|
||||||
|
private:
|
||||||
|
BinaryStream* stream_;
|
||||||
|
int64_t offset_;
|
||||||
|
int64_t totalLength_;
|
||||||
|
public:
|
||||||
|
TruncFileAllocationIterator(BinaryStream* stream, int64_t offset,
|
||||||
|
int64_t totalLength);
|
||||||
|
|
||||||
|
virtual void allocateChunk();
|
||||||
|
|
||||||
|
virtual bool finished();
|
||||||
|
|
||||||
|
virtual int64_t getCurrentLength();
|
||||||
|
|
||||||
|
virtual int64_t getTotalLength();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace aria2
|
||||||
|
|
||||||
|
#endif // D_TRUNC_FILE_ALLOCATION_ITERATOR_H
|
|
@ -132,6 +132,7 @@ const std::string A2_V_FULL("full");
|
||||||
const std::string A2_V_GEOM("geom");
|
const std::string A2_V_GEOM("geom");
|
||||||
const std::string V_PREALLOC("prealloc");
|
const std::string V_PREALLOC("prealloc");
|
||||||
const std::string V_FALLOC("falloc");
|
const std::string V_FALLOC("falloc");
|
||||||
|
const std::string V_TRUNC("trunc");
|
||||||
const std::string V_DEBUG("debug");
|
const std::string V_DEBUG("debug");
|
||||||
const std::string V_INFO("info");
|
const std::string V_INFO("info");
|
||||||
const std::string V_NOTICE("notice");
|
const std::string V_NOTICE("notice");
|
||||||
|
|
|
@ -75,6 +75,7 @@ extern const std::string A2_V_FULL;
|
||||||
extern const std::string A2_V_GEOM;
|
extern const std::string A2_V_GEOM;
|
||||||
extern const std::string V_PREALLOC;
|
extern const std::string V_PREALLOC;
|
||||||
extern const std::string V_FALLOC;
|
extern const std::string V_FALLOC;
|
||||||
|
extern const std::string V_TRUNC;
|
||||||
extern const std::string V_DEBUG;
|
extern const std::string V_DEBUG;
|
||||||
extern const std::string V_INFO;
|
extern const std::string V_INFO;
|
||||||
extern const std::string V_NOTICE;
|
extern const std::string V_NOTICE;
|
||||||
|
|
|
@ -137,7 +137,10 @@
|
||||||
" takes almost same time as 'prealloc' and it\n" \
|
" takes almost same time as 'prealloc' and it\n" \
|
||||||
" blocks aria2 entirely until allocation finishes.\n" \
|
" blocks aria2 entirely until allocation finishes.\n" \
|
||||||
" 'falloc' may not be available if your system\n" \
|
" 'falloc' may not be available if your system\n" \
|
||||||
" doesn't have posix_fallocate() function.")
|
" doesn't have posix_fallocate() function.\n" \
|
||||||
|
" 'trunc' uses ftruncate() system call or\n" \
|
||||||
|
" platform-specific counterpart to truncate a file\n" \
|
||||||
|
" to a specified length.")
|
||||||
#define TEXT_NO_FILE_ALLOCATION_LIMIT \
|
#define TEXT_NO_FILE_ALLOCATION_LIMIT \
|
||||||
_(" --no-file-allocation-limit=SIZE No file allocation is made for files whose\n" \
|
_(" --no-file-allocation-limit=SIZE No file allocation is made for files whose\n" \
|
||||||
" size is smaller than SIZE.\n" \
|
" size is smaller than SIZE.\n" \
|
||||||
|
|
Loading…
Reference in New Issue