-
Notifications
You must be signed in to change notification settings - Fork 32
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
error creating database (mongolite) connection in handler #205
Comments
Same segfault error when trying to create a DBI connection to a hosted database. It seems to work when the database is local, however. Like adding using this to make a connection inside a handler causes a big segfault if it is not a local database: conn <- DBI::dbConnect(RPostgres::Postgres(),
host ,
dbname,
user ,
password,
port ) Segfault looks like this:
|
Could you please provide reproducible example for postgres? I've used
postgresql with restrserve in production for years without issue
…On Tue, 21 Nov 2023, 20:33 ncullen93, ***@***.***> wrote:
Same segfault error when trying to create a DBI connection to a hosted
database. It seems to work when the database is local, however.
Like adding using this to make a connection inside a handler causes a big
segfault:
conn <- DBI::dbConnect(RPostgres::Postgres(),
host ,
dbname,
user ,
password,
port )
Segfault looks like this:
*** caught segfault ***
address 0x110, cause 'memory not mapped'
Traceback:
1: connection_create(names(opts), as.vector(opts), check_interrupts)
2: .local(drv, ...)
3: DBI::dbConnect(RPostgres::Postgres(), host = "ec2-107-21-67-46.compute-1.amazonaws.com", ...)
4: DBI::dbConnect(RPostgres::Postgres(), ...)
5: FUN(request, response)
6: eval(quoted_code, env)
7: eval(quoted_code, env)
8: withCallingHandlers(eval(quoted_code, env), error = capture_calls)
9: doTryCatch(return(expr), name, parentenv, handler)
10: tryCatchOne(expr, names, parentenv, handlers[[1L]])
11: tryCatchList(expr, classes, parentenv, handlers)
12: tryCatch(withCallingHandlers(eval(quoted_code, env), error = capture_calls), error = identity)
13: try_capture_stack(expr)
14: private$eval_with_error_handling({ handler_id = private$match_handler(request, response) FUN = private$handlers[[handler_id]] self$logger$trace("", context = list(request_id = request$id, message = sprintf("call handler '%s'", handler_id))) FUN(request, response)})
15: eval(quoted_code, env)
16: eval(quoted_code, env)
17: withCallingHandlers(eval(quoted_code, env), error = capture_calls)
18: doTryCatch(return(expr), name, parentenv, handler)
19: tryCatchOne(expr, names, parentenv, handlers[[1L]])
20: tryCatchList(expr, classes, parentenv, handlers)
21: tryCatch(withCallingHandlers(eval(quoted_code, env), error = capture_calls), error = identity)
22: try_capture_stack(expr)
23: private$eval_with_error_handling({ response$reset() response$set_content_type(self$content_type) self$logger$debug("", context = list(request_id = request$id, request = list(method = request$method, path = request$path, parameters_query = request$parameters_query, parameters_path = request$parameters_path, headers = request$headers))) mw_called = list() mw_flag = "process_request" need_call_handler = TRUE for (id in seq_along(private$middleware)) { mw_id = private$middleware[[id]][["id"]] self$logger$trace("", context = list(request_id = request$id, middleware = mw_id, message = sprintf("call %s middleware", mw_flag))) FUN = private$middleware[[id]][[mw_flag]] mw_status = private$eval_with_error_handling(FUN(request, response)) mw_called[[id]] = id if (!isTRUE(mw_status)) { need_call_handler = FALSE break } } if (isTRUE(need_call_handler)) { private$eval_with_error_handling({ handler_id = private$match_handler(request, response) FUN = private$handlers[[handler_id]] self$logger$trace("", context = list(request_id = request$id, message = sprintf("call handler '%s'", handler_id))) FUN(request, response) }) } mw_flag = "process_response" for (id in rev(mw_called)) { mw_id = private$middleware[[id]][["id"]] self$logger$trace("", context = list(request_id = request$id, middleware = mw_id, message = sprintf("call %s middleware", mw_flag))) FUN = private$middleware[[id]][[mw_flag]] mw_status = private$eval_with_error_handling(FUN(request, response)) } self$logger$debug("", context = list(request_id = request$id, response = list(status_code = response$status_code, headers = response$headers)))})
24: app$process_request()
25: self$convert_response(app$process_request())
26: .http.request("/fetchModels", NULL, NULL, as.raw(c(0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x20, 0x47, 0x45, 0x54, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x30, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x63, 0x75, 0x72, 0x6c, 0x2f, 0x37, 0x2e, 0x37, 0x37, 0x2e, 0x30, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x2a, 0x2f, 0x2a, 0x0a)))
27: doTryCatch(return(expr), name, parentenv, handler)
28: tryCatchOne(expr, names, parentenv, handlers[[1L]])
29: tryCatchList(expr, classes, parentenv, handlers)
30: tryCatch(expr, error = function(e) { call <- conditionCall(e) if (!is.null(call)) { if (identical(call[[1L]], quote(doTryCatch))) call <- sys.call(-4L) dcall <- deparse(call, nlines = 1L) prefix <- paste("Error in", dcall, ": ") LONG <- 75L sm <- strsplit(conditionMessage(e), "\n")[[1L]] w <- 14L + nchar(dcall, type = "w") + nchar(sm[1L], type = "w") if (is.na(w)) w <- 14L + nchar(dcall, type = "b") + nchar(sm[1L], type = "b") if (w > LONG) prefix <- paste0(prefix, "\n ") } else prefix <- "Error : " msg <- paste0(prefix, conditionMessage(e), "\n") .Internal(seterrmessage(msg[1L])) if (!silent && isTRUE(getOption("show.error.messages"))) { cat(msg, file = outFile) .Internal(printDeferredWarnings()) } invisible(structure(msg, class = "try-error", condition = e))})
31: try(.http.request("/fetchModels", NULL, NULL, as.raw(c(0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x20, 0x47, 0x45, 0x54, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x30, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x63, 0x75, 0x72, 0x6c, 0x2f, 0x37, 0x2e, 0x37, 0x37, 0x2e, 0x30, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x2a, 0x2f, 0x2a, 0x0a))), silent = TRUE)
32: (function (..., config.file = "/etc/Rserve.conf") { if (is.null(run_Rserve)) stop("Runnig inside an embedded Rserve instance - starting Rserve recursively is not supported") .Call(run_Rserve, as.character(config.file), sapply(list(...), as.character))})(http.port = 8080, port = 6311)
33: do.call(Rserve::run.Rserve, ARGS)
34: backend$start(app)
An irrecoverable exception occurred. R is aborting now ...
—
Reply to this email directly, view it on GitHub
<#205 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ABHC5XNTMVDIBH6HEPXSKZLYFSNRJAVCNFSM6AAAAAA7ULYUPOVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMRQHAZTSOBVGE>
.
You are receiving this because you are subscribed to this thread.Message
ID: ***@***.***>
|
So weird... just deployed and it works perfectly find on heroku. Must be a local issue, but it's only with hosted databases. Sorry about that. I will close the issue and try to figure it out on my end. |
@ncullen93 the error suggests the you were running it on macOS in an interactive session - or that you included a package which tried to initialize interactive session/run-time. Please make sure the app is started via |
Creating a global mongolite db connection and then trying to grab records in a GET handler works the first time but then leads to a segfault error any subsequent requests. So, I tried to do the recommended thing of creating a db connection in each request. However, for mongo this leads to the following error:
Not sure if this is on mongolite's side, but it would be nice to at least see an example or hear from others who have made some kind of database solution work with RestRserve.
Basic reprex:
The text was updated successfully, but these errors were encountered: