@@ -26,7 +26,7 @@ import (
26
26
// SeqFile 按最终修改时间依次读取文件的Reader类型
27
27
type SeqFile struct {
28
28
meta * reader.Meta
29
- mux sync.Mutex
29
+ mux * sync.RWMutex
30
30
31
31
name string
32
32
dir string // 文件目录
@@ -109,7 +109,7 @@ func NewSeqFile(meta *reader.Meta, path string, ignoreHidden, newFileNewLine boo
109
109
ignoreFileSuffix : suffixes ,
110
110
ignoreHidden : ignoreHidden ,
111
111
validFilePattern : validFileRegex ,
112
- mux : sync.Mutex {} ,
112
+ mux : new ( sync.RWMutex ) ,
113
113
newFileAsNewLine : newFileNewLine ,
114
114
meta : meta ,
115
115
inodeOffset : make (map [string ]int64 ),
@@ -499,13 +499,7 @@ func (sf *SeqFile) getNextFileCondition() (condition func(os.FileInfo) bool, err
499
499
if len (sf .inodeOffset ) < 1 {
500
500
return true
501
501
}
502
- var key string
503
- if sf .inodeSensitive {
504
- key = reader .JoinFileInode (f .Name (), strconv .FormatUint (inode , 10 ))
505
- } else {
506
- key = filepath .Base (f .Name ())
507
- }
508
- offset , ok := sf .inodeOffset [key ]
502
+ offset , ok := sf .inodeOffset [getInodeKey (f .Name (), inode , sf .inodeSensitive )]
509
503
return ! ok || (sf .ReadSameInode && offset != - 1 && f .Size () != offset )
510
504
}
511
505
@@ -624,13 +618,7 @@ func (sf *SeqFile) open(fi os.FileInfo) (err error) {
624
618
if sf .inodeOffset == nil {
625
619
sf .inodeOffset = make (map [string ]int64 )
626
620
}
627
- var key string
628
- if sf .inodeSensitive {
629
- key = reader .JoinFileInode (doneFile , strconv .FormatUint (doneFileInode , 10 ))
630
- } else {
631
- key = filepath .Base (doneFile )
632
- }
633
- sf .inodeOffset [key ] = doneFileOffset
621
+ sf .inodeOffset [getInodeKey (doneFile , doneFileInode , sf .inodeSensitive )] = doneFileOffset
634
622
tryTime := 0
635
623
for {
636
624
err := sf .meta .SyncDoneFileInode (sf .inodeOffset )
@@ -682,19 +670,8 @@ func (sf *SeqFile) SyncMeta() (err error) {
682
670
683
671
func (sf * SeqFile ) Lag () (rl * LagInfo , err error ) {
684
672
sf .mux .Lock ()
685
- rl = & LagInfo {Size : - sf .offset , SizeUnit : "bytes" }
686
- logReading := filepath .Base (sf .currFile )
687
- sf .mux .Unlock ()
688
-
689
- inode , err := utilsos .GetIdentifyIDByPath (sf .currFile )
690
- if os .IsNotExist (err ) || (inode != 0 && inode != sf .inode ) {
691
- rl .Size = 0
692
- err = nil
693
- }
694
- if err != nil {
695
- rl .Size = 0
696
- return rl , err
697
- }
673
+ defer sf .mux .Unlock ()
674
+ rl = & LagInfo {Size : 0 , SizeUnit : "bytes" }
698
675
699
676
logs , err := ReadDirByTime (sf .dir )
700
677
if err != nil {
@@ -705,13 +682,28 @@ func (sf *SeqFile) Lag() (rl *LagInfo, err error) {
705
682
if l .IsDir () {
706
683
continue
707
684
}
708
- if condition == nil || ! condition (l ) {
685
+
686
+ inode , err := utilsos .GetIdentifyIDByPath (filepath .Join (sf .dir , l .Name ()))
687
+ if os .IsNotExist (err ) || inode == 0 {
709
688
continue
710
689
}
711
- rl .Size += l .Size ()
712
- if l .Name () == logReading {
713
- break
690
+ if err != nil {
691
+ rl .Size = 0
692
+ return rl , err
693
+ }
694
+
695
+ if filepath .Base (sf .currFile ) == l .Name () {
696
+ if sf .inodeSensitive && sf .inode != inode {
697
+ rl .Size += l .Size ()
698
+ } else {
699
+ rl .Size += l .Size () - sf .offset
700
+ }
701
+ continue
714
702
}
703
+ if condition == nil || ! condition (l ) {
704
+ continue
705
+ }
706
+ rl .Size += l .Size () - sf .inodeOffset [getInodeKey (l .Name (), inode , sf .inodeSensitive )]
715
707
}
716
708
717
709
return rl , nil
@@ -750,13 +742,7 @@ func (sf *SeqFile) getOffset(f *os.File, offset int64, seek bool) int64 {
750
742
log .Errorf ("Runner[%s] NewSeqFile get file %s inode error %v, ignore..." , sf .meta .RunnerName , fileName , err )
751
743
return offset
752
744
}
753
- var key string
754
- if sf .inodeSensitive {
755
- key = reader .JoinFileInode (fileName , strconv .FormatUint (inode , 10 ))
756
- } else {
757
- key = filepath .Base (fileName )
758
- }
759
- offset = sf .inodeOffset [key ]
745
+ offset = sf .inodeOffset [getInodeKey (fileName , inode , sf .inodeSensitive )]
760
746
if fileInfo .Size () < offset {
761
747
offset = 0
762
748
}
@@ -769,6 +755,14 @@ func (sf *SeqFile) getOffset(f *os.File, offset int64, seek bool) int64 {
769
755
return offset
770
756
}
771
757
758
+ func getInodeKey (name string , inode uint64 , inodeSensitive bool ) string {
759
+ if inodeSensitive {
760
+ return reader .JoinFileInode (name , strconv .FormatUint (inode , 10 ))
761
+ } else {
762
+ return filepath .Base (name )
763
+ }
764
+ }
765
+
772
766
var (
773
767
_ LineSkipper = new (SeqFile )
774
768
_ reader.NewSourceRecorder = new (SeqFile )
0 commit comments