Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 303feb1

Browse files
committed
feat: Use InTx to ensure db calls are consistent
1 parent 0e4a3c0 commit 303feb1

File tree

2 files changed

+98
-78
lines changed

2 files changed

+98
-78
lines changed

coderd/templateversions.go

+61-52
Original file line numberDiff line numberDiff line change
@@ -385,68 +385,77 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque
385385
return
386386
}
387387

388-
if paginationParams.AfterID != uuid.Nil {
389-
// See if the record exists first. If the record does not exist, the pagination
390-
// query will not work.
391-
_, err := api.Database.GetTemplateVersionByID(r.Context(), paginationParams.AfterID)
392-
if err != nil && xerrors.Is(err, sql.ErrNoRows) {
393-
httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{
394-
Message: fmt.Sprintf("record at \"after_id\" (%q) does not exists", paginationParams.AfterID.String()),
388+
var err error
389+
apiVersions := []codersdk.TemplateVersion{}
390+
err = api.Database.InTx(func(store database.Store) error {
391+
if paginationParams.AfterID != uuid.Nil {
392+
// See if the record exists first. If the record does not exist, the pagination
393+
// query will not work.
394+
_, err := api.Database.GetTemplateVersionByID(r.Context(), paginationParams.AfterID)
395+
if err != nil && xerrors.Is(err, sql.ErrNoRows) {
396+
httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{
397+
Message: fmt.Sprintf("record at \"after_id\" (%q) does not exists", paginationParams.AfterID.String()),
398+
})
399+
return err
400+
} else if err != nil {
401+
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
402+
Message: fmt.Sprintf("get template version at after_id: %s", err),
403+
})
404+
return err
405+
}
406+
}
407+
408+
versions, err := api.Database.GetTemplateVersionsByTemplateID(r.Context(), database.GetTemplateVersionsByTemplateIDParams{
409+
TemplateID: template.ID,
410+
AfterID: paginationParams.AfterID,
411+
LimitOpt: int32(paginationParams.Limit),
412+
OffsetOpt: int32(paginationParams.Offset),
413+
})
414+
if errors.Is(err, sql.ErrNoRows) {
415+
httpapi.Write(rw, http.StatusOK, apiVersions)
416+
return err
417+
}
418+
if err != nil {
419+
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
420+
Message: fmt.Sprintf("get template version: %s", err),
395421
})
396-
return
397-
} else if err != nil {
422+
return err
423+
}
424+
425+
jobIDs := make([]uuid.UUID, 0, len(versions))
426+
for _, version := range versions {
427+
jobIDs = append(jobIDs, version.JobID)
428+
}
429+
jobs, err := api.Database.GetProvisionerJobsByIDs(r.Context(), jobIDs)
430+
if err != nil {
398431
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
399-
Message: fmt.Sprintf("get template version at after_id: %s", err),
432+
Message: fmt.Sprintf("get jobs: %s", err),
400433
})
401-
return
434+
return err
435+
}
436+
jobByID := map[string]database.ProvisionerJob{}
437+
for _, job := range jobs {
438+
jobByID[job.ID.String()] = job
402439
}
403-
}
404440

405-
apiVersion := []codersdk.TemplateVersion{}
406-
versions, err := api.Database.GetTemplateVersionsByTemplateID(r.Context(), database.GetTemplateVersionsByTemplateIDParams{
407-
TemplateID: template.ID,
408-
AfterID: paginationParams.AfterID,
409-
LimitOpt: int32(paginationParams.Limit),
410-
OffsetOpt: int32(paginationParams.Offset),
441+
for _, version := range versions {
442+
job, exists := jobByID[version.JobID.String()]
443+
if !exists {
444+
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
445+
Message: fmt.Sprintf("job %q doesn't exist for version %q", version.JobID, version.ID),
446+
})
447+
return err
448+
}
449+
apiVersions = append(apiVersions, convertTemplateVersion(version, convertProvisionerJob(job)))
450+
}
451+
452+
return nil
411453
})
412-
if errors.Is(err, sql.ErrNoRows) {
413-
httpapi.Write(rw, http.StatusOK, apiVersion)
414-
return
415-
}
416454
if err != nil {
417-
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
418-
Message: fmt.Sprintf("get template version: %s", err),
419-
})
420455
return
421456
}
422-
jobIDs := make([]uuid.UUID, 0, len(versions))
423-
for _, version := range versions {
424-
jobIDs = append(jobIDs, version.JobID)
425-
}
426-
jobs, err := api.Database.GetProvisionerJobsByIDs(r.Context(), jobIDs)
427-
if err != nil {
428-
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
429-
Message: fmt.Sprintf("get jobs: %s", err),
430-
})
431-
return
432-
}
433-
jobByID := map[string]database.ProvisionerJob{}
434-
for _, job := range jobs {
435-
jobByID[job.ID.String()] = job
436-
}
437-
438-
for _, version := range versions {
439-
job, exists := jobByID[version.JobID.String()]
440-
if !exists {
441-
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
442-
Message: fmt.Sprintf("job %q doesn't exist for version %q", version.JobID, version.ID),
443-
})
444-
return
445-
}
446-
apiVersion = append(apiVersion, convertTemplateVersion(version, convertProvisionerJob(job)))
447-
}
448457

