Skip to content

Commit b58ea15

Browse files
KyleJuKyle Ju
andauthored
[Triage Metadata] Clean orphaned pending metadata in searchcache polling (#2493)
* Add cleanOrphanedPendingMetadata to searchcache polling * Add logging and use logger.Infof in poll.go * Address comments Co-authored-by: Kyle Ju <[email protected]>
1 parent ac2fbed commit b58ea15

File tree

7 files changed

+106
-21
lines changed

7 files changed

+106
-21
lines changed

api/query/cache/poll/poll.go

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
package poll
66

77
import (
8+
"context"
89
"net/http"
10+
"strconv"
911
"time"
1012

13+
"github.com/google/go-github/v33/github"
1114
"github.com/web-platform-tests/wpt.fyi/api/query"
1215
"github.com/web-platform-tests/wpt.fyi/api/query/cache/index"
1316
"github.com/web-platform-tests/wpt.fyi/shared"
@@ -84,20 +87,76 @@ func wait(start time.Time, total time.Duration) {
8487
}
8588
}
8689

87-
// KeepMetadataUpdated implements updates to metadataMapCached via simple polling every
90+
// StartMetadataPollingService performs metadata-related services via simple polling every
8891
// 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+
91101
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)
93139
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
95145
}
96146

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
99151
}
100152

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)
102161
}
103162
}

api/query/cache/service/app.staging.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,10 @@ liveness_check:
1717

1818
readiness_check:
1919
path: "/_ah/readiness_check"
20+
21+
network:
22+
name: default
23+
24+
env_variables:
25+
REDISHOST: "10.171.142.203"
26+
REDISPORT: "6379"

api/query/cache/service/app.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,10 @@ liveness_check:
2121

2222
readiness_check:
2323
path: "/_ah/readiness_check"
24+
25+
network:
26+
name: default
27+
28+
env_variables:
29+
REDISHOST: "10.171.142.203"
30+
REDISPORT: "6379"

api/query/cache/service/main.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,18 +141,14 @@ func main() {
141141
// after backfilling was started.
142142
go poll.KeepRunsUpdated(store, logger, *updateInterval, *updateMaxRuns, idx)
143143

144-
var netClient = &http.Client{
145-
Timeout: time.Second * 5,
146-
}
147-
148144
// Initializes clients.
149145
if err = shared.Clients.Init(context.Background()); err != nil {
150146
logrus.Fatalf("Failed to initialize Google Cloud clients: %v", err)
151147
}
152148
defer shared.Clients.Close()
153149

154150
// Polls Metadata update every 10 minutes.
155-
go poll.KeepMetadataUpdated(netClient, logger, time.Minute*10)
151+
go poll.StartMetadataPollingService(context.Background(), logger, time.Minute*10)
156152

157153
http.HandleFunc("/_ah/liveness_check", livenessCheckHandler)
158154
http.HandleFunc("/_ah/readiness_check", readinessCheckHandler)

shared/cache.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,19 @@ func FlushCache() error {
434434
return err
435435
}
436436

437+
// DeleteCache deletes the object stored at key in Redis.
438+
// A key is ignored if it does not exist.
439+
func DeleteCache(key string) error {
440+
if Clients.redisPool == nil {
441+
return errNoRedis
442+
}
443+
conn := Clients.redisPool.Get()
444+
defer conn.Close()
445+
// https://redis.io/commands/del
446+
_, err := conn.Do("DEL", key)
447+
return err
448+
}
449+
437450
// RedisSet is an interface for an redisSetReadWritable,
438451
// which performs Add/Remove/GetAll operations via the App Engine Redis API.
439452
type RedisSet interface {

shared/metadata_util.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,11 @@ const PendingMetadataCacheKey = "WPT-PENDING-METADATA"
2727
// stored in Redis.
2828
const PendingMetadataCachePrefix = "PENDING-PR-"
2929

30-
const sourceOwner string = "web-platform-tests"
31-
const sourceRepo string = "wpt-metadata"
30+
// SourceOwner is the owner name of the wpt-metadata repo.
31+
const SourceOwner string = "web-platform-tests"
32+
33+
// SourceRepo is the wpt-metadata repo.
34+
const SourceRepo string = "wpt-metadata"
3235
const baseBranch string = "master"
3336

3437
// MetadataFetcher is an abstract interface that encapsulates the Fetch() method. Fetch() fetches metadata
@@ -39,7 +42,7 @@ type MetadataFetcher interface {
3942

4043
// GetWPTMetadataMasterSHA returns the SHA of the master branch of the wpt-metadata repo.
4144
func GetWPTMetadataMasterSHA(ctx context.Context, gitHubClient *github.Client) (*string, error) {
42-
baseRef, _, err := gitHubClient.Git.GetRef(ctx, sourceOwner, sourceRepo, "refs/heads/"+baseBranch)
45+
baseRef, _, err := gitHubClient.Git.GetRef(ctx, SourceOwner, SourceRepo, "refs/heads/"+baseBranch)
4346
if err != nil {
4447
return nil, err
4548
}

shared/triage_metadata.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,16 @@ func getNewCommitBranchName(ctx context.Context, client *github.Client, sourceOw
6868
}
6969

7070
func getWptmetadataGitHubInfo(ctx context.Context, client *github.Client) wptmetadataGitHubInfo {
71-
commitBranch := getNewCommitBranchName(ctx, client, sourceOwner, sourceRepo)
71+
commitBranch := getNewCommitBranchName(ctx, client, SourceOwner, SourceRepo)
7272

7373
return wptmetadataGitHubInfo{
74-
sourceOwner: sourceOwner,
75-
sourceRepo: sourceRepo,
74+
sourceOwner: SourceOwner,
75+
sourceRepo: SourceRepo,
7676
commitMessage: "Commit New Metadata",
7777
commitBranch: commitBranch,
7878
baseBranch: baseBranch,
79-
prRepoOwner: sourceOwner,
80-
prRepo: sourceRepo,
79+
prRepoOwner: SourceOwner,
80+
prRepo: SourceRepo,
8181
prBranch: baseBranch,
8282
prSubject: "Automatically Triage New Metadata",
8383
prDescription: "This metadata PR was generated via the wpt.fyi `/api/metadata/triage` endpoint. See [the documentation](https://github.com/web-platform-tests/wpt.fyi/tree/master/api#apimetadatatriage) for more information about how to use this service."}

0 commit comments

Comments
 (0)