@@ -49,14 +49,12 @@ type SeqFile struct {
4949 SkipFileFirstLine bool //跳过新文件的第一行,常用于带title的csv文件,title与实际格式不同
5050 hasSkiped bool
5151
52- inodeOffset map [string ]int64 //记录filename_inode是否已经读过
53- inodeSensitive bool // 是否以inode信息作为 inodeDone 和 expireMap 的key值
52+ inodeOffset map [string ]int64 //记录filename_inode是否已经读过
53+ inodeSensitive bool // 是否以inode信息作为 inodeDone 和 inodeOffset 的key值
5454
5555 lastSyncPath string
5656 lastSyncOffset int64
5757
58- expireMap map [string ]int64
59-
6058 ReadSameInode bool //记录已经读过的filename_inode是否继续读
6159}
6260
@@ -106,7 +104,7 @@ func getStartFile(path, whence string, meta *reader.Meta, sf *SeqFile) (f *os.Fi
106104 return
107105}
108106
109- func NewSeqFile (meta * reader.Meta , path string , ignoreHidden , newFileNewLine bool , suffixes []string , validFileRegex , whence string , expireMap map [ string ] int64 , inodeSensitive bool ) (sf * SeqFile , err error ) {
107+ func NewSeqFile (meta * reader.Meta , path string , ignoreHidden , newFileNewLine bool , suffixes []string , validFileRegex , whence string , inodeSensitive bool ) (sf * SeqFile , err error ) {
110108 sf = & SeqFile {
111109 ignoreFileSuffix : suffixes ,
112110 ignoreHidden : ignoreHidden ,
@@ -115,7 +113,6 @@ func NewSeqFile(meta *reader.Meta, path string, ignoreHidden, newFileNewLine boo
115113 newFileAsNewLine : newFileNewLine ,
116114 meta : meta ,
117115 inodeOffset : make (map [string ]int64 ),
118- expireMap : expireMap ,
119116 inodeSensitive : inodeSensitive ,
120117 }
121118 //原来的for循环替换成单次执行,启动的时候出错就直接报错给用户即可,不需要等待重试。
@@ -465,7 +462,7 @@ func (sf *SeqFile) getNextFileCondition() (condition func(os.FileInfo) bool, err
465462 key = filepath .Base (f .Name ())
466463 }
467464 offset , ok := sf .inodeOffset [key ]
468- return ! ok || (sf .ReadSameInode && offset != - 1 && f .Size () != offset )
465+ return ! ok || (sf .ReadSameInode && offset != - 1 && f .Size () != offset )
469466 }
470467
471468 condition = reader .AndCondition (reader .AndCondition (newerThanCurrFile , sf .getIgnoreCondition ()), isNewFile )
@@ -582,7 +579,7 @@ func (sf *SeqFile) open(fi os.FileInfo) (err error) {
582579 log .Warnf ("Runner[%v] os.Open %s: %v" , sf .meta .RunnerName , fname , err )
583580 return err
584581 }
585- sf . f = f
582+
586583 //开新的之前关掉老的
587584 if sf .ratereader != nil {
588585 sf .ratereader .Close ()
@@ -593,6 +590,7 @@ func (sf *SeqFile) open(fi os.FileInfo) (err error) {
593590 sf .ratereader = f
594591 }
595592 sf .offset = sf .getOffset (f , 0 , true )
593+ sf .f = f
596594 sf .inode , err = utilsos .GetIdentifyIDByPath (sf .currFile )
597595 if err != nil {
598596 return err
@@ -610,7 +608,7 @@ func (sf *SeqFile) open(fi os.FileInfo) (err error) {
610608 sf .inodeOffset [key ] = doneFileOffset
611609 tryTime := 0
612610 for {
613- err := sf .meta .AppendDoneFileInode ( doneFile , doneFileInode , doneFileOffset )
611+ err := sf .meta .SyncDoneFileInode ( sf . inodeOffset )
614612 if err != nil {
615613 if tryTime > 3 {
616614 log .Errorf ("Runner[%v] cannot write done file %s, err:%v, ignore this noefi" , sf .meta .RunnerName , doneFile , err )
@@ -692,59 +690,41 @@ type LineSkipper interface {
692690}
693691
694692func (sf * SeqFile ) getOffset (f * os.File , offset int64 , seek bool ) int64 {
695- if len (sf .expireMap ) == 0 || offset != 0 || f == nil {
693+ if len (sf .inodeOffset ) == 0 || offset != 0 || f == nil {
696694 return offset
697695 }
698696
699- if sf .meta .IsExist () {
700- deleteNotExist (filepath .Dir (f .Name ()), sf .expireMap , sf .inodeSensitive )
697+ fileName := f .Name ()
698+ fileInfo , err := f .Stat ()
699+ if err != nil {
700+ log .Errorf ("Runner[%s] NewSeqFile get file %s info error %v, ignore..." , sf .meta .RunnerName , fileName , err )
701701 return offset
702702 }
703703
704- fileName := f .Name ()
705704 inode , err := utilsos .GetIdentifyIDByPath (fileName )
706705 if err != nil {
707706 log .Errorf ("Runner[%s] NewSeqFile get file %s inode error %v, ignore..." , sf .meta .RunnerName , fileName , err )
708707 return offset
709708 }
710- inodeStr := strconv . FormatUint ( inode , 10 )
709+ var key string
711710 if sf .inodeSensitive {
712- offset = sf . expireMap [ inodeStr + "_" + fileName ]
711+ key = reader . JoinFileInode ( fileName , strconv . FormatUint ( inode , 10 ))
713712 } else {
714- offset = sf .expireMap [fileName ]
713+ key = filepath .Base (fileName )
714+ }
715+ offset = sf .inodeOffset [key ]
716+ if fileInfo .Size () < offset {
717+ offset = 0
715718 }
716719 if seek {
717- _ , err = f .Seek (sf . offset , io .SeekStart )
720+ _ , err = f .Seek (offset , io .SeekStart )
718721 if err != nil {
719722 log .Errorf ("Runner[%s] file: %s seek offset: %d failed: %v" , sf .meta .RunnerName , f .Name (), sf .offset , err )
720723 }
721724 }
722725 return offset
723726}
724727
725- func deleteNotExist (dir string , expireMap map [string ]int64 , inodeSensitive bool ) {
726- if dir == "" {
727- return
728- }
729- var arr []string
730- for inodeFile := range expireMap {
731- if inodeSensitive {
732- arr = strings .SplitN (inodeFile , "_" , 2 )
733- if len (arr ) < 2 {
734- continue
735- }
736- if filepath .Dir (arr [1 ]) != dir {
737- continue
738- }
739- } else {
740- if filepath .Dir (inodeFile ) != dir {
741- continue
742- }
743- }
744- delete (expireMap , inodeFile )
745- }
746- }
747-
748728var (
749729 _ LineSkipper = new (SeqFile )
750730 _ reader.NewSourceRecorder = new (SeqFile )
0 commit comments