@ -23,24 +23,70 @@ namespace ROCKSDB_NAMESPACE {
// cache disabled) reads appropriately, and also updates the IO stats.
// cache disabled) reads appropriately, and also updates the IO stats.
class SequentialFileReader {
class SequentialFileReader {
private :
private :
# ifndef ROCKSDB_LITE
void NotifyOnFileReadFinish (
uint64_t offset , size_t length ,
const FileOperationInfo : : StartTimePoint & start_ts ,
const FileOperationInfo : : FinishTimePoint & finish_ts ,
const Status & status ) const {
FileOperationInfo info ( FileOperationType : : kRead , file_name_ , start_ts ,
finish_ts , status ) ;
info . offset = offset ;
info . length = length ;
for ( auto & listener : listeners_ ) {
listener - > OnFileReadFinish ( info ) ;
}
}
void AddFileIOListeners (
const std : : vector < std : : shared_ptr < EventListener > > & listeners ) {
std : : for_each ( listeners . begin ( ) , listeners . end ( ) ,
[ this ] ( const std : : shared_ptr < EventListener > & e ) {
if ( e - > ShouldBeNotifiedOnFileIO ( ) ) {
listeners_ . emplace_back ( e ) ;
}
} ) ;
}
# endif // ROCKSDB_LITE
bool ShouldNotifyListeners ( ) const { return ! listeners_ . empty ( ) ; }
std : : string file_name_ ;
std : : string file_name_ ;
FSSequentialFilePtr file_ ;
FSSequentialFilePtr file_ ;
std : : atomic < size_t > offset_ { 0 } ; // read offset
std : : atomic < size_t > offset_ { 0 } ; // read offset
std : : vector < std : : shared_ptr < EventListener > > listeners_ { } ;
public :
public :
explicit SequentialFileReader (
explicit SequentialFileReader (
std : : unique_ptr < FSSequentialFile > & & _file , const std : : string & _file_name ,
std : : unique_ptr < FSSequentialFile > & & _file , const std : : string & _file_name ,
const std : : shared_ptr < IOTracer > & io_tracer = nullptr )
const std : : shared_ptr < IOTracer > & io_tracer = nullptr ,
const std : : vector < std : : shared_ptr < EventListener > > & listeners = { } )
: file_name_ ( _file_name ) ,
: file_name_ ( _file_name ) ,
file_ ( std : : move ( _file ) , io_tracer , _file_name ) { }
file_ ( std : : move ( _file ) , io_tracer , _file_name ) ,
listeners_ ( ) {
# ifndef ROCKSDB_LITE
AddFileIOListeners ( listeners ) ;
# else
( void ) listeners ;
# endif
}
explicit SequentialFileReader (
explicit SequentialFileReader (
std : : unique_ptr < FSSequentialFile > & & _file , const std : : string & _file_name ,
std : : unique_ptr < FSSequentialFile > & & _file , const std : : string & _file_name ,
size_t _readahead_size ,
size_t _readahead_size ,
const std : : shared_ptr < IOTracer > & io_tracer = nullptr )
const std : : shared_ptr < IOTracer > & io_tracer = nullptr ,
const std : : vector < std : : shared_ptr < EventListener > > & listeners = { } )
: file_name_ ( _file_name ) ,
: file_name_ ( _file_name ) ,
file_ ( NewReadaheadSequentialFile ( std : : move ( _file ) , _readahead_size ) ,
file_ ( NewReadaheadSequentialFile ( std : : move ( _file ) , _readahead_size ) ,
io_tracer , _file_name ) { }
io_tracer , _file_name ) ,
listeners_ ( ) {
# ifndef ROCKSDB_LITE
AddFileIOListeners ( listeners ) ;
# else
( void ) listeners ;
# endif
}
static IOStatus Create ( const std : : shared_ptr < FileSystem > & fs ,
static IOStatus Create ( const std : : shared_ptr < FileSystem > & fs ,
const std : : string & fname , const FileOptions & file_opts ,
const std : : string & fname , const FileOptions & file_opts ,
std : : unique_ptr < SequentialFileReader > * reader ,
std : : unique_ptr < SequentialFileReader > * reader ,