Traewelling / traewelling

Free check-in service to log your public transit journeys
https://traewelling.de
GNU Affero General Public License v3.0
224 stars 43 forks source link

Server error 500 when saving tags #2659

Closed pascalwittler closed 1 week ago

pascalwittler commented 1 month ago

Describe the bug

Submitting the form to add tags to my trip failed several times, even after reloading the page without any feedback in the frontend.

The error occurred in time correlation with the already known problem of long database transactions leading to timeouts, but unlike the check-in, which also failed a few times, the error 500 was returned by the server immediately.

Request

POST https://traewelling.de/api/v1/status/2742877/tags

Headers

POST /api/v1/status/2742877/tags HTTP/2
Host: traewelling.de
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br, zstd
Referer: https://traewelling.de/status/2742877
Content-Type: application/json
Content-Length: 53
Origin: https://traewelling.de
DNT: 1
Sec-GPC: 1
Connection: keep-alive
Cookie: (…)
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=1
Pragma: no-cache
Cache-Control: no-cache
TE: trailers

Body

{
    "key": "trwl:ticket",
    "value": "BC💯",
    "visibility": 0
}

Response

Headers

HTTP/2 500 
server: nginx/1.22.1
content-type: application/json
cache-control: no-cache, private
date: Tue, 04 Jun 2024 16:13:04 GMT
x-ratelimit-limit: 60
x-ratelimit-remaining: 57
access-control-allow-origin: *
X-Firefox-Spdy: h2

Body

{
    "message": "Server Error"
}

Steps to reproduce

  1. Wait until the backend crumbles away due to long-lasting database transactions :melting_face:
  2. Check-in to your trip
  3. Click on "+ Neuer Tag" ("+ New tag") on the detail page of your trip
  4. Fill in the form and submit it
  5. Nothing happens, tag does not appear in the list
  6. Open the browser console

Browser console logs

Uncaught (in promise) TypeError: NetworkError when attempting to fetch resource. 

[XHR] POST https://traewelling.de/api/v1/status/2742877/tags
[HTTP/2 500  4847ms]

TypeError: _ is undefined
nw TagHelper.vue:86
Ah runtime-core.esm-bundler.js:2904
nw TagHelper.vue:1
ah runtime-core.esm-bundler.js:887
ft runtime-core.esm-bundler.js:6098
run reactivity.esm-bundler.js:177
update runtime-core.esm-bundler.js:6151
ts runtime-core.esm-bundler.js:195
Yb runtime-core.esm-bundler.js:410
promise callback*Gb runtime-core.esm-bundler.js:319
rd runtime-core.esm-bundler.js:313
effect runtime-core.esm-bundler.js:6145
$_ reactivity.esm-bundler.js:263
t reactivity.esm-bundler.js:436
addTag TagList.vue:35
promise callback*addTag TagList.vue:34
ts runtime-core.esm-bundler.js:195
vi runtime-core.esm-bundler.js:202
lP runtime-core.esm-bundler.js:725
updateTag TagRow.vue:52
addTag TagRow.vue:42
Sm/o[1]< TagRow.vue:125
r runtime-dom.esm-bundler.js:1497
ts runtime-core.esm-bundler.js:195
vi runtime-core.esm-bundler.js:202
n runtime-dom.esm-bundler.js:697
Xr runtime-dom.esm-bundler.js:647
JM runtime-dom.esm-bundler.js:665
ik runtime-dom.esm-bundler.js:742
k runtime-core.esm-bundler.js:5524
z runtime-core.esm-bundler.js:5471
$ runtime-core.esm-bundler.js:5339
V runtime-core.esm-bundler.js:5600
k runtime-core.esm-bundler.js:5506
z runtime-core.esm-bundler.js:5471
$ runtime-core.esm-bundler.js:5339
ft runtime-core.esm-bundler.js:6028
run reactivity.esm-bundler.js:177
update runtime-core.esm-bundler.js:6151
ot runtime-core.esm-bundler.js:6161
mt runtime-core.esm-bundler.js:5930
nt runtime-core.esm-bundler.js:5883
$ runtime-core.esm-bundler.js:5351
V runtime-core.esm-bundler.js:5600
R runtime-core.esm-bundler.js:5813
$ runtime-core.esm-bundler.js:5326
ft runtime-core.esm-bundler.js:6028
run reactivity.esm-bundler.js:177
update runtime-core.esm-bundler.js:6151
ot runtime-core.esm-bundler.js:6161
mt runtime-core.esm-bundler.js:5930
nt runtime-core.esm-bundler.js:5883
$ runtime-core.esm-bundler.js:5351
V runtime-core.esm-bundler.js:5600
R runtime-core.esm-bundler.js:5813
$ runtime-core.esm-bundler.js:5326

