1 24 25 package org.continuent.sequoia.controller.virtualdatabase.protocol; 26 27 import java.io.Serializable ; 28 import java.util.ArrayList ; 29 import java.util.List ; 30 31 import org.continuent.hedera.common.Member; 32 import org.continuent.sequoia.common.i18n.Translate; 33 import org.continuent.sequoia.common.jmx.management.BackendInfo; 34 import org.continuent.sequoia.common.log.Trace; 35 import org.continuent.sequoia.controller.backend.DatabaseBackend; 36 import org.continuent.sequoia.controller.requestmanager.distributed.DistributedRequestManager; 37 import org.continuent.sequoia.controller.virtualdatabase.DistributedVirtualDatabase; 38 39 46 public class VirtualDatabaseConfiguration 47 extends DistributedVirtualDatabaseMessage 48 { 49 private static final long serialVersionUID = -4753828540599620782L; 50 51 private String controllerName; 52 private String controllerJmxName; 53 private String vdbName; 54 private String groupName = null; 55 private ArrayList vLogins; 56 private int schedulerRAIDbLevel; 57 private int loadBalancerRAIDbLevel; 58 private List backendInfos; 59 60 63 public String getControllerName() 64 { 65 return controllerName; 66 } 67 68 73 public String getControllerJmxName() 74 { 75 return controllerJmxName; 76 } 77 78 84 public VirtualDatabaseConfiguration(DistributedVirtualDatabase dvdb) 85 { 86 this.controllerName = dvdb.getControllerName(); 87 this.controllerJmxName = dvdb.viewOwningController(); 88 this.vdbName = dvdb.getVirtualDatabaseName(); 89 this.groupName = dvdb.getGroupName(); 90 this.vLogins = dvdb.getAuthenticationManager().getVirtualLogins(); 91 this.schedulerRAIDbLevel = dvdb.getRequestManager().getScheduler() 92 .getRAIDbLevel(); 93 this.loadBalancerRAIDbLevel = dvdb.getRequestManager().getLoadBalancer() 94 .getRAIDbLevel(); 95 this.backendInfos = DatabaseBackend.toBackendInfos(dvdb.getBackends()); 96 } 97 98 111 private Object [] isCompatible(DistributedVirtualDatabase localDvdb) 112 { 113 Object [] ret = new Object [2]; 114 ret[0] = Boolean.FALSE; 115 ret[1] = null; 116 try 117 { 118 if (controllerName.equals(localDvdb.getControllerName())) 119 { 120 localDvdb 121 .getLogger() 122 .warn( 123 Translate 124 .get("virtualdatabase.distributed.configuration.checking.duplicate.controller.name")); 125 return ret; 126 } 127 128 if (!vdbName.equals(localDvdb.getVirtualDatabaseName())) 130 { 131 localDvdb 132 .getLogger() 133 .warn( 134 Translate 135 .get("virtualdatabase.distributed.configuration.checking.mismatch.name")); 136 return ret; 137 } 138 if (!groupName.equals(localDvdb.getGroupName())) 139 { 140 localDvdb 141 .getLogger() 142 .warn( 143 Translate 144 .get("virtualdatabase.distributed.configuration.checking.mismatch.groupname")); 145 return ret; 146 } 147 148 if (schedulerRAIDbLevel != localDvdb.getRequestManager().getScheduler() 150 .getRAIDbLevel()) 151 { 152 localDvdb 153 .getLogger() 154 .warn( 155 Translate 156 .get("virtualdatabase.distributed.configuration.checking.mismatch.scheduler")); 157 return ret; 158 } 159 160 if (loadBalancerRAIDbLevel != localDvdb.getRequestManager() 161 .getLoadBalancer().getRAIDbLevel()) 162 { 163 localDvdb 164 .getLogger() 165 .warn( 166 Translate 167 .get("virtualdatabase.distributed.configuration.checking.mismatch.loadbalancer")); 168 return ret; 169 } 170 171 int size = backendInfos.size(); 173 for (int i = 0; i < size; i++) 174 { 175 BackendInfo b = (BackendInfo) backendInfos.get(i); 176 if (!localDvdb.isCompatibleBackend(b)) 177 { 178 localDvdb 179 .getLogger() 180 .warn( 181 Translate 182 .get( 183 "virtualdatabase.distributed.configuration.checking.mismatch.backend.shared", 184 b.getName())); 185 return ret; 186 } 187 } 188 189 if (!localDvdb.getAuthenticationManager().getVirtualLogins().containsAll( 193 vLogins)) 194 { 195 localDvdb 196 .getLogger() 197 .warn( 198 Translate 199 .get("virtualdatabase.distributed.configuration.checking.mismatch.vlogins")); 200 return ret; 201 } 202 203 if (!vLogins.containsAll(localDvdb.getAuthenticationManager() 209 .getVirtualLogins())) 210 { 211 localDvdb 212 .getLogger() 213 .warn( 214 Translate 215 .get("virtualdatabase.distributed.configuration.checking.mismatch.vlogins")); 216 List additionalVdbUsers = new ArrayList (localDvdb 217 .getAuthenticationManager().getVirtualLogins()); 218 additionalVdbUsers.removeAll(vLogins); 219 ret[0] = Boolean.TRUE; 220 ret[1] = additionalVdbUsers; 221 return ret; 222 } 223 224 ret[0] = Boolean.TRUE; 226 return ret; 227 } 228 catch (Exception e) 229 { 230 localDvdb.getLogger().error( 231 Translate 232 .get("virtualdatabase.distributed.configuration.checking.error"), 233 e); 234 return ret; 235 } 236 } 237 238 242 public Object handleMessageSingleThreaded(DistributedVirtualDatabase dvdb, 243 Member sender) 244 { 245 return null; 246 } 247 248 252 public Serializable handleMessageMultiThreaded( 253 DistributedVirtualDatabase dvdb, Member sender, 254 Object handleMessageSingleThreadedResult) 255 { 256 Trace logger = dvdb.getLogger(); 257 if (logger.isInfoEnabled()) 258 logger.info("Checking virtual database configuration from " 259 + getControllerName()); 260 261 Object [] ret = isCompatible(dvdb); 262 if (!dvdb.isLocalSender(sender) && !((Boolean ) ret[0]).booleanValue()) 263 { 264 return new VirtualDatabaseConfigurationResponse( 266 DistributedVirtualDatabase.INCOMPATIBLE_CONFIGURATION, (List ) ret[1]); 267 } 268 269 dvdb.addRemoteControllerJmxName(sender, controllerJmxName); 271 272 try 274 { 275 dvdb.sendLocalConfiguration(sender); 276 } 277 catch (Exception e) 278 { 279 return e; 280 } 281 282 if (logger.isInfoEnabled()) 283 logger.info("Controller " + getControllerName() 284 + " is compatible with the local configuration"); 285 return new VirtualDatabaseConfigurationResponse( 286 ((DistributedRequestManager) dvdb.getRequestManager()) 287 .getControllerId(), (List ) ret[1]); 288 } 289 290 } | Popular Tags |