Exception while interacting with MongoDB using Java - mongodb

I am trying to connect to MongoDB 3.6 with Java. When I tried to interact with the database, I received the following exception
Timed out after 30000 ms while waiting for a server that matches WritableServerSelector.
Client view of cluster state is {type=REPLICA_SET, servers=[{address=localhost:27017,
type=REPLICA_SET_GHOST, roundTripTime=0.8 ms, state=CONNECTED}]. Cause: Timed out after 30000
ms while waiting for a server that matches WritableServerSelector.
Why am I getting this error? What does it mean and how to solve this ?

Related

Connecting to MongoDB / Atlas from pyspark (DataProc) is getting Error

Getting the Below error when trying to connect to mongodb via PySpark(Google DATAPROC), its happening both locally and in Dataproc in GCP. We’re getting the below errors:
py4j.protocol.Py4JJavaError: An error occurred while calling o68.load.
: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while
waiting to connect. Client view of cluster state is {type=UNKNOWN,
servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING,
exception={com.mongodb.MongoSocketOpenException: Exception opening
socket}, caused by {java.net.ConnectException: Connection refused
(Connection refused)}}]
org.mongodb.driver.cluster: Exception in monitor thread while
connecting to server localhost:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
I’ve been using the below command to submit jobs to dataproc. But we’re not sure where the problem is.
gcloud dataproc jobs submit pyspark gs://initmatch/dataproc/files/mongo_spark.py
--cluster=custom-cluster-no-address --region=us-west1 --jars=gs://initmatch/dataproc/jars/mongo-spark-connector-10.0.5.jar,
gs://initmatch/dataproc/jars/mongodb-driver-core-4.8.1.jar,
gs://initmatch/dataproc/jars/mongodb-driver-sync-4.8.1.jar

MongoDB connection drops

The connection from applications in the Kubernetes cluster to the Mongo DB (Atlas) basically works. However, sometimes the connection drops and I can't figure out why. There are two different errors in my logs that seem to be related:
Timed out after 30000 ms while waiting for a server that matches WritableServerSelector. Client view of cluster state is {type=REPLICA_SET, servers=[{address=xxxxx-tedsb.gcp.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection timed out}}, {address=xxxxx-shard-00-01-tedsb.gcp.mongodb.net:27017, type=REPLICA_SET_SECONDARY, TagSet{[Tag{name='nodeType', value='ELECTABLE'}, Tag{name='provider', value='GCP'}, Tag{name='region', value='EUROPE_NORTH_1'}]}, roundTripTime=34.3 ms, state=CONNECTED}, {address=xxxxx.gcp.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection timed out}}]
and
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.connection.TlsChannelStreamFactoryFactory$TlsChannelStream.lambda$openAsync$0(TlsChannelStreamFactoryFactory.java:246)
at com.mongodb.connection.TlsChannelStreamFactoryFactory$SelectorMonitor.lambda$start$0(TlsChannelStreamFactoryFactory.java:141)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.net.ConnectException: Connection timed out
at java.base/sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source)
at com.mongodb.connection.TlsChannelStreamFactoryFactory$TlsChannelStream.lambda$openAsync$0(TlsChannelStreamFactoryFactory.java:218)
... 2 more
I'm not hitting the limit of number of connections and the pod itself is also not under pressure (memory, cpu, disk space). Same goes for the JVM. I'm using the official drivers ("org.mongodb.scala" %% "mongo-scala-driver" % "4.1.0") and Mongo 4.2.8.
The configuration I'm using is pretty basic:
private val uri = configuration.get[String]("mongodb.uri")
private val clientSettings = MongoClientSettings
.builder()
.uuidRepresentation(UuidRepresentation.STANDARD)
.applyConnectionString(new ConnectionString(uri))
.codecRegistry(Registry)
.build()
val client = MongoClient(clientSettings)
I found this (issue)[https://jira.mongodb.org/browse/JAVA-3274] that got resolved in mongo-scala-driver: 4.1.0 and I was hoping that this would fix my issue, but it didn't.
Any idea what I could check next?
Apparently there is a connectivity issue between your pod and two of the three nodes of the replica set. Since the node that is visible is currently a secondary, the driver cannot satisfy the readPreference=primary that is set by default and therefore times out after a while.
I would review your firewall configuration, make sure your pod has access to all three nodes and not just one. Also, ensure that your pod's IP address is whitelisted in Atlas.

Unable to connect to Mongo Using VertxMongo clinent

Hi enables ssl in mongo server and trying to connect from vertx MongoClient.
Step followed : "ssl":true in configuration and set System.setProperty("org.mongodb.async.type", "netty") before intializing the clinet. When I try running my vertx application i am getting following error. can some one please help?
com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=testssl#cv.com:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketWriteException: Exception sending message}, caused by {javax.net.ssl.SSLException: SSLEngine closed already}}]
at com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:377)
at com.mongodb.connection.BaseCluster.handleServerSelectionRequest(BaseCluster.java:292)
at com.mongodb.connection.BaseCluster.access$800(BaseCluster.java:54)
at com.mongodb.connection.BaseCluster$WaitQueueHandler.run(BaseCluster.java:458)
at java.lang.Thread.run(Thread.java:745)

getting an error while connecting mongodb with replicaset-Bitnami

I have deployed bitnami MongoDB with replicaset on Azure and I haven't changed anything but when I try to connect MongoDB using connection string then I'm getting an error like `
Connection failed.
SERVER [xyz.southeastasia.cloudapp.azure.com:27017] (Type: UNKNOWN)
|_/ Connection error (MongoSocketReadTimeoutException): Timeout while receiving message
|____/ I/O error: Read timed out
Details:
Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=xyz.southeastasia.cloudapp.azure.com:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message}, caused by {java.net.SocketTimeoutException: Read timed out}}]
I have running bitnami mongodb with replicaset on azure which was created one month back that time i haven't faced this issue.
It looks to me that the address may have changed. I advise you to confirm that xyz.southeastasia.cloudapp.azure.com still points to the same IP address you want to connect. Also check that there are no firewall rules blocking the traffic.

Grails 3 and Mlab MongoDB

I am trying to connect my simple POC grails app to my Mlab MongoDB database. I am able to connect via the terminal just fine. But my grails app keeps trying to connect to localhost:127.0.0.1:27017. However my connection string in application.yml point to my mlab instance. Any ideas on this?
Here is the stack trace:
ERROR org.springframework.boot.SpringApplication - Application startup failed
com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches WritableServerSelector. Client view of cluster state is {type=UNKNOWN, servers=[{address=127.0.0.1:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}}]
Grails 3 has a good support for mongodb. You can connect to mongodb using below configuration in application.yml file.
grails:
mongodb:
url: mongodb://username:password#xxxxxxxx:15340/demoapp
Also make sure you have the below dependency on build.gradle file.
compile 'org.grails.plugins:mongodb:6.1.3'