Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase Class Reference

Inheritance diagram for org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase:

Inheritance graph
[legend]
Collaboration diagram for org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase:

Collaboration graph
[legend]
List of all members.

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 ()

Detailed Description

A DistributedVirtualDatabase is a virtual database hosted by several controllers. Communication between the controllers is achieved with reliable multicast provided by Javagroups.

Author:
Emmanuel Cecchet
Version:
1.0

Definition at line 87 of file DistributedVirtualDatabase.java.


Constructor & Destructor Documentation

org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.DistributedVirtualDatabase Controller  controller,
String  name,
String  groupName,
int  maxConnections,
boolean  pool,
int  minThreads,
int  maxThreads,
long  maxThreadIdleTime,
int  sqlShortFormLength,
AbstractBlobFilter  blobFilter
throws NotCompliantMBeanException, JmxException
 

Creates a new DistributedVirtualDatabase instance.

Parameters:
controller the controller we belong to
name the virtual database name
groupName the virtual database group name
maxConnections maximum number of concurrent connections.
pool should we use a pool of threads for handling connections?
minThreads minimum number of threads in the pool
maxThreads maximum number of threads in the pool
maxThreadIdleTime maximum time a thread can remain idle before being removed from the pool.
sqlShortFormLength maximum number of characters of an SQL statement to diplay in traces or exceptions
blobFilter encoding method for blobs
Exceptions:
NotCompliantMBeanException in case the bean does not comply with jmx
JmxException the bean could not be registeed

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   }


Member Function Documentation

void org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.addBackend DatabaseBackend  db  )  throws VirtualDatabaseException
 

See also:
org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.addBackend(org.objectweb.cjdbc.controller.backend.DatabaseBackend)

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   }

void org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.addBackendRecoveryPolicy BackendRecoveryPolicy  policy  ) 
 

Add a BackendRecoveryPolicy

Parameters:
policy the policy to add

Definition at line 245 of file DistributedVirtualDatabase.java.

References org.objectweb.cjdbc.controller.backend.BackendRecoveryPolicy.getBackendName().

00246   {
00247     backendRecoveryPolicy.put(policy.getBackendName(), policy);
00248   }

BackendInfo org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.createBackendInfo DatabaseBackend  backend,
boolean  useXml
 

Create backend information object from a DatabaseBackend object This will get only static information

Parameters:
backend the DatabaseBackend object to get info from
useXml should we use xml for extensive backend description
Returns:
BackendInfo

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   }

boolean org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.equals Object  other  ) 
 

Two virtual databases are equal if they have the same name, login and password.

Parameters:
other an object
Returns:
a boolean value

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   }

void org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.finalize  )  throws Throwable [protected]
 

Disconnect the channel and close it.

See also:
java.lang.Object#finalize()

Definition at line 165 of file DistributedVirtualDatabase.java.

References org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.quitChannel().

00166   {
00167     quitChannel();
00168     super.finalize();
00169   }

ArrayList org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getAllMemberButUs  ) 
 

Returns the list of all members in the group except us.

Returns:
Returns the allMemberButUs.

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   }

HashMap org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getBackendRecoveryPolicy  ) 
 

Get the backend distribution policies

Returns:
an ArrayList of BackendRecoveryPolicy objects

Definition at line 879 of file DistributedVirtualDatabase.java.

Referenced by org.objectweb.cjdbc.controller.virtualdatabase.protocol.VirtualDatabaseConfiguration.VirtualDatabaseConfiguration().

00880   {
00881     return backendRecoveryPolicy;
00882   }

ArrayList org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getBackendsInfo ArrayList  backendsObject  ) 
 

We have to convert the backends list from an array of DatabaseBackend object to an ArrayList of BackendInfo objects. The DatabaseBackend objects cannot be serialized because they are used as MBean and notification emitters, so we want to extract the info out of them.

Parameters:
backendsObject the list of DatabaseBackend object
See also:
BackendInfo
Returns:
a list of BackendInfo objects

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   }

void org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getBackendStatus  )  throws TimeoutException, ChannelException, NotConnectedException
 

Get the status of all remote controllers

Exceptions:
NotConnectedException if the channel is not connected
ChannelException if the channel reported an error
TimeoutException if a timeout occured

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   }

ReliableGroupChannelWithGms org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getChannel  ) 
 

Get the JGroups' channel used for group communications

Returns:
a JChannel

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   }

String org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getControllerName  ) 
 

