Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading of DBname.system.indexes failed on Atlas cluster by mongobee after getting connected

I have a Jhipster Spring boot project. Recently I shifted from mlabs standalone sandboxes to Atlas cluster sandbox M0 Free tier replica set. It even worked and I had made some database operations on it. But now for some reason then there is a read permission error

Error creating bean with name 'mongobee' defined in class path resource [DatabaseConfiguration.class]: Invocation of init method failed; nested exception is com.mongodb.MongoQueryException: Query failed with error code 8000 and error message 'user is not allowed to do action [find] on [test.system.indexes]' on server ********-shard-00-01-mfwhq.mongodb.net:27017

You can see the full stack here https://pastebin.com/kaxcr7VS

I have searched high and low and all I could find is that M0 tier user doesn't have permissions to overwrite admin database which I am not doing.

Even now connection to Mlabs DB works fine but have this issue on Atlas DB M0 tier.

Mongo DB version : 3.4

Jars and It's version name: 'mongobee', version: '0.10' name: 'mongo-java-driver', version: '3.4.2'

@Neil Lunn The userId I am using to connect is that of admin's and the connection read and write works through shell or Robo3T(mongo client)

like image 693
Artist Avatar asked Dec 17 '22 23:12

Artist


2 Answers

After discussion with MongoDB support team, MongoDB 3.0 deprecates direct access to the system.indexes collection, which had previously been used to list all indexes in a database. Applications should use db.<COLLECTION>.getIndexes() instead.

From MongoDB Atlas docs it can be seen that they may forbid calls to system. collections:

Optionally, for the read and readWrite role, you can also specify a collection. If you do not specify a collection for read and readWrite, the role applies to all collections (excluding some system. collections) in the database.

From the stacktrace it's visible that MongoBee is trying to make this call, so it's now the library issue and it should be updated.

UPDATE: In order to fix an issue until MongoBee has released new version:

  1. Get the latest sources of MongoBee git clone [email protected]:mongobee/mongobee.git, cd mongobee
  2. Fetch pull request git fetch origin pull/87/head:mongobee-atlas
  3. Checkout git checkout mongobee-atlas
  4. Install MongoBee jar mvn clean install
  5. Get compiled jar from /target folder or local /.m2
  6. Use the jar as a dependency on your project
like image 197
Yuriy Yunikov Avatar answered Apr 28 '23 03:04

Yuriy Yunikov


Came across this issue this morning. Heres a quick and dirty monkey-patch for the problem:

package com.github.mongobee.dao;

import com.github.mongobee.changeset.ChangeEntry;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;

import java.util.List;

import static com.github.mongobee.changeset.ChangeEntry.CHANGELOG_COLLECTION;

public class ChangeEntryIndexDao {

    public void createRequiredUniqueIndex(DBCollection collection) {
        collection.createIndex(new BasicDBObject()
                        .append(ChangeEntry.KEY_CHANGEID, 1)
                        .append(ChangeEntry.KEY_AUTHOR, 1),
                new BasicDBObject().append("unique", true));
    }

    public DBObject findRequiredChangeAndAuthorIndex(DB db) {
        DBCollection changelogCollection = db.getCollection(CHANGELOG_COLLECTION);
        List<DBObject> indexes = changelogCollection.getIndexInfo();
        if (indexes == null) return null;
        for (DBObject index : indexes) {
            BasicDBObject indexKeys = ((BasicDBObject) index.get("key"));
            if (indexKeys != null && (indexKeys.get(ChangeEntry.KEY_CHANGEID) != null && indexKeys.get(ChangeEntry.KEY_AUTHOR) != null)) {
                return index;
            }
        }
        return null;
    }

    public boolean isUnique(DBObject index) {
        Object unique = index.get("unique");
        if (unique != null && unique instanceof Boolean) {
            return (Boolean) unique;
        } else {
            return false;
        }
    }

    public void dropIndex(DBCollection collection, DBObject index) {
        collection.dropIndex(index.get("name").toString());
    }

}
like image 35
Oliver Oldfield-Hodge Avatar answered Apr 28 '23 05:04

Oliver Oldfield-Hodge