Run a daemon
(ctx context.Context)
| 633 | } |
| 634 | } |
| 635 | } |
| 636 | } |
| 637 | |
| 638 | // Run a daemon |
| 639 | func (s *Daemon) Run(ctx context.Context) error { |
| 640 | shm, err := fbclock.OpenFBClockSHMv1() |
| 641 | if err != nil { |
| 642 | return fmt.Errorf("opening fbclock shm: %w", err) |
| 643 | } |
| 644 | defer shm.Close() |
| 645 | |
| 646 | if s.cfg.LinearizabilityTestInterval != 0 { |
| 647 | go s.runLinearizabilityTests(ctx) |
| 648 | } |
| 649 | |
| 650 | if s.cfg.EnableDataV2 { |
| 651 | shmv2, err := fbclock.OpenFBClockSHMv2() |
| 652 | if err != nil { |
| 653 | return fmt.Errorf("opening fbclock shm v2: %w", err) |
| 654 | } |
| 655 | defer shmv2.Close() |
| 656 | go s.populateDataV2(shmv2) |
| 657 | } |
| 658 | |
| 659 | ticker := time.NewTicker(s.cfg.Interval) |
| 660 | defer ticker.Stop() |
| 661 | for ; true; <-ticker.C { // first run without delay, then at interval |
| 662 | data, err := s.FetchStats(s.cfg) |
| 663 | if err != nil { |
| 664 | log.Error(err) |
| 665 | s.stats.UpdateCounterBy("data_error", 1) |
| 666 | continue |
| 667 | } |
| 668 | s.stats.SetCounter("data_error", 0) |
| 669 | // get PHC freq adjustment |
| 670 | freqPPB, err := s.getPHCFreqPPB() |
| 671 | if err != nil { |
| 672 | return err |
| 673 | } |
| 674 | data.FreqAdjustmentPPB = freqPPB |
| 675 | if err := s.doWork(shm, data); err != nil { |
| 676 | if errors.Is(err, errNoPHC) { |
| 677 | return err |
| 678 | } else if errors.Is(err, errCorrectness) { |
| 679 | log.Warning(err) |
| 680 | } else { |
| 681 | log.Error(err) |
| 682 | } |
| 683 | s.stats.UpdateCounterBy("processing_error", 1) |
| 684 | continue |
| 685 | } |
| 686 | s.stats.SetCounter("processing_error", 0) |
| 687 | } |
| 688 | return nil |
nothing calls this directly
no test coverage detected