Browser

No response

MrKrisKrisu commented 1 month ago
[2024-06-04 16:13:04] production.ERROR: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2742877-trwl:ticket' for key 'status_tags_status_id_key_unique' (Connection: mysql, SQL: insert into `status_tags` (`key`, `value`, `visibility`, `status_id`, `updated_at`, `created_at`) values (xxx)) {"userId":xxx,"exception":"[object] (Illuminate\\Database\\UniqueConstraintViolationException(code: 23000): SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2742877-trwl:ticket' for key 'status_tags_status_id_key_unique' (Connection: mysql, SQL: insert into `status_tags` (`key`, `value`, `visibility`, `status_id`, `updated_at`, `created_at`) values (xxx)) at /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Connection.php:824)
[stacktrace]
#0 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback()
#1 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Connection.php(576): Illuminate\\Database\\Connection->run()
#2 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Connection.php(540): Illuminate\\Database\\Connection->statement()
#3 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/Processor.php(32): Illuminate\\Database\\Connection->insert()
#4 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3507): Illuminate\\Database\\Query\\Processors\\Processor->processInsertGetId()
#5 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(1982): Illuminate\\Database\\Query\\Builder->insertGetId()
#6 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1333): Illuminate\\Database\\Eloquent\\Builder->__call()
#7 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1298): Illuminate\\Database\\Eloquent\\Model->insertAndSetId()
#8 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1137): Illuminate\\Database\\Eloquent\\Model->performInsert()
#9 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(1025): Illuminate\\Database\\Eloquent\\Model->save()
#10 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Support/helpers.php(307): Illuminate\\Database\\Eloquent\\Builder->Illuminate\\Database\\Eloquent\\{closure}()
#11 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(1024): tap()
#12 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php(23): Illuminate\\Database\\Eloquent\\Builder->create()
#13 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2334): Illuminate\\Database\\Eloquent\\Model->forwardCallTo()
#14 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2346): Illuminate\\Database\\Eloquent\\Model->__call()
#15 /var/www/traewelling-prod/app/Http/Controllers/API/v1/StatusTagController.php(317): Illuminate\\Database\\Eloquent\\Model::__callStatic()
#16 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\API\\v1\\StatusTagController->store()
#17 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction()
#18 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Illuminate\\Routing\\ControllerDispatcher->dispatch()
#19 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController()
#20 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run()
#21 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()
#22 /var/www/traewelling-prod/vendor/laravel/passport/src/Http/Middleware/CheckForAnyScope.php(43): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#23 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Laravel\\Passport\\Http\\Middleware\\CheckForAnyScope->handle()
#24 /var/www/traewelling-prod/app/Http/Middleware/PrivacyPolicyInterceptionMiddleware.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#25 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\PrivacyPolicyInterceptionMiddleware->handle()
#26 /var/www/traewelling-prod/app/Http/Middleware/Language.php(40): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#27 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\Language->handle()
#28 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#29 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
#30 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#31 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Auth\\Middleware\\Authenticate->handle()
#32 /var/www/traewelling-prod/app/Http/Middleware/Api/JsonMiddleware.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#33 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\Api\\JsonMiddleware->handle()
#34 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(159): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#35 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(90): Illuminate\\Routing\\Middleware\\ThrottleRequests->handleRequest()
#36 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\ThrottleRequests->handle()
#37 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#38 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then()
#39 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack()
#40 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute()
#41 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute()
#42 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch()
#43 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()
#44 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#45 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle()
#46 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#47 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle()
#48 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#49 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#50 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
#51 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#52 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#53 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
#54 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#55 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()
#56 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#57 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
#58 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#59 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then()
#60 /var/www/traewelling-prod/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
#61 /var/www/traewelling-prod/public/index.php(61): Illuminate\\Foundation\\Http\\Kernel->handle()
#62 {main}
HerrLevin commented 1 week ago

I'll close this since there are no additional user reports and the bad bad backend seems to be ~fixed~ improved