Returns the controllerName value.

Returns:
Returns the controllerName.

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   }

Group org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getCurrentGroup  ) 
 

Returns the currentGroup value.

Returns:
Returns the currentGroup.

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   }

String org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getDistributionXml  )  [protected]
 

Get the XML dump of the Distribution element if any.

Returns:
XML dump of the Distribution element

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   }

String org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getGroupName  ) 
 

Returns the group name this virtual database belongs to.

Returns:
a String value. Returns null if this virtual database is standalone

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   }

MulticastRequestAdapter org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.getMulticastRequestAdapter  ) 
 

Return the group communication multicast request adapter.

Returns:
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   }

Serializable org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.handleMessageMultiThreaded Serializable  msg,
Member  sender,
Object  handleMessageSingleThreadedResult
 

See also:
org.objectweb.tribe.adapters.MulticastRequestListener#handleMessageMultiThreaded(Serializable, Member, Object)

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   }

Object org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.handleMessageSingleThreaded Serializable  msg,
Member  sender
 

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.

See also:
org.objectweb.tribe.adapters.MulticastRequestListener#handleMessageSingleThreaded(java.io.Serializable, org.objectweb.tribe.common.Member)

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   }

boolean org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.isCompatibleBackend BackendInfo  backend  )  throws VirtualDatabaseException
 

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.

Parameters:
backend the backend to check
Returns:
true if the backend is compatible with the local definition
Exceptions:
VirtualDatabaseException if locking the local backend list fails

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   }

boolean org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.isDistributed  ) 
 

Is this virtual database distributed ?

Returns:
true

Reimplemented from org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.

Definition at line 889 of file DistributedVirtualDatabase.java.

00890   {
00891     return true;
00892   }

void org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.joinGroup  )  throws Exception
 

Makes this virtual database join a virtual database group. Those groups are mapped to JavaGroups groups.

Exceptions:
Exception if an error occurs

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   }

void org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.quitChannel  )  throws ChannelException, NotConnectedException
 

Quit the jgroups channel

Exceptions:
NotConnectedException if the channel is not connected
ChannelException if an error occured while closing the 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   }

void org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.receive Serializable  msg  ) 
 

See also:
org.objectweb.tribe.messages.MessageListener#receive(java.io.Serializable)

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   }

void org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.removeBackend String  backend  )  throws VirtualDatabaseException
 

See also:
org.objectweb.cjdbc.common.jmx.mbeans.VirtualDatabaseMBean.removeBackend(java.lang.String)

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   }

void org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.setAuthenticationManager AuthenticationManager  authenticationManager  ) 
 

(non-Javadoc)

See also:
org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.setAuthenticationManager(org.objectweb.cjdbc.controller.authentication.AuthenticationManager)

Reimplemented from org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.

Definition at line 962 of file DistributedVirtualDatabase.java.

00964   {
00965     super.setAuthenticationManager(authenticationManager);
00966   }

void org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.setGroupName String  groupName  ) 
 

Sets the group name used by the controllers hosting this virtual database.

Parameters:
groupName the group name to set

Definition at line 235 of file DistributedVirtualDatabase.java.

00236   {
00237     this.groupName = groupName;
00238   }

void org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.setRequestManager RequestManager  requestManager  ) 
 

Sets a new distributed request manager for this database.

Parameters:
requestManager the new request manager.

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   }

void org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.transferBackend String  backend,
String  controllerDestination
throws VirtualDatabaseException
 

See also:
org.objectweb.cjdbc.common.jmx.mbeans.VirtualDatabaseMBean.transferBackend(java.lang.String, java.lang.String)

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   }

void org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.viewAccepted Group  newGroup  ) 
 

See also:
org.jgroups.MembershipListener#viewAccepted(org.jgroups.View)

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   }

String [] org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.viewControllerList  ) 
 

See also:
org.objectweb.cjdbc.common.jmx.mbeans.VirtualDatabaseMBean.viewControllerList()

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   }

Hashtable org.objectweb.cjdbc.controller.virtualdatabase.DistributedVirtualDatabase.viewGroupBackends  )  throws VirtualDatabaseException
 

See also:
org.objectweb.cjdbc.common.jmx.mbeans.VirtualDatabaseMBean.viewGroupBackends()

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   }


The documentation for this class was generated from the following file:
Generated on Mon Apr 11 22:04:44 2005 for C-JDBC by  doxygen 1.3.9.1