| 727 | } |
| 728 | |
| 729 | func (c *LocalCluster) HealthCheck(zeroOnly bool) error { |
| 730 | log.Printf("[INFO] checking health of containers") |
| 731 | var wg sync.WaitGroup |
| 732 | errChan := make(chan error, len(c.zeros)+len(c.alphas)) |
| 733 | |
| 734 | for _, zo := range c.zeros { |
| 735 | if !zo.isRunning { |
| 736 | break |
| 737 | } |
| 738 | wg.Add(1) |
| 739 | go func(z *zero) { |
| 740 | defer wg.Done() |
| 741 | if err := c.containerHealthCheck(z.healthURL); err != nil { |
| 742 | errChan <- err |
| 743 | return |
| 744 | } |
| 745 | log.Printf("[INFO] container [%v] passed health check", z.containerName) |
| 746 | |
| 747 | if err := c.checkDgraphVersion(z.containerName); err != nil { |
| 748 | errChan <- err |
| 749 | } |
| 750 | }(zo) |
| 751 | } |
| 752 | |
| 753 | if !zeroOnly { |
| 754 | for _, aa := range c.alphas { |
| 755 | if !aa.isRunning { |
| 756 | break |
| 757 | } |
| 758 | wg.Add(1) |
| 759 | go func(a *alpha) { |
| 760 | defer wg.Done() |
| 761 | if err := c.containerHealthCheck(a.healthURL); err != nil { |
| 762 | errChan <- err |
| 763 | return |
| 764 | } |
| 765 | log.Printf("[INFO] container [%v] passed health check", a.containerName) |
| 766 | |
| 767 | if err := c.checkDgraphVersion(a.containerName); err != nil { |
| 768 | errChan <- err |
| 769 | } |
| 770 | }(aa) |
| 771 | } |
| 772 | } |
| 773 | |
| 774 | wg.Wait() |
| 775 | close(errChan) |
| 776 | |
| 777 | for err := range errChan { |
| 778 | return err |
| 779 | } |
| 780 | |
| 781 | return nil |
| 782 | } |
| 783 | |
| 784 | func (c *LocalCluster) containerHealthCheck(url func(c *LocalCluster) (string, error)) error { |
| 785 | endpoint, err := url(c) |