1 22 23 package org.continuent.sequoia.controller.loadbalancer.paralleldb; 24 25 import java.sql.SQLException ; 26 import java.util.ArrayList ; 27 28 import org.continuent.sequoia.common.exceptions.NoMoreBackendException; 29 import org.continuent.sequoia.common.i18n.Translate; 30 import org.continuent.sequoia.common.xml.DatabasesXmlTags; 31 import org.continuent.sequoia.controller.backend.DatabaseBackend; 32 import org.continuent.sequoia.controller.requests.AbstractRequest; 33 import org.continuent.sequoia.controller.requests.AbstractWriteRequest; 34 import org.continuent.sequoia.controller.virtualdatabase.VirtualDatabase; 35 36 44 public class ParallelDB_LPRF extends ParallelDB 45 { 46 47 53 public ParallelDB_LPRF(VirtualDatabase vdb) throws Exception 54 { 55 super(vdb); 56 } 57 58 61 public DatabaseBackend chooseBackendForReadRequest(AbstractRequest request) 62 throws SQLException 63 { 64 try 66 { 67 vdb.acquireReadLockBackendLists(); 68 } 69 catch (InterruptedException e) 70 { 71 String msg = Translate.get( 72 "loadbalancer.backendlist.acquire.readlock.failed", e); 73 logger.error(msg); 74 throw new SQLException (msg); 75 } 76 77 DatabaseBackend backend = null; 79 try 82 { 83 ArrayList backends = vdb.getBackends(); 84 int size = backends.size(); 85 86 if (size == 0) 87 throw new NoMoreBackendException(Translate.get( 88 "loadbalancer.execute.no.backend.available", request.getId())); 89 90 int leastRequests = 0; 92 for (int i = 0; i < size; i++) 93 { 94 DatabaseBackend b = (DatabaseBackend) backends.get(i); 95 if (b.isReadEnabled()) 96 { 97 int pending = b.getPendingRequests().size(); 98 if ((backend == null) || (pending < leastRequests)) 99 { 100 backend = b; 101 if (pending == 0) 102 break; else 104 leastRequests = pending; 105 } 106 } 107 } 108 109 if (backend == null) 110 throw new SQLException (Translate.get( 111 "loadbalancer.execute.no.backend.enabled", request.getId())); 112 } 113 catch (RuntimeException e) 114 { 115 String msg = Translate.get("loadbalancer.execute.find.backend.failed", 116 new String []{request.getSqlShortForm(vdb.getSqlShortFormLength()), 117 e.getMessage()}); 118 logger.error(msg, e); 119 throw new SQLException (msg); 120 } 121 finally 122 { 123 vdb.releaseReadLockBackendLists(); 124 } 125 126 return backend; 127 } 128 129 132 public DatabaseBackend chooseBackendForWriteRequest( 133 AbstractWriteRequest request) throws SQLException 134 { 135 try 137 { 138 vdb.acquireReadLockBackendLists(); 139 } 140 catch (InterruptedException e) 141 { 142 String msg = Translate.get( 143 "loadbalancer.backendlist.acquire.readlock.failed", e); 144 logger.error(msg); 145 throw new SQLException (msg); 146 } 147 148 DatabaseBackend backend = null; 150 try 153 { 154 ArrayList backends = vdb.getBackends(); 155 int size = backends.size(); 156 157 if (size == 0) 158 throw new NoMoreBackendException(Translate.get( 159 "loadbalancer.execute.no.backend.available", request.getId())); 160 161 int leastRequests = 0; 163 for (int i = 0; i < size; i++) 164 { 165 DatabaseBackend b = (DatabaseBackend) backends.get(i); 166 if (b.isWriteEnabled() && !b.isDisabling()) 167 { 168 int pending = b.getPendingRequests().size(); 169 if ((backend == null) || (pending < leastRequests)) 170 { 171 backend = b; 172 if (pending == 0) 173 break; else 175 leastRequests = pending; 176 } 177 } 178 } 179 180 if (backend == null) 181 { 182 throw new SQLException (Translate.get( 183 "loadbalancer.execute.no.backend.enabled", request.getId())); 184 } 185 } 186 catch (RuntimeException e) 187 { 188 String msg = Translate.get("loadbalancer.execute.find.backend.failed", 189 new String []{request.getSqlShortForm(vdb.getSqlShortFormLength()), 190 e.getMessage()}); 191 logger.error(msg, e); 192 throw new SQLException (msg); 193 } 194 finally 195 { 196 vdb.releaseReadLockBackendLists(); 197 } 198 199 return backend; 200 } 201 202 205 public String getInformation() 206 { 207 int size = vdb.getBackends().size(); 209 210 if (size == 0) 211 return "ParallelDB Least Pending Request First Request load balancer: !!!Warning!!! No backend nodes found\n"; 212 else 213 return "ParallelDB Least Pending Request First Request load balancer (" 214 + size + " backends)\n"; 215 } 216 217 220 public String getParallelDBXml() 221 { 222 return "<" + DatabasesXmlTags.ELT_ParallelDB_LeastPendingRequestsFirst 223 + "/>"; 224 } 225 } | Popular Tags |