@@ -27,16 +27,14 @@ type File struct {
2727 name string
2828 cursor int64
2929
30- locker * sync.RWMutex
31- stat fs.FileInfo
30+ statusInit * sync.Once
31+ stat fs.FileInfo
3232
33- readerInit * sync.Once
34- readerInitErr error
35- reader net.Conn
33+ readerInit * sync.Once
34+ reader net.Conn
3635
37- writerInit * sync.Once
38- writerInitErr error
39- writer net.Conn
36+ writerInit * sync.Once
37+ writer net.Conn
4038
4139 no uint64
4240}
@@ -58,7 +56,7 @@ func OpenFile(c *Client, filename string) *File {
5856 c : c ,
5957 name : filename ,
6058
61- locker : & sync.RWMutex {},
59+ statusInit : & sync.Once {},
6260 readerInit : & sync.Once {},
6361 writerInit : & sync.Once {},
6462 }
@@ -71,7 +69,7 @@ func (f *File) Close() error {
7169 f .reader .Close ()
7270 }
7371 if f .writer != nil {
74- defer f .c .statsLocker .Delete (f .name )
72+ defer f .c .statsCache .Delete (f .name )
7573 f .writer .Close ()
7674 time .Sleep (200 * time .Millisecond ) //等200ms, 让dd把末尾的输入内容写入到文件内
7775 }
@@ -88,19 +86,21 @@ func (f *File) Read(p []byte) (n int, err error) {
8886 err0 .Record (& err , span )
8987 })
9088
91- stat := To1 (f .Stat ())
89+ stat := To1 (f ._Stat ())
9290 if stat .IsDir () {
9391 return 0 , io .EOF
9492 }
9593 f .readerInit .Do (func () {
9694 cmd := fmt .Sprintf ("dd if=%s skip=%d" , shellescape .Quote (f .name ), f .cursor )
9795 cmd = fmt .Sprintf ("%s %s" , cmd , "iflag=skip_bytes" )
98- f .reader , f . readerInitErr = f .c .Exec (cmd )
96+ f .reader , err = f .c .Exec (cmd )
9997 })
100- if f . readerInitErr != nil {
101- err = f . readerInitErr
98+ if err != nil {
99+ f . readerInit = & sync. Once {}
102100 return
103101 }
102+ f .reader .SetReadDeadline (time .Now ().Add (5 * time .Second ))
103+ defer f .reader .SetReadDeadline (time.Time {})
104104 n , err = f .reader .Read (p )
105105 f .cursor += int64 (n )
106106 return
@@ -114,12 +114,14 @@ func (f *File) Write(p []byte) (n int, err error) {
114114 f .writerInit .Do (func () {
115115 cmd := fmt .Sprintf ("dd of=%s seek=%d" , shellescape .Quote (f .name ), f .cursor )
116116 cmd = fmt .Sprintf ("%s %s" , cmd , "oflag=seek_bytes" )
117- f .writer , f . writerInitErr = f .c .Exec (cmd )
117+ f .writer , err = f .c .Exec (cmd )
118118 })
119- if f . writerInitErr != nil {
120- err = f . writerInitErr
119+ if err != nil {
120+ f . writerInit = & sync. Once {}
121121 return
122122 }
123+ f .writer .SetWriteDeadline (time .Now ().Add (5 * time .Second ))
124+ defer f .writer .SetWriteDeadline (time.Time {})
123125 n , err = f .writer .Write (p )
124126 f .cursor += int64 (n )
125127 return
@@ -137,7 +139,7 @@ func (f *File) Seek(offset int64, whence int) (n int64, err error) {
137139 case io .SeekCurrent :
138140 f .cursor += offset
139141 case io .SeekEnd :
140- stat := To1 (f .Stat ())
142+ stat := To1 (f ._Stat ())
141143 f .cursor = stat .Size () + offset
142144 }
143145 n = f .cursor
0 commit comments