apa512 / clj-rethinkdb

Eclipse Public License 1.0
205 stars 42 forks source link

SocketException: Address already in use: /127.0.0.1:28015 #184

Closed venantius closed 7 years ago

venantius commented 7 years ago

Hey there!

I'm working on a library that opens a number of different RethinkDB client connections and I've been getting the following error sporadically (i.e. if I run tests 20 times this'll show up in maybe 5% of them, which suggests some sort of race condition somewhere).

The thing is that I usually expect an error like this to surface on the server side rather than on the client-side - in other words, the error seems to me to suggest that the driver is attempting to claim a socket that is currently held by the RethinkDB server. I'll concede, however, that I don't actually know what I'm talking about here, so my inference could be completely off.

Is this something that might just happen when the client attempts to open more than one connection to the server at once and the latter attempt fails? What's a good way of handling this?

  actual: clojure.lang.ExceptionInfo: Error connecting to RethinkDB database
 at clojure.core$ex_info.invokeStatic (core.clj:4617)
    clojure.core$ex_info.invoke (core.clj:4617)
    rethinkdb.core$connect.invokeStatic (core.clj:88)
    rethinkdb.core$connect.doInvoke (core.clj:43)
    clojure.lang.RestFn.invoke (RestFn.java:512)
    photon.server.db.PhotonChangeFeed.start (db.clj:66)
    photon.server.db$subscribe_BANG_.invokeStatic (db.clj:91)
    photon.server.db$subscribe_BANG_.invoke (db.clj:79)
    photon.server.db_test$fn__20189.invokeStatic (db_test.clj:86)
    photon.server.db_test/fn (db_test.clj:80)
    clojure.test$test_var$fn__7983.invoke (test.clj:716)
    clojure.test$test_var.invokeStatic (test.clj:716)
    clojure.test$test_var.invoke (test.clj:707)
    clojure.test$test_vars$fn__8005$fn__8010.invoke (test.clj:734)
    clojure.test$default_fixture.invokeStatic (test.clj:686)
    clojure.test$default_fixture.invoke (test.clj:682)
    clojure.test$test_vars$fn__8005.invoke (test.clj:734)
    clojure.test$default_fixture.invokeStatic (test.clj:686)
    clojure.test$default_fixture.invoke (test.clj:682)
    clojure.test$test_vars.invokeStatic (test.clj:730)
    clojure.test$test_all_vars.invokeStatic (test.clj:736)
    clojure.test$test_ns.invokeStatic (test.clj:757)
    clojure.test$test_ns.invoke (test.clj:742)
    clojure.core$map$fn__4785.invoke (core.clj:2646)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.boundedLength (RT.java:1749)
    clojure.lang.RestFn.applyTo (RestFn.java:130)
    clojure.core$apply.invokeStatic (core.clj:648)
    clojure.test$run_tests.invokeStatic (test.clj:767)
    clojure.test$run_tests.doInvoke (test.clj:767)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:646)
    clojure.core$apply.invoke (core.clj:641)
    user$eval3201$fn__3260$fn__3291.invoke (form-init879251228753756092.clj:1)
    user$eval3201$fn__3260$fn__3261.invoke (form-init879251228753756092.clj:1)
    user$eval3201$fn__3260.invoke (form-init879251228753756092.clj:1)
    user$eval3201.invokeStatic (form-init879251228753756092.clj:1)
    user$eval3201.invoke (form-init879251228753756092.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:6927)
    clojure.lang.Compiler.eval (Compiler.java:6917)
    clojure.lang.Compiler.load (Compiler.java:7379)
    clojure.lang.Compiler.loadFile (Compiler.java:7317)
    clojure.main$load_script.invokeStatic (main.clj:275)
    clojure.main$init_opt.invokeStatic (main.clj:277)
    clojure.main$init_opt.invoke (main.clj:277)
    clojure.main$initialize.invokeStatic (main.clj:308)
    clojure.main$null_opt.invokeStatic (main.clj:342)
    clojure.main$null_opt.invoke (main.clj:339)
    clojure.main$main.invokeStatic (main.clj:421)
    clojure.main$main.doInvoke (main.clj:384)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)
Caused by: java.net.SocketException: Address already in use: /127.0.0.1:28015
 at sun.nio.ch.Net.connect0 (Net.java:-2)
    sun.nio.ch.Net.connect (Net.java:457)
    sun.nio.ch.Net.connect (Net.java:449)
    sun.nio.ch.SocketChannelImpl.connect (SocketChannelImpl.java:647)
    io.netty.channel.socket.nio.NioSocketChannel.doConnect (NioSocketChannel.java:210)
    io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.connect (AbstractNioChannel.java:207)
    io.netty.channel.DefaultChannelPipeline$HeadContext.connect (DefaultChannelPipeline.java:1406)
    io.netty.channel.ChannelHandlerInvokerUtil.invokeConnectNow (ChannelHandlerInvokerUtil.java:117)
    io.netty.channel.DefaultChannelHandlerInvoker.invokeConnect (DefaultChannelHandlerInvoker.java:239)
    io.netty.channel.AbstractChannelHandlerContext.invokeConnect (AbstractChannelHandlerContext.java:371)
    io.netty.channel.AbstractChannelHandlerContext.connect (AbstractChannelHandlerContext.java:208)
    aleph.tcp$client_channel_handler$reify__19474.connect (tcp.clj:93)
    io.netty.channel.ChannelHandlerInvokerUtil.invokeConnectNow (ChannelHandlerInvokerUtil.java:117)
    io.netty.channel.DefaultChannelHandlerInvoker.invokeConnect (DefaultChannelHandlerInvoker.java:239)
    io.netty.channel.AbstractChannelHandlerContext.invokeConnect (AbstractChannelHandlerContext.java:371)
    io.netty.channel.AbstractChannelHandlerContext.connect (AbstractChannelHandlerContext.java:208)
    io.netty.channel.AbstractChannelHandlerContext.connect (AbstractChannelHandlerContext.java:202)
    io.netty.channel.DefaultChannelPipeline.connect (DefaultChannelPipeline.java:1140)
    io.netty.channel.AbstractChannel.connect (AbstractChannel.java:245)
    io.netty.bootstrap.Bootstrap$3.run (Bootstrap.java:234)
    io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks (SingleThreadEventExecutor.java:339)
    io.netty.channel.nio.NioEventLoop.run (NioEventLoop.java:356)
    io.netty.util.concurrent.SingleThreadEventExecutor$5.run (SingleThreadEventExecutor.java:742)
    io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run (DefaultThreadFactory.java:137)
    java.lang.Thread.run (Thread.java:745)
venantius commented 7 years ago

This seems to have been an issue with the RethinkDB server repeatedly trying to give out the same connection port - re-starting the database has caused this error to stop showing up. Sorry for the false alarm.