@@ -247,11 +247,14 @@ func (opts *logOpts) searchLog(ctx context.Context, logFile string) (int64, int6
247247 return 0 , 0 , "" , nil
248248 }
249249 stateFile := getStateFile (opts .StateDir , logFile , opts .origArgs )
250- skipBytes , inode := int64 (0 ), uint (0 )
250+ skipBytes , inode , isFirstCheck := int64 (0 ), uint (0 ), false
251251 if ! opts .NoState {
252252 s , err := getBytesToSkip (stateFile )
253253 if err != nil {
254- return 0 , 0 , "" , err
254+ if err != errValidStateFileNotFound {
255+ return 0 , 0 , "" , err
256+ }
257+ isFirstCheck = true
255258 }
256259 skipBytes = s
257260
@@ -282,10 +285,9 @@ func (opts *logOpts) searchLog(ctx context.Context, logFile string) (int64, int6
282285 return 0 , 0 , "" , err
283286 }
284287
285- if ! opts .NoState && ! opts .CheckFirst {
286- if _ , err = os .Stat (stateFile ); os .IsNotExist (err ) {
287- skipBytes = stat .Size ()
288- }
288+ // Skip whole file on first check, unless CheckFirst specified
289+ if ! opts .NoState && isFirstCheck && ! opts .CheckFirst {
290+ skipBytes = stat .Size ()
289291 }
290292
291293 rotated := false
@@ -428,7 +430,12 @@ func loadState(fname string) (*state, error) {
428430 return state , err
429431 }
430432 err = json .Unmarshal (b , state )
431- return state , err
433+ if err != nil {
434+ // this json unmarshal error will be ignored by callers
435+ log .Printf ("failed to loadState (will be ignored): %s" , err )
436+ return nil , errStateFileCorrupted
437+ }
438+ return state , nil
432439}
433440
434441var stateRe = regexp .MustCompile (`^([a-zA-Z]):[/\\]` )
@@ -444,8 +451,15 @@ func getStateFile(stateDir, f string, args []string) string {
444451 )
445452}
446453
454+ var errValidStateFileNotFound = fmt .Errorf ("state file not found, or corrupted" )
455+ var errStateFileCorrupted = fmt .Errorf ("state file is corrupted" )
456+
447457func getBytesToSkip (f string ) (int64 , error ) {
448458 state , err := loadState (f )
459+ // Do not fallback to old status file when JSON file is corrupted
460+ if err == errStateFileCorrupted {
461+ return 0 , errValidStateFileNotFound
462+ }
449463 if err != nil {
450464 return 0 , err
451465 }
@@ -464,7 +478,7 @@ func getBytesToSkipOld(f string) (int64, error) {
464478 b , err := ioutil .ReadFile (f )
465479 if err != nil {
466480 if os .IsNotExist (err ) {
467- return 0 , nil
481+ return 0 , errValidStateFileNotFound
468482 }
469483 return 0 , err
470484 }
@@ -478,6 +492,10 @@ func getBytesToSkipOld(f string) (int64, error) {
478492
479493func getInode (f string ) (uint , error ) {
480494 state , err := loadState (f )
495+ // ignore corrupted json
496+ if err == errStateFileCorrupted {
497+ return 0 , nil
498+ }
481499 if err != nil {
482500 return 0 , err
483501 }
0 commit comments