JobId 15462 Target 172.17.130.2 Score 34,437 Status pass State done UpdatedAt 17:49:31 Message ok Log 09/15 17:48:29 負荷レベルが上昇しました。 09/15 17:48:30 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:31 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:32 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:33 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:34 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:35 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:36 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:37 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:38 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:39 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:40 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:41 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/11/actions/reserve 09/15 17:48:42 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/11/actions/reserve 09/15 17:48:43 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/11/actions/reserve 09/15 17:48:44 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:45 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:46 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:47 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:48 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:49 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:50 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:51 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:52 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:53 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:54 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:55 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:56 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:57 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:58 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:48:59 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:49:00 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:49:01 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:49:02 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:49:03 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:49:04 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:49:05 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:49:06 負荷レベルが上昇しました。 09/15 17:49:07 負荷レベルが上昇しました。 09/15 17:49:08 負荷レベルが上昇しました。 09/15 17:49:09 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:49:10 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:49:11 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:49:12 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:49:13 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales 09/15 17:49:14 負荷レベルが上昇しました。 09/15 17:49:15 負荷レベルが上昇しました。 09/15 17:49:16 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/11/sheets/B/134/reservation 09/15 17:49:17 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/11/actions/reserve 09/15 17:49:18 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/11/actions/reserve 09/15 17:49:19 エラーが発生したため負荷レベルを上げられませんでした。2018-09-15 17:49:19.480285529 +0900 JST m=+56.176343567 リクエストがタイムアウトしました (POST /api/events/11/actions/reserve ) 09/15 17:49:20 エラーが発生したため負荷レベルを上げられませんでした。2018-09-15 17:49:20.473998604 +0900 JST m=+57.170056541 リクエストがタイムアウトしました (POST /api/events/11/actions/reserve ) 09/15 17:49:21 エラーが発生したため負荷レベルを上げられませんでした。2018-09-15 17:49:21.368113149 +0900 JST m=+58.064171107 リクエストがタイムアウトしました (POST /api/events/11/actions/reserve ) 09/15 17:49:22 エラーが発生したため負荷レベルを上げられませんでした。2018-09-15 17:49:21.368113149 +0900 JST m=+58.064171107 リクエストがタイムアウトしました (POST /api/events/11/actions/reserve ) 09/15 17:49:23 エラーが発生したため負荷レベルを上げられませんでした。2018-09-15 17:49:21.368113149 +0900 JST m=+58.064171107 リクエストがタイムアウトしました (POST /api/events/11/actions/reserve ) 09/15 17:49:24 エラーが発生したため負荷レベルを上げられませんでした。2018-09-15 17:49:21.368113149 +0900 JST m=+58.064171107 リクエストがタイムアウトしました (POST /api/events/11/actions/reserve ) 09/15 17:49:25 エラーが発生したため負荷レベルを上げられませんでした。2018-09-15 17:49:21.368113149 +0900 JST m=+58.064171107 リクエストがタイムアウトしました (POST /api/events/11/actions/reserve ) 09/15 17:49:26 エラーが発生したため負荷レベルを上げられませんでした。2018-09-15 17:49:26.392037663 +0900 JST m=+63.088095639 リクエストがタイムアウトしました (DELETE /api/events/11/sheets/B/275/reservation ) 09/15 17:49:27 エラーが発生したため負荷レベルを上げられませんでした。2018-09-15 17:49:27.352932671 +0900 JST m=+64.048990572 リクエストがタイムアウトしました (POST /api/events/11/actions/reserve )
Request by count 2432 POST /api/actions/login 1457 GET /favicon.ico 1455 GET /css/admin.css 1455 GET /css/bootstrap.min.css 1455 GET /css/layout.css 1455 GET /js/admin.js 1454 GET /js/vue.min.js 1454 GET /js/fetch.min.js 1454 GET /js/bootstrap.bundle.min.js 1454 GET /js/app.js 1454 GET /js/bootstrap-waitingfor.min.js 1454 GET /js/jquery-3.3.1.slim.min.js 1373 GET /api/events/* 1312 POST /api/events/11/actions/reserve 1258 GET / 507 DELETE /api/events/* 220 GET /admin/ 219 POST /api/users 209 GET /api/users/* 183 POST /admin/api/actions/login 176 GET /admin/api/reports/events/* 82 GET /admin/api/events/* 62 POST /admin/api/events/* 42 POST /admin/api/actions/logout 42 POST /admin/api/events 41 POST /api/actions/logout 21 GET /admin/api/reports/sales 20 POST /api/events/10/actions/reserve 18 POST /api/events/0/actions/reserve
Request by total time 631.349 0.481211128049 POST /api/events/11/actions/reserve 159.651 0.314893491124 DELETE /api/events/* 64.163 0.0510039745628 GET / 54.772 2.60819047619 GET /admin/api/reports/sales 46.042 0.0335338674436 GET /api/events/* 45.024 0.0185131578947 POST /api/actions/login 22.224 0.10633492823 GET /api/users/* 7.59 0.0345 GET /admin/ 4.722 0.0268295454545 GET /admin/api/reports/events/* 4.579 0.0209086757991 POST /api/users 4.193 0.022912568306 POST /admin/api/actions/login 1.788 0.0894 POST /api/events/10/actions/reserve 1.546 0.0858888888889 POST /api/events/0/actions/reserve 1.514 0.0244193548387 POST /admin/api/events/* 1.338 0.0163170731707 GET /admin/api/events/* 0.666 0.0158571428571 POST /admin/api/events 0.394 0.000270790378007 GET /css/bootstrap.min.css 0.331 0.00788095238095 POST /admin/api/actions/logout 0.122 0.0029756097561 POST /api/actions/logout
Request by out bytes 300411155 14305293 GET /admin/api/reports/sales 171531360 117890 GET /css/bootstrap.min.css 105324111 72437 GET /js/vue.min.js 86195061 59281 GET /js/bootstrap.bundle.min.js 85267116 58643 GET /js/jquery-3.3.1.slim.min.js 69789183 50829 GET /api/events/* 25400655 20191 GET / 12835282 8827 GET /js/app.js 12277651 69759 GET /admin/api/reports/events/* 10720099 7367 GET /js/admin.js 9356363 6434 GET /js/fetch.min.js 4436571 20166 GET /admin/ 2972344 2044 GET /js/bootstrap-waitingfor.min.js 1773292 1217 GET /favicon.ico 1345229 553 POST /api/actions/login 1297016 891 GET /css/layout.css 1269094 872 GET /css/admin.css 550156 2632 GET /api/users/* 506208 6173 GET /admin/api/events/* 263535 200 POST /api/events/11/actions/reserve 259289 6173 POST /admin/api/events 251383 4054 POST /admin/api/events/* 68755 375 POST /admin/api/actions/login 61597 121 DELETE /api/events/* 45964 209 POST /api/users 10710 255 POST /admin/api/actions/logout 10473 255 POST /api/actions/logout 4408 220 POST /api/events/10/actions/reserve 3613 200 POST /api/events/0/actions/reserve
mysql.txt not found.
## 2018-09-15 17:49:27.13 +0900 37 select r.*, s.rank as sheet_rank, s.num as sheet_num, s.price as sheet_price, e.id as event_id, e.price as event_price from reservations r inner join sheets s on s.id = r.sheet_id inner join events e on e.id = r.event_id 11 SELECT * FROM sheets ORDER BY `rank`, num 2 SELECT COUNT(*) FROM sheets WHERE `rank` = ? 1 SELECT SHA2(?, N) 1 SELECT * FROM events ORDER BY id ASC
File: torb
Type: cpu
Time: Sep 15, 2018 at 8:48am (UTC)
Duration: 1mins, Total samples = 69.66s (115.71%)
Showing nodes accounting for 57.20s, 82.11% of 69.66s total
Dropped 686 nodes (cum <= 0.35s)
flat flat% sum% cum cum%
7.21s 10.35% 10.35% 13.47s 19.34% runtime.scanobject
3.53s 5.07% 15.42% 3.95s 5.67% runtime.findObject
3.33s 4.78% 20.20% 13.60s 19.52% runtime.mallocgc
2.62s 3.76% 23.96% 2.62s 3.76% runtime.memmove
1.84s 2.64% 26.60% 3.40s 4.88% runtime.mapaccess1_faststr
1.83s 2.63% 29.23% 1.90s 2.73% syscall.Syscall
1.74s 2.50% 31.73% 10.35s 14.86% database/sql.convertAssign
1.67s 2.40% 34.12% 2.09s 3.00% runtime.heapBitsSetType
1.54s 2.21% 36.33% 1.55s 2.23% time.nextStdChunk
1.52s 2.18% 38.52% 2.77s 3.98% runtime.greyobject
1.29s 1.85% 40.37% 1.29s 1.85% runtime.memclrNoHeapPointers
1.23s 1.77% 42.13% 1.23s 1.77% runtime.markBits.isMarked (inline)
1.17s 1.68% 43.81% 3.18s 4.57% time.parse
File: torb
Type: cpu
Time: Sep 15, 2018 at 8:48am (UTC)
Duration: 1mins, Total samples = 69.66s (115.71%)
Showing nodes accounting for 57.20s, 82.11% of 69.66s total
Dropped 686 nodes (cum <= 0.35s)
flat flat% sum% cum cum%
0 0% 0% 56.39s 80.95% net/http.(*conn).serve
0 0% 0% 55.77s 80.06% github.com/labstack/echo.(*Echo).ServeHTTP
0 0% 0% 55.77s 80.06% net/http.serverHandler.ServeHTTP
0 0% 0% 55.74s 80.02% github.com/labstack/echo-contrib/session.MiddlewareWithConfig.func1.1
0 0% 0% 55.73s 80.00% github.com/labstack/echo/middleware.LoggerWithConfig.func2.1
0 0% 0% 55.60s 79.82% github.com/labstack/echo.(*Echo).Add.func1
0 0% 0% 34.49s 49.51% main.adminLoginRequired.func1
0.24s 0.34% 0.34% 33.29s 47.79% main.main.func20
0.14s 0.2% 0.55% 19.57s 28.09% runtime.systemstack
0.03s 0.043% 0.59% 15.61s 22.41% database/sql.withLock
0.10s 0.14% 0.73% 15.18s 21.79% database/sql.(*Rows).Next
0.07s 0.1% 0.83% 13.80s 19.81% database/sql.(*Rows).Next.func1
0.13s 0.19% 1.02% 13.73s 19.71% database/sql.(*Rows).nextLocked
. 407: }
. 408:}
. 409:
. 410:func adminLoginRequired(next echo.HandlerFunc) echo.HandlerFunc {
. 411: return func(c echo.Context) error {
80ms 412: if _, err := getLoginAdministrator(c); err != nil {
. 413: return resError(c, "admin_login_required", 401)
. 414: }
34.41s 415: return next(c)
. 416: }
. 417:}
. 418:
. 419:func getLoginUser(c echo.Context) (*User, error) {
. 420: userID := sessUserID(c)
. 1344: return err
. 1345: }
. 1346: defer rows.Close()
. 1347:
. 1348: var reports []Report
11.32s 1349: for rows.Next() {
540ms 1350: var reservation Reservation
400ms 1351: var sheet Sheet
300ms 1352: var event Event
7.76s 1353: if err := rows.Scan(&reservation.ID, &reservation.EventID, &reservation.SheetID, &reservation.UserID, &reservation.ReservedAt, &reservation.CanceledAt, &sheet.Rank, &sheet.Num, &sheet.Price, &event.ID, &event.Price); err != nil {
. 1354: return err
. 1355: }
10ms 1356: report := Report{
. 1357: ReservationID: reservation.ID,
. 1358: EventID: event.ID,
. 1359: Rank: sheet.Rank,
. 1360: Num: sheet.Num,
. 1361: UserID: reservation.UserID,
1.88s 1362: SoldAt: reservation.ReservedAt.Format("2006-01-02T15:04:05.000000Z"),
. 1363: Price: event.Price + sheet.Price,
10ms 1364: ReservedAt: reservation.ReservedAt.Unix(),
. 1365: }
. 1366: if reservation.CanceledAt != nil {
1.42s 1367: report.CanceledAt = reservation.CanceledAt.Format("2006-01-02T15:04:05.000000Z")
. 1368: }
2.09s 1369: reports = append(reports, report)
. 1370: }
7.56s 1371: return renderReportCSV(c, reports)
. 1372: }, adminLoginRequired)
. 1373:
. 1374: e.Start(":" + appPort)
. 1375:}
. 1376:
. 437: err := db.QueryRow("SELECT id, nickname FROM administrators WHERE id = ?", administratorID).Scan(&administrator.ID, &administrator.Nickname)
. 438: return &administrator, err
. 439:}
. 440:
. 441:func getEvents(all bool) ([]*Event, error) {
40ms 442: tx, err := db.Begin()
. 443: if err != nil {
. 444: return nil, err
. 445: }
. 446: defer tx.Commit()
. 447:
30ms 448: rows, err := tx.Query("SELECT * FROM events ORDER BY id ASC")
. 449: if err != nil {
. 450: return nil, err
. 451: }
. 452: defer rows.Close()
. 453:
90ms 454: rows2, err := db.Query("SELECT * FROM sheets ORDER BY `rank`, num")
. 455: if err != nil {
. 456: return nil, err
. 457: }
. 458: defer rows2.Close()
. 459: var sheets []*Sheet
830ms 460: for rows2.Next() {
120ms 461: var sheet Sheet
650ms 462: if err := rows2.Scan(&sheet.ID, &sheet.Rank, &sheet.Num, &sheet.Price); err != nil {
. 463: return nil, err
. 464: }
40ms 465: sheets = append(sheets, &sheet)
. 466: }
. 467:
. 468: /*
. 469: reservedTimes := make(map[int64]map[int64]int64)
. 470: rows3, err := db.Query("SELECT event_id, sheet_id, MIN(reserved_at) FROM reservations WHERE canceled_at IS NULL GROUP BY event_id, sheet_id")
. 471: if err != nil {
. 472: return nil, err
. 473: }
. 474: defer rows3.Close()
. 475: for rows3.Next() {
. 476: var eventId int64
. 477: var sheetId int64
. 478: var reservedAt *time.Time
. 479: rows3.Scan(&eventId, &sheetId, &reservedAt)
. 480: if _, ok := reservedTimes[eventId]; !ok {
. 481: reservedTimes[eventId] = make(map[int64]int64)
. 482: }
. 483: reservedTimes[eventId][sheetId] = reservedAt.Unix()
. 484: }
. 485: */
. 486:
. 487: var events []*Event
50ms 488: for rows.Next() {
. 489: var event Event
10ms 490: if err := rows.Scan(&event.ID, &event.Title, &event.PublicFg, &event.ClosedFg, &event.Price); err != nil {
. 491: return nil, err
. 492: }
. 493: if !all && !event.PublicFg {
. 494: continue
. 495: }
. 496: events = append(events, &event)
. 497: }
. 498: for i := range events {
. 499: events[i].Sheets = map[string]*Sheets{
40ms 500: "S": &Sheets{},
. 501: "A": &Sheets{},
. 502: "B": &Sheets{},
. 503: "C": &Sheets{},
. 504: }
. 505:
. 506: for _, v := range sheets {
2.09s 507: sheet := *v
920ms 508: events[i].Sheets[sheet.Rank].Price = events[i].Price + sheet.Price
30ms 509: events[i].Total++
480ms 510: events[i].Sheets[sheet.Rank].Total++
. 511:
. 512: /*
. 513: if a, ok := reservedTimes[events[i].ID]; ok {
. 514: if b, ok := a[sheet.ID]; ok {
. 515: sheet.Mine = false
. 516: sheet.Reserved = true
. 517: sheet.ReservedAtUnix = b
. 518: } else {
. 519: events[i].Remains++
. 520: events[i].Sheets[sheet.Rank].Remains++
. 521: }
. 522: } else {
. 523: events[i].Remains++
. 524: events[i].Sheets[sheet.Rank].Remains++
. 525: }
. 526: */
2.83s 527: if a, ok := GetReservedTimes(events[i].ID, sheet.ID); ok {
. 528: sheet.Mine = false
. 529: sheet.Reserved = true
. 530: sheet.ReservedAtUnix = a
. 531: } else {
. 532: events[i].Remains++
750ms 533: events[i].Sheets[sheet.Rank].Remains++
. 534: }
1.80s 535: events[i].Sheets[sheet.Rank].Detail = append(events[i].Sheets[sheet.Rank].Detail, &sheet)
. 536: }
. 537:
. 538: if err != nil {
. 539: return nil, err
. 540: }
40ms 541: for k := range events[i].Sheets {
10ms 542: events[i].Sheets[k].Detail = nil
. 543: }
. 544: }
40ms 545: return events, nil
. 546:}
. 547:
. 548:func getEvent(eventID, loginUserID int64) (*Event, error) {
. 549: var event Event
. 550: if err := db.QueryRow("SELECT * FROM events WHERE id = ?", eventID).Scan(&event.ID, &event.Title, &event.PublicFg, &event.ClosedFg, &event.Price); err != nil {
. 660: return &sanitized
. 661:}
. 662:
. 663:func fillinUser(next echo.HandlerFunc) echo.HandlerFunc {
. 664: return func(c echo.Context) error {
30ms 665: if user, err := getLoginUser(c); err == nil {
. 666: c.Set("user", user)
. 667: }
9.45s 668: return next(c)
. 669: }
. 670:}
. 671:
. 672:func fillinAdministrator(next echo.HandlerFunc) echo.HandlerFunc {
. 673: return func(c echo.Context) error {
. 736: }
. 737: e.Use(session.Middleware(sessions.NewCookieStore([]byte("secret"))))
. 738: e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{Output: os.Stderr}))
. 739: e.Static("/", "public")
. 740: e.GET("/", func(c echo.Context) error {
9.07s 741: events, err := getEvents(false)
. 742: if err != nil {
. 743: return err
. 744: }
. 745: for i, v := range events {
. 746: events[i] = sanitizeEvent(v)
. 747: }
370ms 748: return c.Render(200, "index.tmpl", echo.Map{
10ms 749: "events": events,
. 750: "user": c.Get("user"),
. 751: "origin": c.Scheme() + "://" + c.Request().Host,
. 752: })
. 753: }, fillinUser)
. 754: e.GET("/initialize", func(c echo.Context) error {
File: torb
Type: inuse_space
Time: Sep 15, 2018 at 8:49am (UTC)
Showing nodes accounting for 184.52MB, 99.46% of 185.53MB total
Dropped 15 nodes (cum <= 0.93MB)
flat flat% sum% cum cum%
47.16MB 25.42% 25.42% 47.16MB 25.42% bytes.makeSlice
42.38MB 22.84% 48.26% 144.04MB 77.64% main.main.func20
23.28MB 12.55% 60.81% 36.28MB 19.56% main.InitReservation
22MB 11.86% 72.67% 22MB 11.86% time.Time.Format
18MB 9.70% 82.37% 18MB 9.70% fmt.Sprintf
14.50MB 7.82% 90.19% 79.66MB 42.94% main.renderReportCSV
13.50MB 7.28% 97.46% 13.50MB 7.28% reflect.New
1.16MB 0.62% 98.09% 1.16MB 0.62% runtime/pprof.StartCPUProfile
1.04MB 0.56% 98.65% 1.04MB 0.56% main.InitReservedTime
1.01MB 0.54% 99.19% 1.01MB 0.54% runtime/pprof.(*profMap).lookup
0.50MB 0.27% 99.46% 14MB 7.55% database/sql.convertAssign
0 0% 99.46% 47.16MB 25.42% bytes.(*Buffer).WriteString
0 0% 99.46% 47.16MB 25.42% bytes.(*Buffer).grow
0 0% 99.46% 14MB 7.55% database/sql.(*Rows).Scan
File: torb
Type: inuse_space
Time: Sep 15, 2018 at 8:49am (UTC)
Showing nodes accounting for 184.52MB, 99.46% of 185.53MB total
Dropped 15 nodes (cum <= 0.93MB)
flat flat% sum% cum cum%
0 0% 0% 184.02MB 99.18% github.com/labstack/echo-contrib/session.MiddlewareWithConfig.func1.1
0 0% 0% 184.02MB 99.18% github.com/labstack/echo.(*Echo).Add.func1
0 0% 0% 184.02MB 99.18% github.com/labstack/echo.(*Echo).ServeHTTP
0 0% 0% 184.02MB 99.18% github.com/labstack/echo/middleware.LoggerWithConfig.func2.1
0 0% 0% 184.02MB 99.18% net/http.(*conn).serve
0 0% 0% 184.02MB 99.18% net/http.serverHandler.ServeHTTP
0 0% 0% 144.04MB 77.64% main.adminLoginRequired.func1
42.38MB 22.84% 22.84% 144.04MB 77.64% main.main.func20
14.50MB 7.82% 30.66% 79.66MB 42.94% main.renderReportCSV
0 0% 30.66% 47.16MB 25.42% bytes.(*Buffer).WriteString
0 0% 30.66% 47.16MB 25.42% bytes.(*Buffer).grow
47.16MB 25.42% 56.07% 47.16MB 25.42% bytes.makeSlice
0 0% 56.07% 38.98MB 21.01% main.main.func3
0 0% 56.07% 37.82MB 20.39% main.InitCache
. 410:func adminLoginRequired(next echo.HandlerFunc) echo.HandlerFunc {
. 411: return func(c echo.Context) error {
. 412: if _, err := getLoginAdministrator(c); err != nil {
. 413: return resError(c, "admin_login_required", 401)
. 414: }
144.04MB 415: return next(c)
. 416: }
. 417:}
. 418:
. 419:func getLoginUser(c echo.Context) (*User, error) {
. 420: userID := sessUserID(c)
. 1357: ReservationID: reservation.ID,
. 1358: EventID: event.ID,
. 1359: Rank: sheet.Rank,
. 1360: Num: sheet.Num,
. 1361: UserID: reservation.UserID,
8MB 1362: SoldAt: reservation.ReservedAt.Format("2006-01-02T15:04:05.000000Z"),
. 1363: Price: event.Price + sheet.Price,
. 1364: ReservedAt: reservation.ReservedAt.Unix(),
. 1365: }
. 1366: if reservation.CanceledAt != nil {
14MB 1367: report.CanceledAt = reservation.CanceledAt.Format("2006-01-02T15:04:05.000000Z")
. 1368: }
42.38MB 1369: reports = append(reports, report)
. 1370: }
79.66MB 1371: return renderReportCSV(c, reports)
. 1372: }, adminLoginRequired)
. 1373:
. 1374: e.Start(":" + appPort)
. 1375:}
. 1376:
. 1389:func renderReportCSV(c echo.Context, reports []Report) error {
. 1390: sort.Slice(reports, func(i, j int) bool { return reports[i].ReservedAt < reports[j].ReservedAt })
. 1391:
. 1392: body := bytes.NewBufferString("reservation_id,event_id,rank,num,price,user_id,sold_at,canceled_at\n")
. 1393: for _, v := range reports {
65.16MB 1394: body.WriteString(fmt.Sprintf("%d,%d,%s,%d,%d,%d,%s,%s\n",
14.50MB 1395: v.ReservationID, v.EventID, v.Rank, v.Num, v.Price, v.UserID, v.SoldAt, v.CanceledAt))
. 1396: }
. 1397:
. 1398: c.Response().Header().Set("Content-Type", `text/csv; charset=UTF-8`)
. 1399: c.Response().Header().Set("Content-Disposition", `attachment; filename="report.csv"`)
. 1400: _, err := io.Copy(c.Response(), body)
File: torb
Type: delay
Time: Sep 15, 2018 at 8:49am (UTC)
Showing nodes accounting for 1281.30s, 100% of 1281.73s total
Dropped 59 nodes (cum <= 6.41s)
flat flat% sum% cum cum%
799.82s 62.40% 62.40% 799.82s 62.40% sync.(*Mutex).Lock
416.60s 32.50% 94.90% 416.60s 32.50% runtime.selectgo
64.88s 5.06% 100% 64.88s 5.06% runtime.chanrecv1
0 0% 100% 50.93s 3.97% database/sql.(*DB).connectionResetter
0 0% 100% 21.55s 1.68% database/sql.(*Rows).awaitDone
0 0% 100% 64.64s 5.04% database/sql.(*Tx).awaitDone
0 0% 100% 344.12s 26.85% github.com/go-sql-driver/mysql.(*mysqlConn).startWatcher.func1
0 0% 100% 799.82s 62.40% github.com/labstack/echo-contrib/session.MiddlewareWithConfig.func1.1
0 0% 100% 799.82s 62.40% github.com/labstack/echo.(*Echo).Add.func1
0 0% 100% 799.82s 62.40% github.com/labstack/echo.(*Echo).ServeHTTP
0 0% 100% 799.82s 62.40% github.com/labstack/echo/middleware.LoggerWithConfig.func2.1
0 0% 100% 797.12s 62.19% main.loginRequired.func1
0 0% 100% 642.70s 50.14% main.main.func10
0 0% 100% 154.21s 12.03% main.main.func11
File: torb
Type: delay
Time: Sep 15, 2018 at 8:49am (UTC)
Showing nodes accounting for 1281.30s, 100% of 1281.73s total
Dropped 59 nodes (cum <= 6.41s)
flat flat% sum% cum cum%
0 0% 0% 800.25s 62.43% net/http.(*conn).serve
799.82s 62.40% 62.40% 799.82s 62.40% sync.(*Mutex).Lock
0 0% 62.40% 799.82s 62.40% github.com/labstack/echo-contrib/session.MiddlewareWithConfig.func1.1
0 0% 62.40% 799.82s 62.40% github.com/labstack/echo.(*Echo).ServeHTTP
0 0% 62.40% 799.82s 62.40% net/http.serverHandler.ServeHTTP
0 0% 62.40% 799.82s 62.40% github.com/labstack/echo/middleware.LoggerWithConfig.func2.1
0 0% 62.40% 799.82s 62.40% github.com/labstack/echo.(*Echo).Add.func1
0 0% 62.40% 797.12s 62.19% main.loginRequired.func1
0 0% 62.40% 642.70s 50.14% main.main.func10
416.60s 32.50% 94.90% 416.60s 32.50% runtime.selectgo
0 0% 94.90% 344.12s 26.85% github.com/go-sql-driver/mysql.(*mysqlConn).startWatcher.func1
0 0% 94.90% 154.21s 12.03% main.main.func11
64.88s 5.06% 100% 64.88s 5.06% runtime.chanrecv1
0 0% 100% 64.64s 5.04% database/sql.(*Tx).awaitDone
. 398: sess.Save(c.Request(), c.Response())
. 399:}
. 400:
. 401:func loginRequired(next echo.HandlerFunc) echo.HandlerFunc {
. 402: return func(c echo.Context) error {
84.53ms 403: if _, err := getLoginUser(c); err != nil {
. 404: return resError(c, "login_required", 401)
. 405: }
13.28mins 406: return next(c)
. 407: }
. 408:}
. 409:
. 410:func adminLoginRequired(next echo.HandlerFunc) echo.HandlerFunc {
. 411: return func(c echo.Context) error {
. 994: return resError(c, "not_found", 404)
. 995: }
. 996: return c.JSON(200, sanitizeEvent(event))
. 997: })
. 998: e.POST("/api/events/:id/actions/reserve", func(c echo.Context) error {
10.71mins 999: reqMtx.Lock()
. 1000: defer reqMtx.Unlock()
. 1001:
. 1002: eventID, err := strconv.ParseInt(c.Param("id"), 10, 64)
. 1003: if err != nil {
. 1004: return resError(c, "not_found", 404)
. 1005: }
. 1006: var params struct {
. 1007: Rank string `json:"sheet_rank"`
. 1008: }
. 1009: c.Bind(¶ms)
. 1010:
742.70us 1011: user, err := getLoginUser(c)
. 1012: if err != nil {
. 1013: return err
. 1014: }
. 1015:
130.57ms 1016: event, err := getEvent(eventID, user.ID)
. 1017: if err != nil {
. 1018: if err == sql.ErrNoRows {
. 1019: return resError(c, "invalid_event", 404)
. 1020: }
. 1021: return err
. 1022: } else if !event.PublicFg {
. 1023: return resError(c, "invalid_event", 404)
. 1024: }
. 1025:
166.82ms 1026: if !validateRank(params.Rank) {
. 1027: return resError(c, "invalid_rank", 400)
. 1028: }
. 1029:
. 1030: var sheet Sheet
. 1031: var reservationID int64
. 1032: for {
34.46ms 1033: if err := db.QueryRow("SELECT * FROM sheets WHERE id NOT IN (SELECT sheet_id FROM reservations WHERE event_id = ? AND canceled_at IS NULL) AND `rank` = ? ORDER BY RAND() LIMIT 1", event.ID, params.Rank).Scan(&sheet.ID, &sheet.Rank, &sheet.Num, &sheet.Price); err != nil {
. 1034: if err == sql.ErrNoRows {
. 1035: return resError(c, "sold_out", 409)
. 1036: }
. 1037: return err
. 1038: }
. 1039:
38.11ms 1040: tx, err := db.Beginx()
. 1041: if err != nil {
. 1042: return err
. 1043: }
. 1044:
. 1045: res, err := tx.Exec("INSERT INTO reservations (event_id, sheet_id, user_id, reserved_at) VALUES (?, ?, ?, ?)", event.ID, sheet.ID, user.ID, time.Now().UTC().Format("2006-01-02 15:04:05.000000"))
. 1046: if err != nil {
. 1047: tx.Rollback()
. 1048: log.Println("re-try: rollback by", err)
. 1049: continue
. 1050: }
. 1051: reservationID, err = res.LastInsertId()
. 1052: if err != nil {
. 1053: tx.Rollback()
. 1054: log.Println("re-try: rollback by", err)
. 1055: continue
. 1056: }
. 1057:
. 1058: var reserv Reservation
. 1059: err = tx.Get(&reserv, "SELECT * FROM `reservations` WHERE id = ?", reservationID)
. 1060: if err != nil {
. 1061: tx.Rollback()
. 1062: log.Println("re-try: rollback by", err)
. 1063: continue
. 1064: }
. 1065:
. 1066: if err := tx.Commit(); err != nil {
. 1067: tx.Rollback()
. 1068: log.Println("re-try: rollback by", err)
. 1069: continue
. 1070: }
. 1071:
27.01ms 1072: AddReservation(&reserv)
. 1073:
. 1074: break
. 1075: }
. 1076: return c.JSON(202, echo.Map{
. 1077: "id": reservationID,
. 1078: "sheet_rank": params.Rank,
. 1079: "sheet_num": sheet.Num,
. 1080: })
. 1081: }, loginRequired)
. 1082: e.DELETE("/api/events/:id/sheets/:rank/:num/reservation", func(c echo.Context) error {
2.57mins 1083: reqMtx.Lock()
. 1084: defer reqMtx.Unlock()
. 1085:
. 1086: eventID, err := strconv.ParseInt(c.Param("id"), 10, 64)
. 1087: if err != nil {
. 1088: return resError(c, "not_found", 404)
. 1089: }
. 1090: rank := c.Param("rank")
. 1091: num := c.Param("num")
. 1092:
1.65us 1093: user, err := getLoginUser(c)
. 1094: if err != nil {
. 1095: return err
. 1096: }
. 1097:
38.62ms 1098: event, err := getEvent(eventID, user.ID)
. 1099: if err != nil {
. 1100: if err == sql.ErrNoRows {
. 1101: return resError(c, "invalid_event", 404)
. 1102: }
. 1103: return err
. 1104: } else if !event.PublicFg {
. 1105: return resError(c, "invalid_event", 404)
. 1106: }
. 1107:
32.73ms 1108: if !validateRank(rank) {
. 1109: return resError(c, "invalid_rank", 404)
. 1110: }
. 1111:
. 1112: var sheet Sheet
7.90ms 1113: if err := db.QueryRow("SELECT * FROM sheets WHERE `rank` = ? AND num = ?", rank, num).Scan(&sheet.ID, &sheet.Rank, &sheet.Num, &sheet.Price); err != nil {
. 1114: if err == sql.ErrNoRows {
. 1115: return resError(c, "invalid_sheet", 404)
. 1116: }
. 1117: return err
. 1118: }
. 1119:
2.60ms 1120: tx, err := db.Begin()
. 1121: if err != nil {
. 1122: return err
. 1123: }
. 1124:
. 1125: // TODO SELECT消したい
. 1126: var reservation Reservation
. 1127: if err := tx.QueryRow("SELECT * FROM reservations WHERE event_id = ? AND sheet_id = ? AND canceled_at IS NULL GROUP BY event_id HAVING reserved_at = MIN(reserved_at)", event.ID, sheet.ID).Scan(&reservation.ID, &reservation.EventID, &reservation.SheetID, &reservation.UserID, &reservation.ReservedAt, &reservation.CanceledAt); err != nil {
. 1128: tx.Rollback()
. 1129: if err == sql.ErrNoRows {
. 1130: return resError(c, "not_reserved", 400)
. 1131: }
. 1132: return err
. 1133: }
. 1134: if reservation.UserID != user.ID {
. 1135: tx.Rollback()
. 1136: return resError(c, "not_permitted", 403)
. 1137: }
. 1138:
. 1139: cancelTime := time.Now().UTC()
. 1140: if _, err := tx.Exec("UPDATE reservations SET canceled_at = ? WHERE id = ?", cancelTime.Format("2006-01-02 15:04:05.000000"), reservation.ID); err != nil {
. 1141: tx.Rollback()
. 1142: return err
. 1143: }
. 1144:
. 1145: if err := tx.Commit(); err != nil {
. 1146: return err
. 1147: }
. 1148:
474ns 1149: CancelReservation(GetReservation(reservation.ID), cancelTime)
. 1150:
. 1151: return c.NoContent(204)
. 1152: }, loginRequired)
. 1153: e.GET("/admin/", func(c echo.Context) error {
. 1154: var events []*Event