scicloj / clojisr

Clojure speaks statistics - a bridge between Clojure to R
https://scicloj.github.io/clojisr/
Eclipse Public License 2.0
147 stars 9 forks source link

When requiring ns, get "Connection refused" #62

Closed tuh8888 closed 3 years ago

tuh8888 commented 4 years ago

Following the steps in the README for testing if the installation works, upon requiring the ns

$ clj -Sdeps '{:deps {scicloj/clojisr {:mvn/version "1.0.0-BETA10"}}}'
user=> (require '[clojisr.v1.r :refer [r]])

I am told that the "Connection refused" (see 1. in stacktrace). From what I can tell, clojisr is attempting to start Rserve via the command

$ /usr/bin/R --no-save --slave -e "library(Rserve); run.Rserve(port=44735);"

By requiring the rserve ns first, I can see that this is the default port.

(require '[clojisr.v1.rserve :as rserve])
(rserve/set-as-default!)
;; {:port 44735, :session-type :rserve}

I have verified that my Rserve package is the recommended version.

> sessionInfo()
R version 4.0.0 (2020-04-24)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Manjaro Linux

...

other attached packages:
[1] Rserve_1.8-6

loaded via a namespace (and not attached):
[1] compiler_4.0.0  grid_4.0.0      lattice_0.20-41

And I am using scicloj/clojisr {:mvn/version "1.0.0-BETA10"} in my deps.edn.

What am I missing?

Stacktrace:

  1. Unhandled clojure.lang.Compiler$CompilerException Error compiling r.clj at (118:10)
``` #:clojure.error{:phase :execution, :line 118, :column 10, :source "r.clj"} Compiler.java: 3707 clojure.lang.Compiler$InvokeExpr/eval Compiler.java: 457 clojure.lang.Compiler$DefExpr/eval Compiler.java: 7182 clojure.lang.Compiler/eval Compiler.java: 7636 clojure.lang.Compiler/load RT.java: 381 clojure.lang.RT/loadResourceScript RT.java: 372 clojure.lang.RT/loadResourceScript RT.java: 459 clojure.lang.RT/load RT.java: 424 clojure.lang.RT/load core.clj: 6126 clojure.core/load/fn core.clj: 6125 clojure.core/load core.clj: 6109 clojure.core/load RestFn.java: 408 clojure.lang.RestFn/invoke core.clj: 5908 clojure.core/load-one core.clj: 5903 clojure.core/load-one core.clj: 5948 clojure.core/load-lib/fn core.clj: 5947 clojure.core/load-lib core.clj: 5928 clojure.core/load-lib RestFn.java: 142 clojure.lang.RestFn/applyTo core.clj: 667 clojure.core/apply core.clj: 5985 clojure.core/load-libs core.clj: 5969 clojure.core/load-libs RestFn.java: 137 clojure.lang.RestFn/applyTo core.clj: 667 clojure.core/apply core.clj: 6007 clojure.core/require core.clj: 6007 clojure.core/require RestFn.java: 408 clojure.lang.RestFn/invoke REPL: 61 user/eval57512 REPL: 61 user/eval57512 Compiler.java: 7177 clojure.lang.Compiler/eval Compiler.java: 7132 clojure.lang.Compiler/eval core.clj: 3214 clojure.core/eval core.clj: 3210 clojure.core/eval interruptible_eval.clj: 91 nrepl.middleware.interruptible-eval/evaluate/fn main.clj: 437 clojure.main/repl/read-eval-print/fn main.clj: 437 clojure.main/repl/read-eval-print main.clj: 458 clojure.main/repl/fn main.clj: 458 clojure.main/repl main.clj: 368 clojure.main/repl RestFn.java: 137 clojure.lang.RestFn/applyTo core.clj: 665 clojure.core/apply core.clj: 660 clojure.core/apply regrow.clj: 20 refactor-nrepl.ns.slam.hound.regrow/wrap-clojure-repl/fn RestFn.java: 1523 clojure.lang.RestFn/invoke interruptible_eval.clj: 84 nrepl.middleware.interruptible-eval/evaluate interruptible_eval.clj: 56 nrepl.middleware.interruptible-eval/evaluate interruptible_eval.clj: 155 nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn AFn.java: 22 clojure.lang.AFn/run session.clj: 190 nrepl.middleware.session/session-exec/main-loop/fn session.clj: 189 nrepl.middleware.session/session-exec/main-loop AFn.java: 22 clojure.lang.AFn/run Thread.java: 830 java.lang.Thread/run ```
  1. Caused by org.rosuda.REngine.Rserve.RserveException Cannot connect: Connection refused
``` RConnection.java: 90 org.rosuda.REngine.Rserve.RConnection/ RConnection.java: 60 org.rosuda.REngine.Rserve.RConnection/ session.clj: 115 clojisr.v1.impl.rserve.session/make session.clj: 105 clojisr.v1.impl.rserve.session/make session.clj: 46 clojisr.v1.session/make session.clj: 37 clojisr.v1.session/make session.clj: 98 clojisr.v1.session/make-and-init session.clj: 97 clojisr.v1.session/make-and-init session.clj: 104 clojisr.v1.session/fetch-or-make session.clj: 102 clojisr.v1.session/fetch-or-make r.clj: 23 clojisr.v1.r/r r.clj: 22 clojisr.v1.r/r RestFn.java: 410 clojure.lang.RestFn/invoke AFn.java: 154 clojure.lang.AFn/applyToHelper RestFn.java: 132 clojure.lang.RestFn/applyTo Compiler.java: 3702 clojure.lang.Compiler$InvokeExpr/eval Compiler.java: 457 clojure.lang.Compiler$DefExpr/eval Compiler.java: 7182 clojure.lang.Compiler/eval Compiler.java: 7636 clojure.lang.Compiler/load RT.java: 381 clojure.lang.RT/loadResourceScript RT.java: 372 clojure.lang.RT/loadResourceScript RT.java: 459 clojure.lang.RT/load RT.java: 424 clojure.lang.RT/load core.clj: 6126 clojure.core/load/fn core.clj: 6125 clojure.core/load core.clj: 6109 clojure.core/load RestFn.java: 408 clojure.lang.RestFn/invoke core.clj: 5908 clojure.core/load-one core.clj: 5903 clojure.core/load-one core.clj: 5948 clojure.core/load-lib/fn core.clj: 5947 clojure.core/load-lib core.clj: 5928 clojure.core/load-lib RestFn.java: 142 clojure.lang.RestFn/applyTo core.clj: 667 clojure.core/apply core.clj: 5985 clojure.core/load-libs core.clj: 5969 clojure.core/load-libs RestFn.java: 137 clojure.lang.RestFn/applyTo core.clj: 667 clojure.core/apply core.clj: 6007 clojure.core/require core.clj: 6007 clojure.core/require RestFn.java: 408 clojure.lang.RestFn/invoke REPL: 61 user/eval57512 REPL: 61 user/eval57512 Compiler.java: 7177 clojure.lang.Compiler/eval Compiler.java: 7132 clojure.lang.Compiler/eval core.clj: 3214 clojure.core/eval core.clj: 3210 clojure.core/eval interruptible_eval.clj: 91 nrepl.middleware.interruptible-eval/evaluate/fn main.clj: 437 clojure.main/repl/read-eval-print/fn main.clj: 437 clojure.main/repl/read-eval-print main.clj: 458 clojure.main/repl/fn main.clj: 458 clojure.main/repl main.clj: 368 clojure.main/repl RestFn.java: 137 clojure.lang.RestFn/applyTo core.clj: 665 clojure.core/apply core.clj: 660 clojure.core/apply regrow.clj: 20 refactor-nrepl.ns.slam.hound.regrow/wrap-clojure-repl/fn RestFn.java: 1523 clojure.lang.RestFn/invoke interruptible_eval.clj: 84 nrepl.middleware.interruptible-eval/evaluate interruptible_eval.clj: 56 nrepl.middleware.interruptible-eval/evaluate interruptible_eval.clj: 155 nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn AFn.java: 22 clojure.lang.AFn/run session.clj: 190 nrepl.middleware.session/session-exec/main-loop/fn session.clj: 189 nrepl.middleware.session/session-exec/main-loop AFn.java: 22 clojure.lang.AFn/run Thread.java: 830 java.lang.Thread/run ```
  1. Caused by java.net.ConnectException Connection refused
``` Net.java: -2 sun.nio.ch.Net/connect0 Net.java: 493 sun.nio.ch.Net/connect Net.java: 482 sun.nio.ch.Net/connect NioSocketImpl.java: 588 sun.nio.ch.NioSocketImpl/connect SocksSocketImpl.java: 339 java.net.SocksSocketImpl/connect Socket.java: 603 java.net.Socket/connect Socket.java: 552 java.net.Socket/connect Socket.java: 475 java.net.Socket/ Socket.java: 249 java.net.Socket/ RConnection.java: 85 org.rosuda.REngine.Rserve.RConnection/ RConnection.java: 60 org.rosuda.REngine.Rserve.RConnection/ session.clj: 115 clojisr.v1.impl.rserve.session/make session.clj: 105 clojisr.v1.impl.rserve.session/make session.clj: 46 clojisr.v1.session/make session.clj: 37 clojisr.v1.session/make session.clj: 98 clojisr.v1.session/make-and-init session.clj: 97 clojisr.v1.session/make-and-init session.clj: 104 clojisr.v1.session/fetch-or-make session.clj: 102 clojisr.v1.session/fetch-or-make r.clj: 23 clojisr.v1.r/r r.clj: 22 clojisr.v1.r/r RestFn.java: 410 clojure.lang.RestFn/invoke AFn.java: 154 clojure.lang.AFn/applyToHelper RestFn.java: 132 clojure.lang.RestFn/applyTo Compiler.java: 3702 clojure.lang.Compiler$InvokeExpr/eval Compiler.java: 457 clojure.lang.Compiler$DefExpr/eval Compiler.java: 7182 clojure.lang.Compiler/eval Compiler.java: 7636 clojure.lang.Compiler/load RT.java: 381 clojure.lang.RT/loadResourceScript RT.java: 372 clojure.lang.RT/loadResourceScript RT.java: 459 clojure.lang.RT/load RT.java: 424 clojure.lang.RT/load core.clj: 6126 clojure.core/load/fn core.clj: 6125 clojure.core/load core.clj: 6109 clojure.core/load RestFn.java: 408 clojure.lang.RestFn/invoke core.clj: 5908 clojure.core/load-one core.clj: 5903 clojure.core/load-one core.clj: 5948 clojure.core/load-lib/fn core.clj: 5947 clojure.core/load-lib core.clj: 5928 clojure.core/load-lib RestFn.java: 142 clojure.lang.RestFn/applyTo core.clj: 667 clojure.core/apply core.clj: 5985 clojure.core/load-libs core.clj: 5969 clojure.core/load-libs RestFn.java: 137 clojure.lang.RestFn/applyTo core.clj: 667 clojure.core/apply core.clj: 6007 clojure.core/require core.clj: 6007 clojure.core/require RestFn.java: 408 clojure.lang.RestFn/invoke REPL: 61 user/eval57512 REPL: 61 user/eval57512 Compiler.java: 7177 clojure.lang.Compiler/eval Compiler.java: 7132 clojure.lang.Compiler/eval core.clj: 3214 clojure.core/eval core.clj: 3210 clojure.core/eval interruptible_eval.clj: 91 nrepl.middleware.interruptible-eval/evaluate/fn main.clj: 437 clojure.main/repl/read-eval-print/fn main.clj: 437 clojure.main/repl/read-eval-print main.clj: 458 clojure.main/repl/fn main.clj: 458 clojure.main/repl main.clj: 368 clojure.main/repl RestFn.java: 137 clojure.lang.RestFn/applyTo core.clj: 665 clojure.core/apply core.clj: 660 clojure.core/apply regrow.clj: 20 refactor-nrepl.ns.slam.hound.regrow/wrap-clojure-repl/fn RestFn.java: 1523 clojure.lang.RestFn/invoke interruptible_eval.clj: 84 nrepl.middleware.interruptible-eval/evaluate interruptible_eval.clj: 56 nrepl.middleware.interruptible-eval/evaluate interruptible_eval.clj: 155 nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn AFn.java: 22 clojure.lang.AFn/run session.clj: 190 nrepl.middleware.session/session-exec/main-loop/fn session.clj: 189 nrepl.middleware.session/session-exec/main-loop AFn.java: 22 clojure.lang.AFn/run Thread.java: 830 java.lang.Thread/run ```
genmeblog commented 4 years ago

We haven't tested clojisr on R 4.0.0, maybe this is an issuse? Can you also try 1.0.0-BETA11-SNAPSHOT.

Also check if that port is accessible (not blocked by firewall). Port is selected randomly.

tuh8888 commented 4 years ago

After downgrading to R 3.6.3 and then reinstalling Rserve (making sure that I got v1.8.6) and making sure that there were no sessions caches (r/discard-all-sessions), I got it to reliably startup with clojisr 1.0.0-BETA10 and clojisr 1.0.0-BETA11-SNAPSHOT. I look forward to now getting to try this thing out!

It might be worth noting in the README that R 4.0.0 doesn't work atm.

As I was testing things, trying to get this to work, I noticed a design decision that makes it really difficult to get going. In r.clj, there are a series of statements e.g.

(def r== (r "`==`"))

that attempt to establish a connection when requiring

(require '[clojisr.v1.r  :as r])

If the connection refuses during the require, then the require will fail and the namespace will not be loaded. When this happens, I couldn't attempt to re-require (if I do I get No such namespace: r) and so must restart the whole REPL.

If those def statements weren't in there, then I could make changes to my environment like fixing the R and Rserve versions, without constantly having to reinit the REPL.

genmeblog commented 4 years ago

Thanks for your comment and test against R4 (I wasn't aware it was available already).

Regarding session establishing. We are aware of this problem and currently Daniel is rewriting session management to make connection when it's requested by user call. So this problem will vanish. Stay tuned.

lccambiaghi commented 4 years ago

Hi, maybe it is worth reopening this issue. I also get

10:28:28.156 [main] INFO  clojisr.v1.impl.rserve.proc - [:clojisr.v1.impl.rserve.proc/spawn {:process ("/usr/local/bin/R" "--no-save" "--slave" "-e" "library(Rserve); run.Rserve(port=50197);")}] {  }
Execution error (ConnectException) at java.net.PlainSocketImpl/socketConnect (PlainSocketImpl.java:-2).
Connection refused (Connection refused)

I installed latest Rserve as described. I tried to fetch the latest commit on master to see if the problem was with the "--no-restore-data" flag but no luck. The funny thing is that if I downgrade to Rserve_1.7-3.1 from CRAN version I can get past the Connection refused but I get the "long vectors not supported yet" error.

Ho can I help you debug this error? As we stand now, I would say that following the installation instruction on the README does not get a first user to a functioning environment :(

genmeblog commented 4 years ago

Could you give more information about an environment? What system and setup with versions (OS, Java, Clojure, R)?

Rserve 1.7 doesn't work at all with latest Java API.

genmeblog commented 4 years ago

Also please post full stack trace.

lccambiaghi commented 4 years ago

Ok I managed to pinpoint the problem: I must have been left some abandoned R process (even though I ran this command kill $(ps aux | grep 'library(Rserve)' | awk '{print $2}') to try to kill previous sessions).

After logging out and in, I created a "fresh" R project, ran in an R console:

packrat::init()
install.packages("Rserve",,"http://rforge.net", type="source")

and in a shell:

clj -Sdeps '{:deps {scicloj/clojisr {:mvn/version "1.0.0-BETA10"}}}'
user=> (require '[clojisr.v1.r :refer [r]])

and I could see it succeed.

In the R project I was trying to start up, I was using the newly released renv (https://github.com/rstudio/renv). After downgrading to packrat everything worked.

I can't really think of working without (virtual) environments to separate my project dependencies so I think it would be nice to get renv support at some point because packrat does not play nicely with Rserve installed from source.

Are you still interested in my environment details and stacktrace?

genmeblog commented 4 years ago

Yes, sure, this can be very helpful. Though, we rely on Rserve R<->Java connectivity and it's known to have issues.

lccambiaghi commented 4 years ago

Environment:

I got a "Connection refused again" after closing a REPL session and starting another one. It must be because of the abandoned R session described in the README. I ran (clojisr.v1.session/discard-all) and the problem was solved. Is Rserve the preferred backend? Is there any plan to make it more robust or to switch to something else? Thank you very much for your work!!

Full stacktrace:

clojure.lang.Compiler$CompilerException: Syntax error macroexpanding at (r.clj:118:10).
#:clojure.error{:phase :execution, :line 118, :column 10, :source "r.clj"}
 at clojure.lang.Compiler$InvokeExpr.eval (Compiler.java:3707)
    clojure.lang.Compiler$DefExpr.eval (Compiler.java:457)
    clojure.lang.Compiler.eval (Compiler.java:7182)
    clojure.lang.Compiler.load (Compiler.java:7636)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:459)
    clojure.lang.RT.load (RT.java:424)
    clojure.core$load$fn__6839.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6780.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    clojurecast.main$eval1401$loading__6721__auto____1402.invoke (main.clj:1)
    clojurecast.main$eval1401.invokeStatic (main.clj:1)
    clojurecast.main$eval1401.invoke (main.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:7177)
    clojure.lang.Compiler.eval (Compiler.java:7166)
    clojure.lang.Compiler.load (Compiler.java:7636)
    clojurecast.main$eval1397.invokeStatic (NO_SOURCE_FILE:1)
    clojurecast.main$eval1397.invoke (NO_SOURCE_FILE:1)
    clojure.lang.Compiler.eval (Compiler.java:7177)
    clojure.lang.Compiler.eval (Compiler.java:7132)
    clojure.core$eval.invokeStatic (core.clj:3214)
    clojure.core$eval.invoke (core.clj:3210)
    nrepl.middleware.interruptible_eval$evaluate$fn__943.invoke (interruptible_eval.clj:91)
    clojure.main$repl$read_eval_print__9086$fn__9089.invoke (main.clj:437)
    clojure.main$repl$read_eval_print__9086.invoke (main.clj:437)
    clojure.main$repl$fn__9095.invoke (main.clj:458)
    clojure.main$repl.invokeStatic (main.clj:458)
    clojure.main$repl.doInvoke (main.clj:368)
    clojure.lang.RestFn.invoke (RestFn.java:1523)
    nrepl.middleware.interruptible_eval$evaluate.invokeStatic (interruptible_eval.clj:84)
    nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:56)
    nrepl.middleware.interruptible_eval$interruptible_eval$fn__969$fn__973.invoke (interruptible_eval.clj:155)
    clojure.lang.AFn.run (AFn.java:22)
    nrepl.middleware.session$session_exec$main_loop__1070$fn__1074.invoke (session.clj:190)
    nrepl.middleware.session$session_exec$main_loop__1070.invoke (session.clj:189)
    clojure.lang.AFn.run (AFn.java:22)
    java.lang.Thread.run (Thread.java:748)
Caused by: org.rosuda.REngine.Rserve.RserveException: Cannot connect: Connection refused (Connection refused)
 at org.rosuda.REngine.Rserve.RConnection.<init> (RConnection.java:90)
    org.rosuda.REngine.Rserve.RConnection.<init> (RConnection.java:60)
    clojisr.v1.impl.rserve.session$make.invokeStatic (session.clj:115)
    clojisr.v1.impl.rserve.session$make.invoke (session.clj:105)
    clojisr.v1.session$make.invokeStatic (session.clj:46)
    clojisr.v1.session$make.invoke (session.clj:37)
    clojisr.v1.session$make_and_init.invokeStatic (session.clj:98)
    clojisr.v1.session$make_and_init.invoke (session.clj:97)
    clojisr.v1.session$fetch_or_make.invokeStatic (session.clj:104)
    clojisr.v1.session$fetch_or_make.invoke (session.clj:102)
    clojisr.v1.r$r.invokeStatic (r.clj:23)
    clojisr.v1.r$r.doInvoke (r.clj:22)
    clojure.lang.RestFn.invoke (RestFn.java:410)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.RestFn.applyTo (RestFn.java:132)
    clojure.lang.Compiler$InvokeExpr.eval (Compiler.java:3702)
    clojure.lang.Compiler$DefExpr.eval (Compiler.java:457)
    clojure.lang.Compiler.eval (Compiler.java:7182)
    clojure.lang.Compiler.load (Compiler.java:7636)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:459)
    clojure.lang.RT.load (RT.java:424)
    clojure.core$load$fn__6839.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6780.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    clojurecast.main$eval1401$loading__6721__auto____1402.invoke (main.clj:1)
    clojurecast.main$eval1401.invokeStatic (main.clj:1)
    clojurecast.main$eval1401.invoke (main.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:7177)
    clojure.lang.Compiler.eval (Compiler.java:7166)
    clojure.lang.Compiler.load (Compiler.java:7636)
    clojurecast.main$eval1397.invokeStatic (NO_SOURCE_FILE:1)
    clojurecast.main$eval1397.invoke (NO_SOURCE_FILE:1)
    clojure.lang.Compiler.eval (Compiler.java:7177)
    clojure.lang.Compiler.eval (Compiler.java:7132)
    clojure.core$eval.invokeStatic (core.clj:3214)
    clojure.core$eval.invoke (core.clj:3210)
    nrepl.middleware.interruptible_eval$evaluate$fn__943.invoke (interruptible_eval.clj:91)
    clojure.main$repl$read_eval_print__9086$fn__9089.invoke (main.clj:437)
    clojure.main$repl$read_eval_print__9086.invoke (main.clj:437)
    clojure.main$repl$fn__9095.invoke (main.clj:458)
    clojure.main$repl.invokeStatic (main.clj:458)
    clojure.main$repl.doInvoke (main.clj:368)
    clojure.lang.RestFn.invoke (RestFn.java:1523)
    nrepl.middleware.interruptible_eval$evaluate.invokeStatic (interruptible_eval.clj:84)
    nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:56)
    nrepl.middleware.interruptible_eval$interruptible_eval$fn__969$fn__973.invoke (interruptible_eval.clj:155)
    clojure.lang.AFn.run (AFn.java:22)
    nrepl.middleware.session$session_exec$main_loop__1070$fn__1074.invoke (session.clj:190)
    nrepl.middleware.session$session_exec$main_loop__1070.invoke (session.clj:189)
    clojure.lang.AFn.run (AFn.java:22)
    java.lang.Thread.run (Thread.java:748)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
 at java.net.PlainSocketImpl.socketConnect (PlainSocketImpl.java:-2)
    java.net.AbstractPlainSocketImpl.doConnect (AbstractPlainSocketImpl.java:350)
    java.net.AbstractPlainSocketImpl.connectToAddress (AbstractPlainSocketImpl.java:206)
    java.net.AbstractPlainSocketImpl.connect (AbstractPlainSocketImpl.java:188)
    java.net.SocksSocketImpl.connect (SocksSocketImpl.java:392)
    java.net.Socket.connect (Socket.java:589)
    java.net.Socket.connect (Socket.java:538)
    java.net.Socket.<init> (Socket.java:434)
    java.net.Socket.<init> (Socket.java:211)
    org.rosuda.REngine.Rserve.RConnection.<init> (RConnection.java:85)
    org.rosuda.REngine.Rserve.RConnection.<init> (RConnection.java:60)
    clojisr.v1.impl.rserve.session$make.invokeStatic (session.clj:115)
    clojisr.v1.impl.rserve.session$make.invoke (session.clj:105)
    clojisr.v1.session$make.invokeStatic (session.clj:46)
    clojisr.v1.session$make.invoke (session.clj:37)
    clojisr.v1.session$make_and_init.invokeStatic (session.clj:98)
    clojisr.v1.session$make_and_init.invoke (session.clj:97)
    clojisr.v1.session$fetch_or_make.invokeStatic (session.clj:104)
    clojisr.v1.session$fetch_or_make.invoke (session.clj:102)
    clojisr.v1.r$r.invokeStatic (r.clj:23)
    clojisr.v1.r$r.doInvoke (r.clj:22)
    clojure.lang.RestFn.invoke (RestFn.java:410)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.RestFn.applyTo (RestFn.java:132)
    clojure.lang.Compiler$InvokeExpr.eval (Compiler.java:3702)
    clojure.lang.Compiler$DefExpr.eval (Compiler.java:457)
    clojure.lang.Compiler.eval (Compiler.java:7182)
    clojure.lang.Compiler.load (Compiler.java:7636)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:459)
    clojure.lang.RT.load (RT.java:424)
    clojure.core$load$fn__6839.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6780.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    clojurecast.main$eval1401$loading__6721__auto____1402.invoke (main.clj:1)
    clojurecast.main$eval1401.invokeStatic (main.clj:1)
    clojurecast.main$eval1401.invoke (main.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:7177)
    clojure.lang.Compiler.eval (Compiler.java:7166)
    clojure.lang.Compiler.load (Compiler.java:7636)
    clojurecast.main$eval1397.invokeStatic (NO_SOURCE_FILE:1)
    clojurecast.main$eval1397.invoke (NO_SOURCE_FILE:1)
    clojure.lang.Compiler.eval (Compiler.java:7177)
    clojure.lang.Compiler.eval (Compiler.java:7132)
    clojure.core$eval.invokeStatic (core.clj:3214)
    clojure.core$eval.invoke (core.clj:3210)
    nrepl.middleware.interruptible_eval$evaluate$fn__943.invoke (interruptible_eval.clj:91)
    clojure.main$repl$read_eval_print__9086$fn__9089.invoke (main.clj:437)
    clojure.main$repl$read_eval_print__9086.invoke (main.clj:437)
    clojure.main$repl$fn__9095.invoke (main.clj:458)
    clojure.main$repl.invokeStatic (main.clj:458)
    clojure.main$repl.doInvoke (main.clj:368)
    clojure.lang.RestFn.invoke (RestFn.java:1523)
    nrepl.middleware.interruptible_eval$evaluate.invokeStatic (interruptible_eval.clj:84)
    nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:56)
    nrepl.middleware.interruptible_eval$interruptible_eval$fn__969$fn__973.invoke (interruptible_eval.clj:155)
    clojure.lang.AFn.run (AFn.java:22)
    nrepl.middleware.session$session_exec$main_loop__1070$fn__1074.invoke (session.clj:190)
    nrepl.middleware.session$session_exec$main_loop__1070.invoke (session.clj:189)
    clojure.lang.AFn.run (AFn.java:22)
    java.lang.Thread.run (Thread.java:748)
genmeblog commented 4 years ago

What do you mean by closing REPL session? It doesn't mean closing Java, right (closing Java kills R process)? It should be case where connection between java and R is closed (but why?). Anyway - @daslu works on new session management which should help better session management.

Regarding other backends: Renjin - not functional, FastR - hard to manage, there is also Rserve through JRI (rJava) - maybe this is better way that fighting with sockets...

lccambiaghi commented 4 years ago

Thank you for your help. By “closing the REPL session” I mean that I had to restart my ‘clj’ session to add a dependency. In that instance I got a connection refused, which I solved by discarding sessions :)

