Skip to content

Commit 0ab7ec4

Browse files
fix: remove goroutine in transaction
1 parent 1b7c2ac commit 0ab7ec4

3 files changed

Lines changed: 42 additions & 54 deletions

File tree

internal/api/router.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ limitations under the License.
1717
package api
1818

1919
import (
20-
"net/http"
2120
v1 "teleport-plugin-slack-access-request/internal/api/v1"
2221
"teleport-plugin-slack-access-request/internal/metric"
2322

@@ -34,12 +33,11 @@ func NewRouter(v1 *v1.Router) *Router {
3433
}
3534
}
3635

37-
func (r *Router) Setup(router *chi.Mux) http.Handler {
36+
func (r *Router) Setup(router *chi.Mux) {
3837
router.
3938
With(metric.InstrumentHTTP).
4039
With(VerifySlackRequest()).
4140
Route("/api", func(router chi.Router) {
4241
r.v1.Route(router)
4342
})
44-
return router
4543
}

internal/api/v1/accessreview/submit_modal_handler.go

Lines changed: 36 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ import (
3232
"teleport-plugin-slack-access-request/internal/util"
3333
"teleport-plugin-slack-access-request/internal/util/container"
3434
"teleport-plugin-slack-access-request/internal/util/verifier"
35-
36-
"golang.org/x/sync/errgroup"
3735
)
3836

3937
func (h *Handler) HandleModalSubmission(payloadStr string, w http.ResponseWriter, r *http.Request) {
@@ -150,55 +148,47 @@ func (h *Handler) performTransaction(ctx context.Context, payload *viewsubmissio
150148
return fmt.Errorf("failed to create access review: %w", err)
151149
}
152150

153-
g, gCtx := errgroup.WithContext(ctx)
154151
// 7. outbox 저장하기
155-
g.Go(func() error {
156-
// 1. Reviewer Channel 용 이벤트 객체 만들기
157-
ob, err := model.NewOutboxWithAccessReviewReviewer(updatedAR, createdAccessReview, requesterSlackUser, reviewerSlackUser, payload.MessageTs)
158-
if err != nil {
159-
return fmt.Errorf("failed to create outbox with access review in reviewer channel : %w", err)
160-
}
152+
// Reviewer Channel 용 이벤트 객체 만들기
153+
reviewOB, err := model.NewOutboxWithAccessReviewReviewer(updatedAR, createdAccessReview, requesterSlackUser, reviewerSlackUser, payload.MessageTs)
154+
if err != nil {
155+
return fmt.Errorf("failed to create outbox with access review in reviewer channel : %w", err)
156+
}
161157

162-
createdOB, err := txServices.Outbox.CreateOutbox(gCtx, ob)
163-
if err != nil {
164-
return fmt.Errorf("failed to create reviewer outbox: %w", err)
165-
}
158+
createdReviewOB, err := txServices.Outbox.CreateOutbox(ctx, reviewOB)
159+
if err != nil {
160+
return fmt.Errorf("failed to create reviewer outbox: %w", err)
161+
}
166162

167-
// Outbox Notification 설정
168-
obn, err := model.NewOutboxNotification(createdOB)
169-
if err != nil {
170-
return fmt.Errorf("failed to create outbox notification: %w", err)
171-
}
172-
if err := txServices.Outbox.Notify(ctx, obn); err != nil {
173-
return fmt.Errorf("failed to notify outbox: %w", err)
174-
}
175-
return nil
176-
})
177-
178-
g.Go(func() error {
179-
// 2. Requester Channel 용 이벤트 객체 만들기
180-
ob, err := model.NewOutboxWithAccessReviewRequester(updatedAR, createdAccessReview, requesterSlackUser, reviewerSlackUser)
181-
if err != nil {
182-
return fmt.Errorf("failed to create outbox with access review in requester channel : %w", err)
183-
}
163+
// Outbox Notification 설정
164+
reviewerOBN, err := model.NewOutboxNotification(createdReviewOB)
165+
if err != nil {
166+
return fmt.Errorf("failed to create outbox notification: %w", err)
167+
}
184168

185-
createdOB, err := txServices.Outbox.CreateOutbox(gCtx, ob)
186-
if err != nil {
187-
return fmt.Errorf("failed to create requester outbox: %w", err)
188-
}
169+
if err := txServices.Outbox.Notify(ctx, reviewerOBN); err != nil {
170+
return fmt.Errorf("failed to notify outbox: %w", err)
171+
}
189172

190-
// Outbox Notification 설정
191-
obn, err := model.NewOutboxNotification(createdOB)
192-
if err != nil {
193-
return fmt.Errorf("failed to create outbox notification: %w", err)
194-
}
195-
if err := txServices.Outbox.Notify(ctx, obn); err != nil {
196-
return fmt.Errorf("failed to notify outbox: %w", err)
197-
}
198-
return nil
199-
})
200-
if err := g.Wait(); err != nil {
201-
return fmt.Errorf("failed to wait goroutines : %w", err)
173+
// Requester Channel 용 이벤트 객체 만들기
174+
requesterOB, err := model.NewOutboxWithAccessReviewRequester(updatedAR, createdAccessReview, requesterSlackUser, reviewerSlackUser)
175+
if err != nil {
176+
return fmt.Errorf("failed to create outbox with access review in requester channel : %w", err)
177+
}
178+
179+
createdRequesterOB, err := txServices.Outbox.CreateOutbox(ctx, requesterOB)
180+
if err != nil {
181+
return fmt.Errorf("failed to create requester outbox: %w", err)
182+
}
183+
184+
// Outbox Notification 설정
185+
requesterOBN, err := model.NewOutboxNotification(createdRequesterOB)
186+
if err != nil {
187+
return fmt.Errorf("failed to create outbox notification: %w", err)
188+
}
189+
190+
if err := txServices.Outbox.Notify(ctx, requesterOBN); err != nil {
191+
return fmt.Errorf("failed to notify outbox: %w", err)
202192
}
203193

204194
// 8. 트랜잭션 종료하기

internal/app/run.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ func Run() {
4545
isReady.Store(false)
4646

4747
app := NewContext()
48-
SetupCloseHandler(cancel, func() {
48+
setupCloseHandler(cancel, func() {
4949
app.Cleanup(ctx)
5050
})
5151

5252
errCh := make(chan error, 1)
5353
go func() {
54-
if err := StartCheckServer(router, isReady, app); err != nil {
54+
if err := startCheckServer(router, isReady, app); err != nil {
5555
errCh <- err
5656
}
5757
}()
@@ -70,7 +70,7 @@ func Run() {
7070
}
7171
}
7272

73-
func SetupCloseHandler(cancel context.CancelFunc, cleanup func()) {
73+
func setupCloseHandler(cancel context.CancelFunc, cleanup func()) {
7474
c := make(chan os.Signal, 2)
7575
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
7676
go func() {
@@ -81,7 +81,7 @@ func SetupCloseHandler(cancel context.CancelFunc, cleanup func()) {
8181
}()
8282
}
8383

84-
func StartCheckServer(router *chi.Mux, isReady *atomic.Value, app *Context) error {
84+
func startCheckServer(router *chi.Mux, isReady *atomic.Value, app *Context) error {
8585
router.Use(middleware.Recoverer)
8686

8787
router.Get("/healthz", check.Healthz)
@@ -144,7 +144,7 @@ func startAPIServer(ctx context.Context, router *chi.Mux, isReady *atomic.Value,
144144
slog.Info("starting outbox worker")
145145

146146
routers := NewRouter(db, clients, repos, services)
147-
_ = routers.Setup(router)
147+
routers.Setup(router)
148148
router.Handle("/metrics", promhttp.HandlerFor(metric.Registry, promhttp.HandlerOpts{}))
149149
isReady.Store(true)
150150
return nil

0 commit comments

Comments
 (0)