storage-manager-trigger/src/main/java/org/gcube/contentmanager/storageserver/store/MongoDB.java

165 lines
4.8 KiB
Java

package org.gcube.contentmanager.storageserver.store;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import com.mongodb.MongoOptions;
public class MongoDB {
private Mongo mongo;
private DB db;
private String[] server;
private String collectionSSName;
private String collectionFSName;
private int port;
private String pwd;
private String user;
private DBCollection ssCollection;
private DBCollection fsCollection;
Logger logger = LoggerFactory.getLogger(MongoDB.class);
private static final String ACCOUNTING_DB="accounting";
private static final String DEFAULT_SS_COLLECTION="storageStatus";
private static final String DEFAULT_FS_COLLECTION="folderStatus";
private FolderStatusOperationManager folderOperationManager;
private StorageStatusOperationManager ssOperationManager;
public MongoDB(String[] server, int port, String user, String password){
this.server=server;
this.port=port;
this.pwd=password;
this.user=user;
this.collectionSSName=DEFAULT_SS_COLLECTION;
this.collectionFSName=DEFAULT_FS_COLLECTION;
folderOperationManager=new FolderStatusOperationManager(getFolderStatusCollection());
ssOperationManager=new StorageStatusOperationManager(getStorageStatusCollection());
}
public MongoDB(String[] server, String user, String password){
this.server=server;
this.pwd=password;
this.user=user;
this.collectionSSName=DEFAULT_SS_COLLECTION;
this.collectionFSName=DEFAULT_FS_COLLECTION;
folderOperationManager=new FolderStatusOperationManager(getFolderStatusCollection());
ssOperationManager=new StorageStatusOperationManager(getStorageStatusCollection());
}
public MongoDB(String[] server, String user, String password, String ssCollection, String fsCollection){
this.server=server;
this.pwd=password;
this.user=user;
if(ssCollection!=null)
this.collectionSSName=ssCollection;
else
this.collectionSSName=DEFAULT_SS_COLLECTION;
if(fsCollection!=null)
this.collectionFSName=fsCollection;
else
this.collectionFSName=DEFAULT_FS_COLLECTION;
folderOperationManager=new FolderStatusOperationManager(getFolderStatusCollection());
ssOperationManager=new StorageStatusOperationManager(getStorageStatusCollection());
}
public StorageStatusRecord updateUserVolume(StorageStatusRecord ssRecord, String operation){
ssRecord= ssOperationManager.updateUser(ssRecord, operation);
close();
return ssRecord;
}
public FolderStatusRecord updateFolderVolume(FolderStatusRecord fsRecord, String operation){
fsRecord= folderOperationManager.updateFolder(fsRecord, operation);
close();
return fsRecord;
}
public StorageStatusRecord getSSRecord(String consumer){
StorageStatusRecord record=ssOperationManager.getSSRecord(consumer);
close();
return record;
}
public FolderStatusRecord getFSRecord(String folder){
FolderStatusRecord record=folderOperationManager.getFSRecord(folder);
close();
return record;
}
private DB getDB() {
if(db != null){
// check if the old server is primary
try{
DB db = mongo.getDB(ACCOUNTING_DB);
}catch(Exception e ){
logger.warn("the server now is not a primary ");
db=null;
}
}
if(db==null){
int i=-1;
for(String srv : server){
try {
i++;
ssCollection=null;
if(mongo!=null)
mongo.close();
MongoOptions options=new MongoOptions();
options.autoConnectRetry=true;
options.socketKeepAlive=true;
options.maxWaitTime=240000;
options.connectionsPerHost=35;
mongo = new Mongo(srv, options);
// mongo.getMongoOptions().autoConnectRetry=true;
// mongo.getMongoOptions().socketKeepAlive=true;
logger.debug("Istantiate MongoDB with options: "+mongo.getMongoOptions());
db = mongo.getDB(ACCOUNTING_DB);
// check on user and password for non authenticate mode
if(user==null) user="";
if(pwd==null) pwd="";
boolean auth = db.authenticate(user, pwd.toCharArray());
if(auth) logger.debug("mongo is in authenticate mode");
else logger.debug("mongo is not in authenticate mode");
if(ssCollection == null)
ssCollection=db.getCollection(collectionSSName);
ssCollection.findOne();
String firstServer = server[0];
server[0] = srv;
server[i]=firstServer;
break;
} catch (Exception e) {
logger.warn("server "+srv+" is not a primary retry ");
continue;
}
}
}
return db;
}
public DBCollection getStorageStatusCollection() {
if(ssCollection==null)
return getDB().getCollection(collectionSSName);
else
return ssCollection;
}
public DBCollection getFolderStatusCollection() {
if(fsCollection==null)
return getDB().getCollection(collectionFSName);
else
return fsCollection;
}
public void close(){
if(mongo!=null)
mongo.close();
}
}