Public Member Functions | |
DistributedVirtualDatabase (Controller controller, String name, String groupName, int maxConnections, boolean pool, int minThreads, int maxThreads, long maxThreadIdleTime, int sqlShortFormLength, AbstractBlobFilter blobFilter) throws NotCompliantMBeanException, JmxException | |
void | addBackend (DatabaseBackend db) throws VirtualDatabaseException |
void | quitChannel () throws ChannelException, NotConnectedException |
String | getControllerName () |
String | getGroupName () |
void | setGroupName (String groupName) |
void | addBackendRecoveryPolicy (BackendRecoveryPolicy policy) |
void | setRequestManager (RequestManager requestManager) |
void | joinGroup () throws Exception |
ReliableGroupChannelWithGms | getChannel () |
MulticastRequestAdapter | getMulticastRequestAdapter () |
Group | getCurrentGroup () |
ArrayList | getAllMemberButUs () |
boolean | isCompatibleBackend (BackendInfo backend) throws VirtualDatabaseException |
void | receive (Serializable msg) |
Object | handleMessageSingleThreaded (Serializable msg, Member sender) |
Serializable | handleMessageMultiThreaded (Serializable msg, Member sender, Object handleMessageSingleThreadedResult) |
void | getBackendStatus () throws TimeoutException, ChannelException, NotConnectedException |
void | viewAccepted (Group newGroup) |
HashMap | getBackendRecoveryPolicy () |
boolean | isDistributed () |
boolean | equals (Object other) |
String[] | viewControllerList () |
void | setAuthenticationManager (AuthenticationManager authenticationManager) |
Hashtable | viewGroupBackends () throws VirtualDatabaseException |
ArrayList | getBackendsInfo (ArrayList backendsObject) |
BackendInfo | createBackendInfo (DatabaseBackend backend, boolean useXml) |
void | removeBackend (String backend) throws VirtualDatabaseException |
void | transferBackend (String backend, String controllerDestination) throws VirtualDatabaseException |
Protected Member Functions | |
void | finalize () throws Throwable |
String | getDistributionXml () |
DistributedVirtualDatabase
is a virtual database hosted by several controllers. Communication between the controllers is achieved with reliable multicast provided by Javagroups.
Definition at line 87 of file DistributedVirtualDatabase.java.
|
Creates a new
Definition at line 145 of file DistributedVirtualDatabase.java. 00150 { 00151 super(controller, name, maxConnections, pool, minThreads, maxThreads, 00152 maxThreadIdleTime, sqlShortFormLength, blobFilter); 00153 00154 this.groupName = groupName; 00155 backendRecoveryPolicy = new HashMap(); 00156 backendsPerController = new Hashtable(); 00157 controllersMap = new Hashtable(); 00158 }
|
|
Reimplemented from org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase. Definition at line 174 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.common.log.Trace.error(). 00175 { 00176 // Add the backend to the virtual database. 00177 super.addBackend(db); 00178 00179 // Send a group message if already joined group 00180 if (allMemberButUs != null) 00181 { 00182 try 00183 { 00184 broadcastBackendInformation(allMemberButUs); 00185 } 00186 catch (Exception e) 00187 { 00188 String msg = "Error while broadcasting backend information when adding backend"; 00189 logger.error(msg, e); 00190 throw new VirtualDatabaseException(msg, e); 00191 } 00192 } 00193 }
|
|
Add a BackendRecoveryPolicy
Definition at line 245 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.controller.backend.BackendRecoveryPolicy.getBackendName(). 00246 { 00247 backendRecoveryPolicy.put(policy.getBackendName(), policy); 00248 }
|
|
Create backend information object from a DatabaseBackend object This will get only static information
Definition at line 1016 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.controller.backend.DatabaseBackend.getXml(). 01017 { 01018 if (useXml) 01019 try 01020 { 01021 return new BackendInfo(backend.getXml()); 01022 } 01023 catch (DocumentException e) 01024 { 01025 // go to next method. cause we haven't returned yet 01026 } 01027 return new BackendInfo(backend); 01028 }
|
|
Two virtual databases are equal if they have the same name, login and password.
Reimplemented from org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase. Definition at line 901 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.getDatabaseName(), and org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getGroupName(). 00902 { 00903 if ((other == null) 00904 || (!(other instanceof org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase))) 00905 return false; 00906 else 00907 { 00908 DistributedVirtualDatabase db = (org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase) other; 00909 return name.equals(db.getDatabaseName()) 00910 && groupName.equals(db.getGroupName()); 00911 } 00912 }
|
|
Disconnect the channel and close it.
Definition at line 165 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.quitChannel(). 00166 { 00167 quitChannel(); 00168 super.finalize(); 00169 }
|
|
Returns the list of all members in the group except us.
Definition at line 392 of file DistributedVirtualDatabase.java. Referenced by org.objectweb.cjdbc.controller.requestmanager.distributed.RAIDb2DistributedRequestManager.execRemoteReadRequest(), and org.objectweb.cjdbc.controller.requestmanager.distributed.RAIDb1DistributedRequestManager.execRemoteReadRequest(). 00393 {
00394 return allMemberButUs;
00395 }
|
|
Get the backend distribution policies
Definition at line 879 of file DistributedVirtualDatabase.java. Referenced by org.objectweb.cjdbc.controller.virtualdatabase.protocol.VirtualDatabaseConfiguration.VirtualDatabaseConfiguration(). 00880 {
00881 return backendRecoveryPolicy;
00882 }
|
|
We have to convert the backends list from an array of
Definition at line 995 of file DistributedVirtualDatabase.java. Referenced by org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.handleMessageMultiThreaded(), and org.objectweb.cjdbc.controller.virtualdatabase.protocol.VirtualDatabaseConfiguration.VirtualDatabaseConfiguration(). 00996 { 00997 int size = backendsObject.size(); 00998 ArrayList infos = new ArrayList(size); 00999 DatabaseBackend backend; 01000 for (int i = 0; i < size; i++) 01001 { 01002 backend = (DatabaseBackend) backendsObject.get(i); 01003 infos.add(createBackendInfo(backend, false)); 01004 } 01005 return infos; 01006 }
|
|
Get the status of all remote controllers
Definition at line 810 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.common.log.Trace.debug(). 00812 { 00813 if (logger.isDebugEnabled()) 00814 logger.debug("Requesting remote controllers status"); 00815 MulticastResponse rspList = multicastRequestAdapter.multicastMessage(null, 00816 new BackendStatus(getBackendsInfo(backends)), 00817 MulticastRequestAdapter.WAIT_ALL, CJDBCGroupMessage.defaultCastTimeOut); 00818 00819 HashMap results = rspList.getResults(); 00820 for (Iterator iter = results.values().iterator(); iter.hasNext();) 00821 { 00822 ArrayList b = (ArrayList) iter.next(); 00823 int bSize = b.size(); 00824 if (bSize == 0) 00825 logger.debug("No Database backends"); 00826 else 00827 for (int j = 0; j < bSize; j++) 00828 logger.debug(((DatabaseBackend) b.get(j)).getXml()); 00829 } 00830 }
|
|
Get the JGroups' channel used for group communications
Definition at line 362 of file DistributedVirtualDatabase.java. Referenced by org.objectweb.cjdbc.controller.requestmanager.distributed.RAIDb2DistributedRequestManager.execDistributedWriteRequest(), and org.objectweb.cjdbc.controller.requestmanager.distributed.RAIDb1DistributedRequestManager.execDistributedWriteRequest(). 00363 {
00364 return channel;
00365 }
|
|
Returns the controllerName value.
Definition at line 214 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.controller.core.Controller.getControllerName(). Referenced by org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.handleMessageMultiThreaded(), org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.handleMessageSingleThreaded(), org.objectweb.cjdbc.controller.virtualdatabase.protocol.VirtualDatabaseConfiguration.isCompatible(), and org.objectweb.cjdbc.controller.virtualdatabase.protocol.VirtualDatabaseConfiguration.VirtualDatabaseConfiguration(). 00215 { 00216 return controller.getControllerName(); 00217 }
|
|
Returns the currentGroup value.
Definition at line 382 of file DistributedVirtualDatabase.java. Referenced by org.objectweb.cjdbc.controller.requestmanager.distributed.RAIDb2DistributedRequestManager.execDistributedWriteRequest(), and org.objectweb.cjdbc.controller.requestmanager.distributed.RAIDb1DistributedRequestManager.execDistributedWriteRequest(). 00383 {
00384 return currentGroup;
00385 }
|
|
Get the XML dump of the Distribution element if any.
Reimplemented from org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase. Definition at line 919 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.controller.backend.BackendRecoveryPolicy.getXml(). 00920 { 00921 StringBuffer info = new StringBuffer(); 00922 info.append("<" + DatabasesXmlTags.ELT_Distribution + " " 00923 + DatabasesXmlTags.ATT_groupName + "=\"" + groupName + "\">"); 00924 00925 for (Iterator iter = backendRecoveryPolicy.values().iterator(); iter 00926 .hasNext();) 00927 { 00928 BackendRecoveryPolicy p = (BackendRecoveryPolicy) iter.next(); 00929 info.append(p.getXml()); 00930 } 00931 00932 info.append("</" + DatabasesXmlTags.ELT_Distribution + ">"); 00933 return info.toString(); 00934 }
|
|
Returns the group name this virtual database belongs to.
Definition at line 225 of file DistributedVirtualDatabase.java. Referenced by org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.equals(), org.objectweb.cjdbc.controller.virtualdatabase.protocol.VirtualDatabaseConfiguration.isCompatible(), and org.objectweb.cjdbc.controller.virtualdatabase.protocol.VirtualDatabaseConfiguration.VirtualDatabaseConfiguration(). 00226 {
00227 return groupName;
00228 }
|
|
Return the group communication multicast request adapter.
Definition at line 372 of file DistributedVirtualDatabase.java. Referenced by org.objectweb.cjdbc.controller.requestmanager.distributed.RAIDb2DistributedRequestManager.execDistributedWriteRequest(), org.objectweb.cjdbc.controller.requestmanager.distributed.RAIDb1DistributedRequestManager.execDistributedWriteRequest(), org.objectweb.cjdbc.controller.requestmanager.distributed.RAIDb2DistributedRequestManager.execRemoteReadRequest(), and org.objectweb.cjdbc.controller.requestmanager.distributed.RAIDb1DistributedRequestManager.execRemoteReadRequest(). 00373 {
00374 return multicastRequestAdapter;
00375 }
|
|
Definition at line 631 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.common.log.Trace.debug(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.equals(), org.objectweb.cjdbc.common.log.Trace.error(), org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getBackendsInfo(), org.objectweb.cjdbc.controller.core.Controller.getControllerName(), org.objectweb.cjdbc.controller.virtualdatabase.protocol.VirtualDatabaseConfiguration.getControllerName(), org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getControllerName(), org.objectweb.cjdbc.common.shared.BackendInfo.getDatabaseBackend(), org.objectweb.cjdbc.controller.core.Controller.getJmxName(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.getName(), org.objectweb.cjdbc.controller.virtualdatabase.protocol.VirtualDatabaseConfiguration.getRmiHostname(), org.objectweb.cjdbc.controller.virtualdatabase.protocol.VirtualDatabaseConfiguration.getRmiPort(), org.objectweb.cjdbc.common.log.Trace.info(), org.objectweb.cjdbc.common.log.Trace.isDebugEnabled(), org.objectweb.cjdbc.common.log.Trace.isInfoEnabled(), and org.objectweb.cjdbc.common.log.Trace.warn(). 00633 { 00634 try 00635 { 00636 if (msg != null) 00637 { 00638 logger.debug("handleMessageMultiThreaded (" + msg.getClass() + "): " 00639 + msg); 00640 if (msg instanceof DistributedRequest) 00641 { //Distributed request execution 00642 if (logger.isDebugEnabled()) 00643 logger.debug(getControllerName() + ": DistributedRequest " 00644 + ((DistributedRequest) msg).getRequest().getId() + " from " 00645 + sender); 00646 ((DistributedRequest) msg) 00647 .scheduleRequest((DistributedRequestManager) this.requestManager); 00648 return ((Serializable) ((DistributedRequest) msg) 00649 .executeScheduledRequest((DistributedRequestManager) this.requestManager)); 00650 } 00651 if (msg instanceof ControllerName) 00652 { 00653 String controllerName = ((ControllerName) msg).getJmxName(); 00654 if (logger.isDebugEnabled()) 00655 logger.debug(getControllerName() + ": New ControllerName " 00656 + controllerName); 00657 controllersMap.put(sender, controllerName); 00658 return Boolean.TRUE; 00659 } 00660 if (msg instanceof Commit) 00661 { //Distributed commit execution 00662 if (logger.isDebugEnabled()) 00663 logger.debug(getControllerName() + ": Commit from " + sender); 00664 return ((Serializable) ((Commit) msg) 00665 .commit((DistributedRequestManager) this.requestManager)); 00666 } 00667 if (msg instanceof Rollback) 00668 { //Distributed commit execution 00669 if (logger.isDebugEnabled()) 00670 logger.debug(getControllerName() + ": Rollback from " + sender); 00671 return ((Serializable) ((Rollback) msg) 00672 .rollback((DistributedRequestManager) this.requestManager)); 00673 } 00674 else if (msg instanceof BackendTransfer) 00675 return (Serializable) handleMessageSingleThreadedResult; 00676 else if (msg instanceof VirtualDatabaseConfiguration) 00677 { // Check if given configuration is compatible with the local one 00678 VirtualDatabaseConfiguration vdc = (VirtualDatabaseConfiguration) msg; 00679 // Send notification 00680 if (MBeanServerManager.isJmxEnabled()) 00681 { 00682 Hashtable data = new Hashtable(); 00683 data.put("controllerName", vdc.getControllerName()); 00684 data.put("rmiconnector", new String[]{vdc.getRmiHostname(), 00685 vdc.getRmiPort()}); 00686 RmiConnector.broadcastNotification(this, 00687 CjdbcNotificationList.DISTRIBUTED_CONTROLLER_ADDED, 00688 CjdbcNotificationList.NOTIFICATION_LEVEL_INFO, Translate.get( 00689 "notification.distributed.controller.added", this 00690 .getVirtualDatabaseName()), data); 00691 } 00692 controllersMap.put(sender, vdc.getControllerJmxName()); 00693 if (logger.isDebugEnabled()) 00694 logger.debug("VirtualDatabaseConfiguration from " 00695 + vdc.getControllerName()); 00696 00697 // Send controller name to new comer 00698 ArrayList target = new ArrayList(); 00699 target.add(sender); 00700 multicastRequestAdapter.multicastMessage(target, new ControllerName( 00701 controller.getControllerName(), controller.getJmxName()), 00702 MulticastRequestAdapter.WAIT_ALL, 00703 CJDBCGroupMessage.defaultCastTimeOut); 00704 00705 // Broadcast backends 00706 multicastRequestAdapter.multicastMessage(target, new BackendStatus( 00707 getBackendsInfo(backends)), MulticastRequestAdapter.WAIT_ALL, 00708 CJDBCGroupMessage.defaultCastTimeOut); 00709 00710 if (isLocalSender(sender)) 00711 return Boolean.TRUE; 00712 else 00713 return new Boolean((vdc.isCompatible(this))); 00714 } 00715 else if (msg instanceof BackendStatus) 00716 { // Update backend list from sender 00717 ArrayList remoteBackendInfoList = ((BackendStatus) msg).getBackends(); 00718 // Convert BackendInfo arraylist to real DatabaseBackend objects 00719 ArrayList remoteBackendList = new ArrayList(remoteBackendInfoList 00720 .size()); 00721 for (Iterator iter = remoteBackendInfoList.iterator(); iter.hasNext();) 00722 { 00723 BackendInfo info = (BackendInfo) iter.next(); 00724 remoteBackendList.add(info.getDatabaseBackend()); 00725 } 00726 backendsPerController.put(sender, remoteBackendList); 00727 if (logger.isInfoEnabled()) 00728 logger 00729 .info(Translate 00730 .get( 00731 "virtualdatabase.distributed.configuration.updating.backend.list", 00732 sender)); 00733 } 00734 else if (msg instanceof EnableBackend) 00735 { 00736 ArrayList remoteBackendList = (ArrayList) backendsPerController 00737 .get(sender); 00738 if (remoteBackendList == null) 00739 { // This case was reported by Alessandro Gamboz on April 1, 2005. 00740 // It looks like the EnableBackend message arrives before membership 00741 // has been properly updated. 00742 logger.warn("No information has been found for remote controller " 00743 + sender); 00744 remoteBackendList = new ArrayList(); 00745 backendsPerController.put(sender, remoteBackendList); 00746 } 00747 DatabaseBackend enabledBackend = ((EnableBackend) msg) 00748 .getDatabaseBackend(); 00749 int size = remoteBackendList.size(); 00750 boolean backendFound = false; 00751 for (int i = 0; i < size; i++) 00752 { 00753 DatabaseBackend b = (DatabaseBackend) remoteBackendList.get(i); 00754 if (b.equals(enabledBackend)) 00755 { 00756 logger.info("Backend " + b.getName() + " enabled on controller " 00757 + sender); 00758 remoteBackendList.set(i, enabledBackend); 00759 backendFound = true; 00760 break; 00761 } 00762 } 00763 if (!backendFound) 00764 { 00765 logger 00766 .warn("Updating backend list with unknown backend " 00767 + enabledBackend.getName() + " enabled on controller " 00768 + sender); 00769 remoteBackendList.add(enabledBackend); 00770 } 00771 } 00772 else 00773 logger.warn("Unhandled message type received: " + msg.getClass() 00774 + "(" + msg + ")"); 00775 } 00776 else 00777 { 00778 String errorMsg = "Invalid null message"; 00779 logger.error(errorMsg); 00780 return new ControllerException(errorMsg); 00781 } 00782 return null; 00783 } 00784 catch (Exception e) 00785 { 00786 if (e instanceof RuntimeException) 00787 logger.warn("Error while handling group message:" + msg.getClass(), e); 00788 return e; 00789 } 00790 }
|
|
This method handle the scheduling part of the queries to be sure that the query is scheduled in total order before letting other queries to execute.
Definition at line 582 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.common.log.Trace.debug(), org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.enableBackend(), org.objectweb.cjdbc.common.log.Trace.error(), org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getControllerName(), org.objectweb.cjdbc.controller.virtualdatabase.protocol.BackendTransfer.getInfo(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.getName(), org.objectweb.cjdbc.common.log.Trace.info(), and org.objectweb.cjdbc.common.log.Trace.warn(). 00583 { 00584 try 00585 { 00586 if (msg != null) 00587 { 00588 logger.debug("handleMessageSingleThreaded (" + msg.getClass() + "): " 00589 + msg); 00590 if (msg instanceof BackendTransfer) 00591 { 00592 logger.info(getControllerName() + ":Received transfer command"); 00593 BackendTransfer transfer = (BackendTransfer) msg; 00594 BackendInfo info = transfer.getInfo(); 00595 DatabaseBackend backend = new DatabaseBackend(info); 00596 try 00597 { 00598 this.addBackend(backend); 00599 } 00600 catch (Exception e1) 00601 { 00602 logger.error("Transfer failed", e1); 00603 return e1; 00604 } 00605 logger.info(getControllerName() + ":Enable backend"); 00606 enableBackend(backend.getName()); 00607 return Boolean.TRUE; 00608 } 00609 // Other message types will be handled in multithreaaded handler 00610 } 00611 else 00612 { 00613 String errorMsg = "Invalid null message"; 00614 logger.error(errorMsg); 00615 return new ControllerException(errorMsg); 00616 } 00617 return null; 00618 } 00619 catch (Exception e) 00620 { 00621 if (e instanceof RuntimeException) 00622 logger.warn("Error while handling group message:" + msg.getClass(), e); 00623 return e; 00624 } 00625 }
|
|
Check if the given backend definition is compatible with the backend definitions of this distributed virtual database. Not that if the given backend does not exist in the current configuration, it is considered as compatible. Incompatibility results from 2 backends with the same JDBC URL.
Definition at line 522 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.acquireReadLockBackendLists(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.equals(), org.objectweb.cjdbc.common.log.Trace.error(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.getURL(), and org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.releaseReadLockBackendLists(). Referenced by org.objectweb.cjdbc.controller.virtualdatabase.protocol.VirtualDatabaseConfiguration.isCompatible(). 00524 { 00525 try 00526 { 00527 acquireReadLockBackendLists(); 00528 } 00529 catch (InterruptedException e) 00530 { 00531 String msg = "Unable to acquire read lock on backend list in isCompatibleBackend (" 00532 + e + ")"; 00533 logger.error(msg); 00534 throw new VirtualDatabaseException(msg); 00535 } 00536 00537 try 00538 { 00539 // Find the backend 00540 String backendURL = backend.getUrl(); 00541 int size = backends.size(); 00542 DatabaseBackend b = null; 00543 for (int i = 0; i < size; i++) 00544 { 00545 b = (DatabaseBackend) backends.get(i); 00546 if (b.getURL().equals(backendURL)) 00547 return false; 00548 } 00549 } 00550 catch (RuntimeException re) 00551 { 00552 throw new VirtualDatabaseException(re); 00553 } 00554 finally 00555 { 00556 releaseReadLockBackendLists(); 00557 } 00558 // This backend does not exist here 00559 return true; 00560 }
|
|
Is this virtual database distributed ?
Reimplemented from org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase. Definition at line 889 of file DistributedVirtualDatabase.java. 00890 { 00891 return true; 00892 }
|
|
Makes this virtual database join a virtual database group. Those groups are mapped to JavaGroups groups.
Definition at line 273 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.common.log.Trace.debug(), org.objectweb.cjdbc.common.log.Trace.error(), org.objectweb.cjdbc.controller.core.Controller.getJmxName(), org.objectweb.cjdbc.common.log.Trace.info(), org.objectweb.cjdbc.common.log.Trace.isDebugEnabled(), and org.objectweb.cjdbc.common.log.Trace.warn(). 00274 { 00275 try 00276 { 00277 // Read the protocol stack configuration from jgroups.xml 00278 URL jgroupConfigFile = DistributedVirtualDatabase.class 00279 .getResource("/jgroups.xml"); 00280 if (jgroupConfigFile == null) 00281 logger.warn(Translate 00282 .get("virtualdatabase.distributed.jgroups.xml.not.found")); 00283 else 00284 logger.info(Translate.get("virtualdatabase.distributed.jgroups.using", 00285 jgroupConfigFile.toString())); 00286 JGroupsMembershipService gms = new JGroupsMembershipService( 00287 jgroupConfigFile); 00288 channel = new JGroupsReliableChannelWithGms(gms); 00289 if (logger.isDebugEnabled()) 00290 logger.debug("Group communication channel is configured as follows: " 00291 + ((JGroupsReliableChannelWithGms) channel).getProperties()); 00292 00293 // Join the group 00294 channel.join(new Group(new GroupIdentifier(groupName))); 00295 multicastRequestAdapter = new MulticastRequestAdapter(channel // group 00296 // channel 00297 , this /* MessageListener */ 00298 , this /* MulticastRequestListener */ 00299 ); 00300 00301 // Let the MulticastRequestAdapter thread pump the membership out of the 00302 // JGroups channel. 00303 Thread.yield(); 00304 00305 logger.info("Group " + groupName + " connected to " 00306 + channel.getLocalMembership()); 00307 00308 // Add ourselves to the list of controllers 00309 controllersMap.put(channel.getLocalMembership(), controller.getJmxName()); 00310 00311 // Check if we are alone or not 00312 currentGroup = channel.getCurrentGroup(); 00313 if (currentGroup.getMembers().size() == 1) 00314 { 00315 logger.info(Translate.get( 00316 "virtualdatabase.distributed.configuration.first.in.group", 00317 groupName)); 00318 allMemberButUs = new ArrayList(); 00319 return; 00320 } 00321 00322 // Compute the group list without us 00323 allMemberButUs = (ArrayList) currentGroup.getMembers().clone(); 00324 00325 // Our controller id is our position in the membership. 00326 // This assumes that all controllers have the view in the same order. 00327 ((DistributedRequestManager) requestManager) 00328 .setControllerId(allMemberButUs.indexOf(channel.getLocalMembership())); 00329 allMemberButUs.remove(channel.getLocalMembership()); 00330 00331 // Check with the other controller that our config is compatible 00332 if (checkConfigurationCompatibility(allMemberButUs) == false) 00333 { 00334 String msg = Translate 00335 .get("virtualdatabase.distributed.configuration.not.compatible"); 00336 logger.error(msg); 00337 throw new ControllerException(msg); 00338 } 00339 00340 logger.info(Translate 00341 .get("virtualdatabase.distributed.configuration.compatible")); 00342 00343 // Distribute backends among controllers knowing that at this point 00344 // there is no conflict on the backend distribution policies. 00345 broadcastBackendInformation(allMemberButUs); 00346 } 00347 catch (Exception e) 00348 { 00349 String msg = Translate.get("virtualdatabase.distributed.joingroup.error", 00350 groupName); 00351 if (e instanceof RuntimeException) 00352 logger.error(msg, e); 00353 throw new Exception(msg + " (" + e + ")"); 00354 } 00355 }
|
|
Quit the jgroups channel
Definition at line 201 of file DistributedVirtualDatabase.java. Referenced by org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.finalize(). 00202 {
00203 if (channel != null)
00204 {
00205 channel.close();
00206 }
00207 }
|
|
Definition at line 569 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.common.log.Trace.error(). 00570 { 00571 logger.error("Distributed virtual database received unhandled message: " 00572 + msg); 00573 }
|
|
Reimplemented from org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase. Definition at line 1033 of file DistributedVirtualDatabase.java. 01034 { 01035 super.removeBackend(backend); 01036 01037 try 01038 { 01039 // Send a group message to update backend list 01040 broadcastBackendInformation(allMemberButUs); 01041 } 01042 catch (Exception e) 01043 { 01044 String msg = "An error occured while multicasting new backedn information"; 01045 logger.error(msg, e); 01046 throw new VirtualDatabaseException(msg, e); 01047 } 01048 }
|
|
(non-Javadoc)
Reimplemented from org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase. Definition at line 962 of file DistributedVirtualDatabase.java. 00964 { 00965 super.setAuthenticationManager(authenticationManager); 00966 }
|
|
Sets the group name used by the controllers hosting this virtual database.
Definition at line 235 of file DistributedVirtualDatabase.java. 00236 {
00237 this.groupName = groupName;
00238 }
|
|
Sets a new distributed request manager for this database.
Reimplemented from org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase. Definition at line 255 of file DistributedVirtualDatabase.java. 00256 { 00257 if (!(requestManager instanceof DistributedRequestManager)) 00258 throw new RuntimeException( 00259 "A distributed virtual database can only work with a distributed request manager."); 00260 this.requestManager = requestManager; 00261 }
|
|
Reimplemented from org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase. Definition at line 1054 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.controller.requestmanager.RequestManager.disableBackend(), and org.objectweb.cjdbc.controller.requestmanager.RequestManager.disableBackendForCheckpoint(). 01056 { 01057 // Get the target controller 01058 ArrayList dest = new ArrayList(1); 01059 Iterator iter = controllersMap.entrySet().iterator(); 01060 Entry entry; 01061 Member targetMember = null; 01062 while (iter.hasNext()) 01063 { 01064 entry = (Entry) iter.next(); 01065 if (entry.getValue().equals(controllerDestination)) 01066 targetMember = (Member) entry.getKey(); 01067 } 01068 if (targetMember == null) 01069 throw new VirtualDatabaseException("Cannot find controller:" 01070 + controllerDestination + " in group"); 01071 dest.add(targetMember); 01072 01073 // Get reference on backend 01074 DatabaseBackend db = getAndCheckBackend(backend, NO_CHECK_BACKEND); 01075 01076 // Disable backend 01077 try 01078 { 01079 DistributedRequestManager manager = ((DistributedRequestManager) requestManager); 01080 if (hasRecoveryLog()) 01081 manager.disableBackendForCheckpoint(db, "transfer of " + backend 01082 + " to :" + controllerDestination); 01083 else 01084 manager.disableBackend(db); 01085 } 01086 catch (SQLException e) 01087 { 01088 throw new VirtualDatabaseException(e.getMessage()); 01089 } 01090 01091 try 01092 { 01093 // Send backend transfer message 01094 if (logger.isDebugEnabled()) 01095 logger.debug("Sending transfer message to:" + targetMember); 01096 01097 multicastRequestAdapter.multicastMessage(dest, new BackendTransfer( 01098 controllerDestination, createBackendInfo(db, true)), 01099 MulticastRequestAdapter.WAIT_ALL, 01100 CJDBCGroupMessage.defaultCastTimeOut); 01101 01102 // Remove backend from this controller 01103 removeBackend(db); 01104 01105 // Broadcast updated backend list 01106 broadcastBackendInformation(allMemberButUs); 01107 } 01108 catch (Exception e) 01109 { 01110 String msg = "An error occured while transfering the backend"; 01111 logger.error(msg, e); 01112 throw new VirtualDatabaseException(msg, e); 01113 } 01114 }
|
|
Definition at line 839 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.common.log.Trace.info(), and org.objectweb.cjdbc.common.log.Trace.warn(). 00840 { 00841 ArrayList newMembers = newGroup.getMembers(); 00842 int newSize = newMembers.size(); 00843 for (int i = 0; i < newSize; i++) 00844 { 00845 Member m = (Member) newMembers.get(i); 00846 if (!currentGroup.hasMember(m)) 00847 { 00848 logger.info(controller.getControllerName() + ":New controller " + m.toString() 00849 + " detected."); 00850 } 00851 } 00852 ArrayList currentMembers = currentGroup.getMembers(); 00853 logger.info(controller.getControllerName() + ":Current Members:" + currentMembers); 00854 int currentSize = currentMembers.size(); 00855 for (int i = 0; i < currentSize; i++) 00856 { 00857 Member m = (Member) currentMembers.get(i); 00858 if (!newGroup.hasMember(m)) 00859 { 00860 logger.warn("Controller " + m + " has failed."); 00861 } 00862 } 00863 currentGroup = newGroup; 00864 currentMembers = currentGroup.getMembers(); 00865 logger.info(controller.getControllerName() + ":new Members:" + currentMembers); 00866 allMemberButUs = ((ArrayList) currentGroup.getMembers().clone()); 00867 allMemberButUs.remove(channel.getLocalMembership()); 00868 }
|
|
Reimplemented from org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase. Definition at line 939 of file DistributedVirtualDatabase.java. References org.objectweb.cjdbc.common.log.Trace.info(). 00940 { 00941 if (logger.isInfoEnabled()) 00942 { 00943 logger.info(channel.getLocalMembership() + " see members:" 00944 + currentGroup.getMembers() + " and has mapping:" + controllersMap); 00945 } 00946 String[] members = new String[controllersMap.keySet().size()]; 00947 Iterator iter = controllersMap.keySet().iterator(); 00948 int i = 0; 00949 while (iter.hasNext()) 00950 { 00951 members[i] = (String) controllersMap.get(iter.next()); 00952 i++; 00953 } 00954 return members; 00955 }
|
|
Reimplemented from org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase. Definition at line 971 of file DistributedVirtualDatabase.java. 00972 { 00973 Hashtable map = new Hashtable(controllersMap.size()); 00974 Iterator iter = backendsPerController.keySet().iterator(); 00975 Address addr; 00976 while (iter.hasNext()) 00977 { 00978 addr = (Address) iter.next(); 00979 map.put(controllersMap.get(addr), backendsPerController.get(addr)); 00980 } 00981 return map; 00982 }
|