- // Check Database and set the Flag.
- private void checkDataBase() throws Exception {
- EntityTransaction et = em.getTransaction();
- notificationRecord = PolicyUtils.objectToJsonString(NotificationStore.getNotificationRecord());
- // Clear Cache.
- LOGGER.info("Clearing Cache");
- em.getEntityManagerFactory().getCache().evictAll();
- try{
- LOGGER.info("Checking Datatbase for BackUpMonitor.. ");
- et.begin();
- Query query = em.createQuery("select b from BackUpMonitorEntity b where b.resourceNodeName = :nn");
- if(resourceNodeName.equals(ResourceNode.ASTRA.toString())){
- query.setParameter("nn", ResourceNode.ASTRA.toString());
- }else if(resourceNodeName.equals(ResourceNode.BRMS.toString())){
- query.setParameter("nn", ResourceNode.BRMS.toString());
- }
- List<?> bMList = query.getResultList();
- if(bMList.isEmpty()){
- // This is New. create an entry as Master.
- LOGGER.info("Adding resource " + resourceName + " to Database");
- BackUpMonitorEntity bMEntity = new BackUpMonitorEntity();
- bMEntity.setResoruceNodeName(resourceNodeName);
- bMEntity.setResourceName(resourceName);
- bMEntity = setMaster(bMEntity);
- bMEntity.setTimeStamp(new Date());
- em.persist(bMEntity);
- em.flush();
- }else{
- // Check for other Master(s)
- ArrayList<BackUpMonitorEntity> masterEntities = new ArrayList<>();
- // Check for self.
- BackUpMonitorEntity selfEntity = null;
- // Check backup monitor entities.
- for(int i=0; i< bMList.size(); i++){
- BackUpMonitorEntity bMEntity = (BackUpMonitorEntity) bMList.get(i);
- LOGGER.info("Refreshing Entity. ");
- em.refresh(bMEntity);
- if(bMEntity.getFlag().equalsIgnoreCase("MASTER")){
- masterEntities.add(bMEntity);
- }
- if(bMEntity.getResourceName().equals(resourceName)){
- selfEntity = bMEntity;
- }
- }
- if(selfEntity!=null){
- LOGGER.info("Resource Name already Exists: " + resourceName);
- if(selfEntity.getFlag().equalsIgnoreCase("MASTER")){
- // Already Master Mode.
- setFlag(true);
- LOGGER.info(resourceName + " is on Master Mode");
- selfEntity.setTimeStamp(new Date());
- selfEntity.setNotificationRecord(notificationRecord);
- em.persist(selfEntity);
- em.flush();
- setLastNotification(null);
- if(!masterEntities.contains(selfEntity)){
- masterEntities.add(selfEntity);
- }
- }else{
- // Already Slave Mode.
- setFlag(false);
- selfEntity.setTimeStamp(new Date());
- selfEntity.setNotificationRecord(notificationRecord);
- em.persist(selfEntity);
- em.flush();
- LOGGER.info(resourceName + " is on Slave Mode");
- }
- }else{
- // Resource name is null -> No resource with same name.
- selfEntity = new BackUpMonitorEntity();
- selfEntity.setResoruceNodeName(resourceNodeName);
- selfEntity.setResourceName(resourceName);
- selfEntity.setTimeStamp(new Date());
- selfEntity = setSlave(selfEntity);
- setLastNotification(null);
- LOGGER.info("Creating: " + resourceName + " on Slave Mode");
- em.persist(selfEntity);
- em.flush();
- }
- // Correct the database if any errors and perform monitor checks.
- if(masterEntities.size()!=1 || !getFlag()){
- // We are either not master or there are more masters or no masters.
- if(masterEntities.size()==0){
- // No Masters is a problem Convert ourselves to Master.
- selfEntity = setMaster(selfEntity);
- selfEntity.setTimeStamp(new Date());
- selfEntity.setNotificationRecord(notificationRecord);
- LOGGER.info(resourceName + " changed to Master Mode - No Masters available.");
- em.persist(selfEntity);
- em.flush();
- }else {
- if(masterEntities.size()>1){
- // More Masters is a problem, Fix the issue by looking for the latest one and make others Slave.
- BackUpMonitorEntity masterEntity = null;
- for(BackUpMonitorEntity currentEntity: masterEntities){
- if(currentEntity.getFlag().equalsIgnoreCase("MASTER")){
- if(masterEntity==null){
- masterEntity = currentEntity;
- }else if(currentEntity.getTimeStamp().getTime() > masterEntity.getTimeStamp().getTime()){
- // False Master, Update master to slave and take currentMaster as Master.
- masterEntity.setFlag("SLAVE");
- masterEntity.setTimeStamp(new Date());
- em.persist(masterEntity);
- em.flush();
- masterEntity = currentEntity;
- }else{
- currentEntity.setFlag("SLAVE");
- currentEntity.setTimeStamp(new Date());
- em.persist(currentEntity);
- em.flush();
- }
- }
- }
- masterEntities = new ArrayList<>();
- masterEntities.add(masterEntity);
- }
- if(masterEntities.size()==1){
- // Correct Size, Check if Master is Latest, if not Change Master to Slave and Slave to Master.
- BackUpMonitorEntity masterEntity = masterEntities.get(0);
- if(!masterEntity.getResourceName().equals(selfEntity.getResourceName())){
- Date currentTime = new Date();
- long timeDiff = 0;
- timeDiff = currentTime.getTime()-masterEntity.getTimeStamp().getTime();
- if(timeDiff > (pingInterval+1500)){
- // This is down or has an issue and we need to become Master while turning the Master to slave.
- masterEntity.setFlag("SLAVE");
- String lastNotification = null;
- if(masterEntity.getNotificationRecord()!=null){
- lastNotification = calculatePatch(masterEntity.getNotificationRecord());
- }
- setLastNotification(lastNotification);
- em.persist(masterEntity);
- em.flush();
- // Lets Become Master.
- selfEntity = setMaster(selfEntity);
- LOGGER.info("Changing "+ resourceName + " from slave to Master Mode");
- selfEntity.setTimeStamp(new Date());
- selfEntity.setNotificationRecord(notificationRecord);
- em.persist(selfEntity);
- em.flush();
- }
- }
- }else{
- LOGGER.error("Backup Monitor Issue, Masters out of sync, This will be fixed in next interval.");
- }
- }
- }
- }
- et.commit();
- }catch(Exception e){
- LOGGER.error("failed Database Operation " + e.getMessage());
- if(et.isActive()){
- et.rollback();
- }
- throw new Exception(e);
- }
- }
+ // Check Database and set the Flag.
+ private void checkDataBase() throws BackUpMonitorException {
+ EntityTransaction et = em.getTransaction();
+ setNotificationRecord();
+ // Clear Cache.
+ LOGGER.info("Clearing Cache");
+ em.getEntityManagerFactory().getCache().evictAll();
+ try {
+ LOGGER.info("Checking Datatbase for BackUpMonitor.. ");
+ et.begin();
+ Query query = em.createQuery("select b from BackUpMonitorEntity b where b.resourceNodeName = :nn");
+ if (resourceNodeName.equals(ResourceNode.ASTRA.toString())) {
+ query.setParameter("nn", ResourceNode.ASTRA.toString());
+ } else if (resourceNodeName.equals(ResourceNode.BRMS.toString())) {
+ query.setParameter("nn", ResourceNode.BRMS.toString());
+ }
+ List<?> bMList = query.getResultList();
+ if (bMList.isEmpty()) {
+ // This is New. create an entry as Master.
+ LOGGER.info("Adding resource " + resourceName + " to Database");
+ BackUpMonitorEntity bMEntity = new BackUpMonitorEntity();
+ bMEntity.setResoruceNodeName(resourceNodeName);
+ bMEntity.setResourceName(resourceName);
+ bMEntity = setMaster(bMEntity);
+ bMEntity.setTimeStamp(new Date());
+ em.persist(bMEntity);
+ em.flush();
+ } else {
+ // Check for other Master(s)
+ ArrayList<BackUpMonitorEntity> masterEntities = new ArrayList<>();
+ // Check for self.
+ BackUpMonitorEntity selfEntity = null;
+ // Check backup monitor entities.
+ for (int i = 0; i < bMList.size(); i++) {
+ BackUpMonitorEntity bMEntity = (BackUpMonitorEntity) bMList.get(i);
+ LOGGER.info("Refreshing Entity. ");
+ em.refresh(bMEntity);
+ if (bMEntity.getFlag().equalsIgnoreCase("MASTER")) {
+ masterEntities.add(bMEntity);
+ }
+ if (bMEntity.getResourceName().equals(resourceName)) {
+ selfEntity = bMEntity;
+ }
+ }
+ if (selfEntity != null) {
+ LOGGER.info("Resource Name already Exists: " + resourceName);
+ if (selfEntity.getFlag().equalsIgnoreCase("MASTER")) {
+ // Already Master Mode.
+ setFlag(true);
+ LOGGER.info(resourceName + " is on Master Mode");
+ selfEntity.setTimeStamp(new Date());
+ selfEntity.setNotificationRecord(notificationRecord);
+ em.persist(selfEntity);
+ em.flush();
+ setLastNotification(null);
+ if (!masterEntities.contains(selfEntity)) {
+ masterEntities.add(selfEntity);
+ }
+ } else {
+ // Already Slave Mode.
+ setFlag(false);
+ selfEntity.setTimeStamp(new Date());
+ selfEntity.setNotificationRecord(notificationRecord);
+ em.persist(selfEntity);
+ em.flush();
+ LOGGER.info(resourceName + " is on Slave Mode");
+ }
+ } else {
+ // Resource name is null -> No resource with same name.
+ selfEntity = new BackUpMonitorEntity();
+ selfEntity.setResoruceNodeName(resourceNodeName);
+ selfEntity.setResourceName(resourceName);
+ selfEntity.setTimeStamp(new Date());
+ selfEntity = setSlave(selfEntity);
+ setLastNotification(null);
+ LOGGER.info("Creating: " + resourceName + " on Slave Mode");
+ em.persist(selfEntity);
+ em.flush();
+ }
+ // Correct the database if any errors and perform monitor checks.
+ if (masterEntities.size() != 1 || !getFlag()) {
+ // We are either not master or there are more masters or no masters.
+ if (masterEntities.isEmpty()) {
+ // No Masters is a problem Convert ourselves to Master.
+ selfEntity = setMaster(selfEntity);
+ selfEntity.setTimeStamp(new Date());
+ selfEntity.setNotificationRecord(notificationRecord);
+ LOGGER.info(resourceName + " changed to Master Mode - No Masters available.");
+ em.persist(selfEntity);
+ em.flush();
+ } else {
+ if (masterEntities.size() > 1) {
+ // More Masters is a problem, Fix the issue by looking for the latest one and make others
+ // Slave.
+ BackUpMonitorEntity masterEntity = null;
+ for (BackUpMonitorEntity currentEntity : masterEntities) {
+ if (currentEntity.getFlag().equalsIgnoreCase("MASTER")) {
+ if (masterEntity == null) {
+ masterEntity = currentEntity;
+ } else if (currentEntity.getTimeStamp().getTime() > masterEntity.getTimeStamp()
+ .getTime()) {
+ // False Master, Update master to slave and take currentMaster as Master.
+ masterEntity.setFlag("SLAVE");
+ masterEntity.setTimeStamp(new Date());
+ em.persist(masterEntity);
+ em.flush();
+ masterEntity = currentEntity;
+ } else {
+ currentEntity.setFlag("SLAVE");
+ currentEntity.setTimeStamp(new Date());
+ em.persist(currentEntity);
+ em.flush();
+ }
+ }
+ }
+ masterEntities = new ArrayList<>();
+ masterEntities.add(masterEntity);
+ }
+ if (masterEntities.size() == 1) {
+ // Correct Size, Check if Master is Latest, if not Change Master to Slave and Slave to
+ // Master.
+ BackUpMonitorEntity masterEntity = masterEntities.get(0);
+ if (!masterEntity.getResourceName().equals(selfEntity.getResourceName())) {
+ Date currentTime = new Date();
+ long timeDiff = 0;
+ timeDiff = currentTime.getTime() - masterEntity.getTimeStamp().getTime();
+ if (timeDiff > (pingInterval + 1500)) {
+ // This is down or has an issue and we need to become Master while turning the
+ // Master to slave.
+ masterEntity.setFlag("SLAVE");
+ String lastNotification = null;
+ if (masterEntity.getNotificationRecord() != null) {
+ lastNotification = calculatePatch(masterEntity.getNotificationRecord());
+ }
+ setLastNotification(lastNotification);
+ em.persist(masterEntity);
+ em.flush();
+ // Lets Become Master.
+ selfEntity = setMaster(selfEntity);
+ LOGGER.info("Changing " + resourceName + " from slave to Master Mode");
+ selfEntity.setTimeStamp(new Date());
+ selfEntity.setNotificationRecord(notificationRecord);
+ em.persist(selfEntity);
+ em.flush();
+ }
+ }
+ } else {
+ LOGGER.error(
+ "Backup Monitor Issue, Masters out of sync, This will be fixed in next interval.");
+ }
+ }
+ }
+ }
+ et.commit();
+ } catch (Exception e) {
+ LOGGER.error("failed Database Operation " + e.getMessage(), e);
+ if (et.isActive()) {
+ et.rollback();
+ }
+ throw new BackUpMonitorException(e);
+ }
+ }