|
5 | 5 | package poll
|
6 | 6 |
|
7 | 7 | import (
|
| 8 | + "context" |
8 | 9 | "net/http"
|
| 10 | + "strconv" |
9 | 11 | "time"
|
10 | 12 |
|
| 13 | + "github.com/google/go-github/v33/github" |
11 | 14 | "github.com/web-platform-tests/wpt.fyi/api/query"
|
12 | 15 | "github.com/web-platform-tests/wpt.fyi/api/query/cache/index"
|
13 | 16 | "github.com/web-platform-tests/wpt.fyi/shared"
|
@@ -84,20 +87,76 @@ func wait(start time.Time, total time.Duration) {
|
84 | 87 | }
|
85 | 88 | }
|
86 | 89 |
|
87 |
| -// KeepMetadataUpdated implements updates to metadataMapCached via simple polling every |
| 90 | +// StartMetadataPollingService performs metadata-related services via simple polling every |
88 | 91 | // interval duration.
|
89 |
| -func KeepMetadataUpdated(client *http.Client, logger shared.Logger, interval time.Duration) { |
90 |
| - logger.Infof("Metadata update via polling started") |
| 92 | +func StartMetadataPollingService(ctx context.Context, logger shared.Logger, interval time.Duration) { |
| 93 | + logger.Infof("Starting Metadata polling service.") |
| 94 | + netClient := &http.Client{Timeout: time.Second * 5} |
| 95 | + cacheSet := shared.NewRedisSet() |
| 96 | + gitHubClient, err := shared.NewAppEngineAPI(ctx).GetGitHubClient() |
| 97 | + if err != nil { |
| 98 | + logger.Infof("Unable to get GitHub client: %v", err) |
| 99 | + } |
| 100 | + |
91 | 101 | for {
|
92 |
| - metadataCache, err := shared.GetWPTMetadataArchive(client, nil) |
| 102 | + keepMetadataUpdated(netClient, logger) |
| 103 | + if gitHubClient != nil { |
| 104 | + cleanOrphanedPendingMetadata(ctx, gitHubClient, cacheSet, logger) |
| 105 | + } else { |
| 106 | + logger.Infof("GitHub client is not initialized, skipping cleanOrphanedPendingMetadata.") |
| 107 | + } |
| 108 | + time.Sleep(interval) |
| 109 | + } |
| 110 | +} |
| 111 | + |
| 112 | +// keepMetadataUpdated fetches a new copy of the wpt-metadata repo and updates metadataMapCached. |
| 113 | +func keepMetadataUpdated(client *http.Client, logger shared.Logger) { |
| 114 | + logger.Infof("Running keepMetadataUpdated...") |
| 115 | + metadataCache, err := shared.GetWPTMetadataArchive(client, nil) |
| 116 | + if err != nil { |
| 117 | + logger.Infof("Error fetching Metadata for update: %v", err) |
| 118 | + return |
| 119 | + } |
| 120 | + |
| 121 | + if metadataCache != nil { |
| 122 | + query.MetadataMapCached = metadataCache |
| 123 | + } |
| 124 | +} |
| 125 | + |
| 126 | +// cleanOrphanedPendingMetadata cleans and removes orphaned pending metadata in Redis. |
| 127 | +func cleanOrphanedPendingMetadata(ctx context.Context, ghClient *github.Client, cacheSet shared.RedisSet, logger shared.Logger) { |
| 128 | + logger.Infof("Running cleanOrphanedPendingMetadata...") |
| 129 | + prs, err := cacheSet.GetAll(shared.PendingMetadataCacheKey) |
| 130 | + if err != nil { |
| 131 | + logger.Infof("Error fetching pending PRs from cacheSet: %v", err) |
| 132 | + return |
| 133 | + } |
| 134 | + logger.Infof("Pending PR numbers in cacheSet are: %v", prs) |
| 135 | + |
| 136 | + for _, pr := range prs { |
| 137 | + // Parse PR string into integer |
| 138 | + prInt, err := strconv.Atoi(pr) |
93 | 139 | if err != nil {
|
94 |
| - logger.Errorf("Error fetching Metadata for update: %v", err) |
| 140 | + logger.Infof("Error parsing %s into integer in cleanOrphanedPendingMetadata", pr) |
| 141 | + // Not an integer; remove it from the cache set. |
| 142 | + cacheSet.Remove(shared.PendingMetadataCacheKey, pr) |
| 143 | + shared.DeleteCache(shared.PendingMetadataCachePrefix + pr) |
| 144 | + continue |
95 | 145 | }
|
96 | 146 |
|
97 |
| - if err == nil && metadataCache != nil { |
98 |
| - query.MetadataMapCached = metadataCache |
| 147 | + res, _, err := ghClient.PullRequests.Get(ctx, shared.SourceOwner, shared.SourceRepo, prInt) |
| 148 | + if err != nil { |
| 149 | + logger.Infof("Error getting information for PR %s: %v", pr, err) |
| 150 | + continue |
99 | 151 | }
|
100 | 152 |
|
101 |
| - time.Sleep(interval) |
| 153 | + if res.State == nil || *res.State != "closed" { |
| 154 | + continue |
| 155 | + } |
| 156 | + |
| 157 | + logger.Infof("Removing PR %s and its pending metadata from Redis", pr) |
| 158 | + // pr is closed; remove pr from the cache set and its pending metadata from Redis. |
| 159 | + cacheSet.Remove(shared.PendingMetadataCacheKey, pr) |
| 160 | + shared.DeleteCache(shared.PendingMetadataCachePrefix + pr) |
102 | 161 | }
|
103 | 162 | }
|
0 commit comments