Skip to content

Commit a9062b0

Browse files
committed
internal/worker: don't delete 40x results from version_map
At the moment, when module is fetched with a status 40x, it is deleted from the database. However, we don't want to delete that module from version_map, otherwise the response will never be returned to the user for a frontend fetch. Modules with status 40x are now deleted first, and then the result is inserted into version_map and module_version_states. For golang/go#36811 For golang/go#37002 Change-Id: I5eb9414c065bdc8364445edb293f21bbe870fa43 Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/245402 Reviewed-by: Jonathan Amsterdam <jba@google.com>
1 parent 76af5fd commit a9062b0

File tree

2 files changed

+66
-46
lines changed

2 files changed

+66
-46
lines changed

internal/worker/fetch.go

Lines changed: 54 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,35 @@ func FetchAndUpdateState(ctx context.Context, modulePath, requestedVersion strin
5757

5858
ft := fetchAndInsertModule(ctx, modulePath, requestedVersion, proxyClient, sourceClient, db)
5959
span.AddAttributes(trace.Int64Attribute("numPackages", int64(len(ft.PackageVersionStates))))
60-
dbErr := updateVersionMapAndDeleteModulesWithErrors(ctx, db, ft)
61-
if dbErr != nil {
62-
log.Error(ctx, dbErr)
63-
ft.Error = dbErr
64-
ft.Status = http.StatusInternalServerError
60+
61+
// If there were any errors processing the module then we didn't insert it.
62+
// Delete it in case we are reprocessing an existing module.
63+
if ft.Status >= 400 {
64+
if err := deleteModule(ctx, db, ft); err != nil {
65+
log.Error(ctx, err)
66+
ft.Error = err
67+
ft.Status = http.StatusInternalServerError
68+
}
69+
// Do not return an error here, because we want to insert into
70+
// module_version_states below.
71+
}
72+
// Regardless of what the status code is, insert the result into
73+
// version_map, so that a response can be returned for frontend_fetch.
74+
if err := updateVersionMap(ctx, db, ft); err != nil {
75+
log.Error(ctx, err)
76+
if ft.Status != http.StatusInternalServerError {
77+
ft.Error = err
78+
ft.Status = http.StatusInternalServerError
79+
}
80+
// Do not return an error here, because we want to insert into
81+
// module_version_states below.
6582
}
6683
if !semver.IsValid(ft.ResolvedVersion) {
84+
// If the requestedVersion was not successfully resolved to a semantic
85+
// version, then at this point it will be the same as the
86+
// resolvedVersion. This fetch request does not need to be recorded in
87+
// module_version_states, since that table is only used to track
88+
// modules that have been published to index.golang.org.
6789
return ft.Status, ft.Error
6890
}
6991

@@ -160,11 +182,14 @@ func fetchAndInsertModule(ctx context.Context, modulePath, requestedVersion stri
160182
return ft
161183
}
162184

163-
func updateVersionMapAndDeleteModulesWithErrors(ctx context.Context, db *postgres.DB, ft *fetchTask) (err error) {
164-
defer derrors.Wrap(&err, "updateVersionMapAndDeleteModulesWithErrors(%q, %q, %q, %d, %v)",
165-
ft.ModulePath, ft.RequestedVersion, ft.ResolvedVersion, ft.Status, ft.Error)
166-
167-
ctx, span := trace.StartSpan(ctx, "worker.updateFetchResult")
185+
func updateVersionMap(ctx context.Context, db *postgres.DB, ft *fetchTask) (err error) {
186+
start := time.Now()
187+
defer func() {
188+
ft.timings["worker.updatedVersionMap"] = time.Since(start)
189+
derrors.Wrap(&err, "updateVersionMap(%q, %q, %q, %d, %v)",
190+
ft.ModulePath, ft.RequestedVersion, ft.ResolvedVersion, ft.Status, ft.Error)
191+
}()
192+
ctx, span := trace.StartSpan(ctx, "worker.updateVersionMap")
168193
defer span.End()
169194

170195
var errMsg string
@@ -179,31 +204,26 @@ func updateVersionMapAndDeleteModulesWithErrors(ctx context.Context, db *postgre
179204
GoModPath: ft.GoModPath,
180205
Error: errMsg,
181206
}
182-
start := time.Now()
183-
err = db.UpsertVersionMap(ctx, vm)
184-
ft.timings["db.UpsertVersionMap"] = time.Since(start)
185-
if err != nil {
207+
if err := db.UpsertVersionMap(ctx, vm); err != nil {
186208
return err
187209
}
188-
if !semver.IsValid(vm.ResolvedVersion) {
189-
// If the requestedVersion was not successfully resolved, at
190-
// this point it will be the same as the resolvedVersion.
191-
// No additional tables need to be updated.
192-
return nil
193-
}
210+
return nil
211+
}
194212

195-
// If there were any errors processing the module then we didn't insert it.
196-
// Delete it in case we are reprocessing an existing module.
197-
if vm.Status > 400 {
198-
log.Infof(ctx, "%s@%s: code=%d, deleting", vm.ModulePath, vm.ResolvedVersion, vm.Status)
199-
start = time.Now()
200-
err = db.DeleteModule(ctx, vm.ModulePath, vm.ResolvedVersion)
201-
ft.timings["db.DeleteModule"] = time.Since(start)
202-
if err != nil {
203-
return err
204-
}
205-
}
213+
func deleteModule(ctx context.Context, db *postgres.DB, ft *fetchTask) (err error) {
214+
start := time.Now()
215+
defer func() {
216+
ft.timings["worker.deleteModule"] = time.Since(start)
217+
derrors.Wrap(&err, "deleteModule(%q, %q, %q, %d, %v)",
218+
ft.ModulePath, ft.RequestedVersion, ft.ResolvedVersion, ft.Status, ft.Error)
219+
}()
220+
ctx, span := trace.StartSpan(ctx, "worker.deleteModule")
221+
defer span.End()
206222

223+
log.Infof(ctx, "%s@%s: code=%d, deleting", ft.ModulePath, ft.ResolvedVersion, ft.Status)
224+
if err := db.DeleteModule(ctx, ft.ModulePath, ft.ResolvedVersion); err != nil {
225+
return err
226+
}
207227
// If this was an alternative path (ft.Status == 491) and there is an older
208228
// version in search_documents, delete it. This is the case where a module's
209229
// canonical path was changed by the addition of a go.mod file. For example,
@@ -212,12 +232,9 @@ func updateVersionMapAndDeleteModulesWithErrors(ctx context.Context, db *postgre
212232
// path is all lower-case, the old versions should not show up in search. We
213233
// still leave their pages in the database so users of those old versions
214234
// can still view documentation.
215-
if vm.Status == derrors.ToStatus(derrors.AlternativeModule) {
216-
log.Infof(ctx, "%s@%s: code=491, deleting older version from search", vm.ModulePath, vm.ResolvedVersion)
217-
start = time.Now()
218-
err = db.DeleteOlderVersionFromSearchDocuments(ctx, vm.ModulePath, vm.ResolvedVersion)
219-
ft.timings["db.DeleteOlderVersionFromSearchDocuments"] = time.Since(start)
220-
if err != nil {
235+
if ft.Status == derrors.ToStatus(derrors.AlternativeModule) {
236+
log.Infof(ctx, "%s@%s: code=491, deleting older version from search", ft.ModulePath, ft.ResolvedVersion)
237+
if err := db.DeleteOlderVersionFromSearchDocuments(ctx, ft.ModulePath, ft.ResolvedVersion); err != nil {
221238
return err
222239
}
223240
}

internal/worker/fetch_test.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,12 @@ func checkModuleNotFound(t *testing.T, ctx context.Context, modulePath, version
208208
if vs.Status != wantCode {
209209
t.Fatalf("testDB.GetModuleVersionState(ctx, %q, %q): status=%v, want %d", modulePath, version, vs.Status, wantCode)
210210
}
211-
_, err = testDB.GetVersionMap(ctx, modulePath, version)
212-
if !errors.Is(err, derrors.NotFound) {
213-
t.Fatalf("got %v, want Is(NotFound)", err)
211+
vm, err := testDB.GetVersionMap(ctx, modulePath, version)
212+
if err != nil {
213+
t.Fatal(err)
214+
}
215+
if vm.Status != wantCode {
216+
t.Fatalf("testDB.GetVersionMap(ctx, %q, %q): status=%d; want %d", modulePath, version, vm.Status, wantCode)
214217
}
215218
}
216219

@@ -350,18 +353,18 @@ func TestFetchAndUpdateState_Mismatch(t *testing.T) {
350353
if err != nil {
351354
t.Fatal(err)
352355
}
353-
354356
if vs.Status != wantCode {
355357
t.Errorf("testDB.GetModuleVersionState(ctx, %q, %q): status=%v, want %d", modulePath, version, vs.Status, wantCode)
356358
}
357-
358359
if vs.GoModPath != goModPath {
359360
t.Errorf("testDB.GetModuleVersionState(ctx, %q, %q): goModPath=%q, want %q", modulePath, version, vs.GoModPath, goModPath)
360361
}
361-
362-
_, err = testDB.GetVersionMap(ctx, modulePath, version)
363-
if !errors.Is(err, derrors.NotFound) {
364-
t.Fatalf("got %v, want Is(NotFound)", err)
362+
vm, err := testDB.GetVersionMap(ctx, modulePath, version)
363+
if err != nil {
364+
t.Fatal(err)
365+
}
366+
if vm.Status != wantCode {
367+
t.Fatalf("testDB.GetVersionMap(ctx, %q, %q): status=%d, want %d", modulePath, version, vm.Status, wantCode)
365368
}
366369
}
367370

0 commit comments

Comments
 (0)