genmeblog commented 4 years ago

That's strange. Since all the context (like session) lives on JVM. So session connection should be kept. I don't know then what closing REPL session changes on JVM side. I need to experiment with this later.

genmeblog commented 4 years ago

Ok, I can confirm I've got the same error and it's unpredictable behaviour.

genmeblog commented 3 years ago

There was very optimistic creation of connection to RServe. My observation was that when system has high load, process and server creation can take more time than expected. Refactoring it to make it safer and try to connect several times before giving up.

Also refactoring will get rid of clojisr.v1.rserve and clojisr.v1.renjin namespaces. Default engine is :rserve. In order to change it you'll need to call clojisr.v1.r/set-default-session-type! with session type as keyword: :rserve or :renjin.

genmeblog commented 3 years ago

Looks like fixes are working, please wait for BETA14 release

INFO: [:clojisr.v1.session/make-session {:action :new-session, :id nil, :actual-session-args {:session-type :rserve}}]
Jul 10, 2020 1:21:34 PM clojure.tools.logging$eval23572$fn__23575 invoke
INFO: [:clojisr.v1.impl.rserve.proc/spawn {:process ("/usr/bin/R" "--no-save" "--no-restore-data" "--slave" "-e" "library(Rserve); run.Rserve(port=65187);")}]
Jul 10, 2020 1:21:37 PM clojure.tools.logging$eval23572$fn__23575 invoke
WARNING: [:clojisr.v1.impl.rserve.session/make-rserve {:exception {:via [{:type org.rosuda.REngine.Rserve.RserveException, :message "Cannot connect: Connection refused (Connection refused)", :at [org.rosuda.REngine.Rserve.RConnection <init> "RConnection.java" 90]} {:type java.net.ConnectException, :message "Connection refused (Connection refused)", :at [java.net.PlainSocketImpl socketConnect "PlainSocketImpl.java" -2]}], :cause "Connection refused (Connection refused)"}, :message "Exception during connection to RServe, trying once more."}]
Jul 10, 2020 1:21:37 PM clojure.tools.logging$eval23572$fn__23575 invoke
WARNING: [:clojisr.v1.impl.rserve.session/make-rserve {:message "Waiting for connection to the RServe."}]
Jul 10, 2020 1:21:38 PM clojure.tools.logging$eval23572$fn__23575 invoke
INFO: [:clojisr.v1.impl.rserve.session/rserve-print-loop {:action :started, :session-args {:session-type :rserve}}]
-- running Rserve in this R session (pid=23065), 1 server(s) --
[1] "."
user> 
genmeblog commented 3 years ago

BETA14 on clojars now.