KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > continuent > sequoia > controller > virtualdatabase > protocol > DistributedRequest


1 /**
2  * Sequoia: Database clustering technology.
3  * Copyright (C) 2002-2004 French National Institute For Research In Computer
4  * Science And Control (INRIA).
5  * Copyright (C) 2005 AmicoSoft, Inc. dba Emic Networks
6  * Copyright (C) 2006 Continuent, Inc.
7  * Contact: sequoia@continuent.org
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  * http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  * Initial developer(s): Emmanuel Cecchet.
22  * Contributor(s): Damian Arregui.
23  */

24
25 package org.continuent.sequoia.controller.virtualdatabase.protocol;
26
27 import java.io.Serializable JavaDoc;
28 import java.sql.SQLException JavaDoc;
29
30 import org.continuent.hedera.common.Member;
31 import org.continuent.sequoia.common.exceptions.VirtualDatabaseStartingException;
32 import org.continuent.sequoia.common.log.Trace;
33 import org.continuent.sequoia.controller.requestmanager.distributed.DistributedRequestManager;
34 import org.continuent.sequoia.controller.requests.AbstractRequest;
35 import org.continuent.sequoia.controller.virtualdatabase.DistributedVirtualDatabase;
36
37 /**
38  * <code>DistributedRequest</code> is an abstract class that defines the
39  * interface for distributed execution of a request (horizontal scalability).
40  *
41  * @author <a HREF="mailto:Emmanuel.Cecchet@inria.fr">Emmanuel Cecchet </a>
42  * @author <a HREF="mailto:damian.arregui@continuent.com">Damian Arregui </a>
43  * @version 1.0
44  */

45 public abstract class DistributedRequest
46     extends DistributedVirtualDatabaseMessage
47 {
48   protected AbstractRequest request;
49
50   /**
51    * Builds a new <code>DistributedRequest</code> object.
52    *
53    * @param request request to execute
54    */

55   public DistributedRequest(AbstractRequest request)
56   {
57     this.request = request;
58   }
59
60   /**
61    * Returns the request value.
62    *
63    * @return Returns the request.
64    */

65   public final AbstractRequest getRequest()
66   {
67     return request;
68   }
69
70   /**
71    * Schedule the request. This method blocks until the request is scheduled.
72    *
73    * @param drm a distributed request manager
74    * @return the object inserted in the total order queue
75    * @throws SQLException if an error occurs.
76    */

77   public abstract Object JavaDoc scheduleRequest(DistributedRequestManager drm)
78       throws SQLException JavaDoc;
79
80   /**
81    * Code to be executed by the distributed request manager receiving the
82    * request.
83    *
84    * @param drm a distributed request manager
85    * @return an Object to be sent back to the caller
86    * @throws SQLException if an error occurs.
87    */

88   public abstract Serializable JavaDoc executeScheduledRequest(
89       DistributedRequestManager drm) throws SQLException JavaDoc;
90
91   /**
92    * @see org.continuent.sequoia.controller.virtualdatabase.protocol.DistributedVirtualDatabaseMessage#handleMessageSingleThreaded(org.continuent.sequoia.controller.virtualdatabase.DistributedVirtualDatabase,
93    * org.continuent.hedera.common.Member)
94    */

95   public Object JavaDoc handleMessageSingleThreaded(DistributedVirtualDatabase dvdb,
96       Member sender)
97   {
98     if (!dvdb.isVirtualDatabaseStarted())
99     {
100       request = null; // prevent further logging
101
return new VirtualDatabaseStartingException();
102     }
103
104     Trace logger = dvdb.getLogger();
105
106     if (logger.isDebugEnabled() && (getRequest() != null))
107       logger.debug(dvdb.getControllerName()
108           + ": Scheduling distributedRequest " + getRequest().getId()
109           + " from " + sender);
110
111     // Take current time to profile query execution time
112
if (request != null)
113       request.setStartTime(System.currentTimeMillis());
114
115     // Distributed request logger
116
Trace distributedRequestLogger = dvdb.getDistributedRequestLogger();
117     if (distributedRequestLogger.isInfoEnabled())
118       distributedRequestLogger.info(toString());
119
120     try
121     {
122       return scheduleRequest((DistributedRequestManager) dvdb
123           .getRequestManager());
124     }
125     catch (SQLException JavaDoc e)
126     {
127       return e;
128     }
129   }
130
131   /**
132    * @see org.continuent.sequoia.controller.virtualdatabase.protocol.DistributedVirtualDatabaseMessage#handleMessageMultiThreaded(org.continuent.sequoia.controller.virtualdatabase.DistributedVirtualDatabase,
133    * org.continuent.hedera.common.Member, java.lang.Object)
134    */

135   public Serializable JavaDoc handleMessageMultiThreaded(
136       DistributedVirtualDatabase dvdb, Member sender,
137       Object JavaDoc handleMessageSingleThreadedResult)
138   {
139     Trace logger = dvdb.getLogger();
140
141     if (handleMessageSingleThreadedResult instanceof Exception JavaDoc)
142     {
143       // The scheduling part more likely failed, report the exception back
144
if (logger.isInfoEnabled() && (getRequest() != null))
145         logger.info("Distributed query "
146             + getRequest().getSqlShortForm(dvdb.getSqlShortFormLength())
147             + " failed on this controller",
148             (Throwable JavaDoc) handleMessageSingleThreadedResult);
149       return (Serializable JavaDoc) handleMessageSingleThreadedResult;
150     }
151
152     if ((logger.isDebugEnabled()) && (getRequest() != null))
153       logger.debug(dvdb.getControllerName() + ": Executing distributedRequest "
154           + getRequest().getId() + " from " + sender);
155     try
156     {
157       return executeScheduledRequest((DistributedRequestManager) dvdb
158           .getRequestManager());
159     }
160     catch (SQLException JavaDoc e)
161     {
162       return e;
163     }
164   }
165 }
Popular Tags