449-
httpapi.Write(rw, http.StatusOK, apiVersion)
458+
httpapi.Write(rw, http.StatusOK, apiVersions)
450459
}
451460

452461
func (api *API) templateVersionByName(rw http.ResponseWriter, r *http.Request) {

coderd/workspacebuilds.go

+37-26
Original file line numberDiff line numberDiff line change
@@ -58,39 +58,50 @@ func (api *API) workspaceBuilds(rw http.ResponseWriter, r *http.Request) {
5858
return
5959
}
6060

61-
if paginationParams.AfterID != uuid.Nil {
62-
// See if the record exists first. If the record does not exist, the pagination
63-
// query will not work.
64-
_, err := api.Database.GetWorkspaceBuildByID(r.Context(), paginationParams.AfterID)
65-
if err != nil && xerrors.Is(err, sql.ErrNoRows) {
66-
httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{
67-
Message: fmt.Sprintf("record at \"after_id\" (%q) does not exist", paginationParams.AfterID.String()),
68-
})
69-
return
70-
} else if err != nil {
61+
var builds []database.WorkspaceBuild
62+
// Ensure all db calls happen in the same tx
63+
err := api.Database.InTx(func(store database.Store) error {
64+
var err error
65+
if paginationParams.AfterID != uuid.Nil {
66+
// See if the record exists first. If the record does not exist, the pagination
67+
// query will not work.
68+
_, err := store.GetWorkspaceBuildByID(r.Context(), paginationParams.AfterID)
69+
if err != nil && xerrors.Is(err, sql.ErrNoRows) {
70+
httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{
71+
Message: fmt.Sprintf("record at \"after_id\" (%q) does not exist", paginationParams.AfterID.String()),
72+
})
73+
return err
74+
} else if err != nil {
75+
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
76+
Message: fmt.Sprintf("get workspace build at after_id: %s", err),
77+
})
78+
return err
79+
}
80+
}
81+
82+
req := database.GetWorkspaceBuildByWorkspaceIDParams{
83+
WorkspaceID: workspace.ID,
84+
AfterID: paginationParams.AfterID,
85+
OffsetOpt: int32(paginationParams.Offset),
86+
LimitOpt: int32(paginationParams.Limit),
87+
}
88+
builds, err = api.Database.GetWorkspaceBuildByWorkspaceID(r.Context(), req)
89+
if xerrors.Is(err, sql.ErrNoRows) {
90+
err = nil
91+
}
92+
if err != nil {
7193
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
72-
Message: fmt.Sprintf("get workspace build at after_id: %s", err),
94+
Message: fmt.Sprintf("get workspace builds: %s", err),
7395
})
74-
return
96+
return err
7597
}
76-
}
7798

78-
req := database.GetWorkspaceBuildByWorkspaceIDParams{
79-
WorkspaceID: workspace.ID,
80-
AfterID: paginationParams.AfterID,
81-
OffsetOpt: int32(paginationParams.Offset),
82-
LimitOpt: int32(paginationParams.Limit),
83-
}
84-
builds, err := api.Database.GetWorkspaceBuildByWorkspaceID(r.Context(), req)
85-
if xerrors.Is(err, sql.ErrNoRows) {
86-
err = nil
87-
}
99+
return nil
100+
})
88101
if err != nil {
89-
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
90-
Message: fmt.Sprintf("get workspace builds: %s", err),
91-
})
92102
return
93103
}
104+
94105
jobIDs := make([]uuid.UUID, 0, len(builds))
95106
for _, version := range builds {
96107
jobIDs = append(jobIDs, version.JobID)

0 commit comments

Comments
 (0)