Mercurial Hosting > luan
annotate src/org/eclipse/jetty/io/nio/SelectorManager.java @ 949:e9088af3787f
remove SelectSet._changes
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Tue, 11 Oct 2016 23:18:13 -0600 |
| parents | f5aefdc4a81a |
| children | a778413aefc0 |
| rev | line source |
|---|---|
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
1 // |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
2 // ======================================================================== |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
4 // ------------------------------------------------------------------------ |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
5 // All rights reserved. This program and the accompanying materials |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
6 // are made available under the terms of the Eclipse Public License v1.0 |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
7 // and Apache License v2.0 which accompanies this distribution. |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
8 // |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
9 // The Eclipse Public License is available at |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
10 // http://www.eclipse.org/legal/epl-v10.html |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
11 // |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
12 // The Apache License v2.0 is available at |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
13 // http://www.opensource.org/licenses/apache2.0.php |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
14 // |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
15 // You may elect to redistribute this code under either of these licenses. |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
16 // ======================================================================== |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
17 // |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
18 |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
19 package org.eclipse.jetty.io.nio; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
20 |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
21 import java.io.IOException; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
22 import java.nio.channels.CancelledKeyException; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
23 import java.nio.channels.Channel; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
24 import java.nio.channels.ClosedSelectorException; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
25 import java.nio.channels.SelectableChannel; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
26 import java.nio.channels.SelectionKey; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
27 import java.nio.channels.Selector; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
28 import java.nio.channels.ServerSocketChannel; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
29 import java.nio.channels.SocketChannel; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
30 import java.util.ArrayList; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
31 import java.util.List; |
|
944
1d24b6e422fa
simplify SelectorManager
Franklin Schmidt <fschmidt@gmail.com>
parents:
943
diff
changeset
|
32 import java.util.Collections; |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
33 import java.util.Set; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
34 import java.util.concurrent.ConcurrentHashMap; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
35 import java.util.concurrent.ConcurrentLinkedQueue; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
36 import java.util.concurrent.ConcurrentMap; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
37 import java.util.concurrent.CountDownLatch; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
38 import java.util.concurrent.TimeUnit; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
39 |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
40 import org.eclipse.jetty.io.AsyncEndPoint; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
41 import org.eclipse.jetty.io.ConnectedEndPoint; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
42 import org.eclipse.jetty.io.Connection; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
43 import org.eclipse.jetty.io.EndPoint; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
44 import org.eclipse.jetty.util.TypeUtil; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
45 import org.eclipse.jetty.util.component.AbstractLifeCycle; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
46 import org.eclipse.jetty.util.component.AggregateLifeCycle; |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
47 import org.eclipse.jetty.util.component.Dumpable; |
|
820
8e9db0bbf4f9
remove org.eclipse.jetty.util.log and upgrade slf4j
Franklin Schmidt <fschmidt@gmail.com>
parents:
802
diff
changeset
|
48 import org.slf4j.Logger; |
|
8e9db0bbf4f9
remove org.eclipse.jetty.util.log and upgrade slf4j
Franklin Schmidt <fschmidt@gmail.com>
parents:
802
diff
changeset
|
49 import org.slf4j.LoggerFactory; |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
50 |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
51 |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
52 /* ------------------------------------------------------------ */ |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
53 /** |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
54 * The Selector Manager manages and number of SelectSets to allow |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
55 * NIO scheduling to scale to large numbers of connections. |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
56 * <p> |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
57 */ |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
58 public abstract class SelectorManager extends AbstractLifeCycle implements Dumpable |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
59 { |
| 865 | 60 public static final Logger LOG=LoggerFactory.getLogger("org.eclipse.jetty.io.nio"); |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
61 |
| 865 | 62 private static final int __MONITOR_PERIOD=Integer.getInteger("org.eclipse.jetty.io.nio.MONITOR_PERIOD",1000).intValue(); |
| 63 private static final int __MAX_SELECTS=Integer.getInteger("org.eclipse.jetty.io.nio.MAX_SELECTS",100000).intValue(); | |
| 64 private static final int __BUSY_PAUSE=Integer.getInteger("org.eclipse.jetty.io.nio.BUSY_PAUSE",50).intValue(); | |
| 65 private static final int __IDLE_TICK=Integer.getInteger("org.eclipse.jetty.io.nio.IDLE_TICK",400).intValue(); | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
66 |
| 865 | 67 private int _maxIdleTime; |
| 68 private long _lowResourcesConnections; | |
| 69 private SelectSet[] _selectSet; | |
| 70 private int _selectSets=1; | |
| 71 private volatile int _set=0; | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
72 |
| 865 | 73 /* ------------------------------------------------------------ */ |
| 74 /** | |
| 75 * @param maxIdleTime The maximum period in milli seconds that a connection may be idle before it is closed. | |
| 76 * @see #setLowResourcesMaxIdleTime(long) | |
| 77 */ | |
| 78 public void setMaxIdleTime(long maxIdleTime) | |
| 79 { | |
| 80 _maxIdleTime=(int)maxIdleTime; | |
| 81 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
82 |
| 865 | 83 /* ------------------------------------------------------------ */ |
| 84 /** | |
| 85 * @param selectSets number of select sets to create | |
| 86 */ | |
| 87 public void setSelectSets(int selectSets) | |
| 88 { | |
| 89 long lrc = _lowResourcesConnections * _selectSets; | |
| 90 _selectSets=selectSets; | |
| 91 _lowResourcesConnections=lrc/_selectSets; | |
| 92 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
93 |
| 865 | 94 /* ------------------------------------------------------------ */ |
| 95 /** Register a channel | |
| 96 * @param channel | |
| 97 */ | |
| 98 public void register(SocketChannel channel) | |
| 99 { | |
| 100 // The ++ increment here is not atomic, but it does not matter. | |
| 101 // so long as the value changes sometimes, then connections will | |
| 102 // be distributed over the available sets. | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
103 |
|
948
f5aefdc4a81a
simplify SelectChannelConnector
Franklin Schmidt <fschmidt@gmail.com>
parents:
944
diff
changeset
|
104 int s = _set++; |
| 865 | 105 if (s<0) |
| 106 s=-s; | |
| 107 s=s%_selectSets; | |
|
948
f5aefdc4a81a
simplify SelectChannelConnector
Franklin Schmidt <fschmidt@gmail.com>
parents:
944
diff
changeset
|
108 SelectSet[] sets = _selectSet; |
| 865 | 109 if (sets!=null) |
| 110 { | |
| 111 SelectSet set=sets[s]; | |
| 112 set.addChange(channel); | |
| 113 set.wakeup(); | |
| 114 } | |
| 115 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
116 |
| 865 | 117 /* ------------------------------------------------------------ */ |
| 118 /** | |
| 119 * @return the lowResourcesConnections | |
| 120 */ | |
| 121 public long getLowResourcesConnections() | |
| 122 { | |
| 123 return _lowResourcesConnections*_selectSets; | |
| 124 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
125 |
| 865 | 126 /* ------------------------------------------------------------ */ |
| 127 /** | |
| 128 * Set the number of connections, which if exceeded places this manager in low resources state. | |
| 129 * This is not an exact measure as the connection count is averaged over the select sets. | |
| 130 * @param lowResourcesConnections the number of connections | |
| 131 * @see #setLowResourcesMaxIdleTime(long) | |
| 132 */ | |
| 133 public void setLowResourcesConnections(long lowResourcesConnections) | |
| 134 { | |
| 135 _lowResourcesConnections=(lowResourcesConnections+_selectSets-1)/_selectSets; | |
| 136 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
137 |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
138 |
| 865 | 139 public abstract void execute(Runnable task); |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
140 |
| 865 | 141 /* ------------------------------------------------------------ */ |
| 142 /* (non-Javadoc) | |
| 143 * @see org.eclipse.component.AbstractLifeCycle#doStart() | |
| 144 */ | |
| 145 @Override | |
| 146 protected void doStart() throws Exception | |
| 147 { | |
| 148 _selectSet = new SelectSet[_selectSets]; | |
| 149 for (int i=0;i<_selectSet.length;i++) | |
| 150 _selectSet[i]= new SelectSet(i); | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
151 |
| 865 | 152 super.doStart(); |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
153 |
| 865 | 154 // start a thread to Select |
|
948
f5aefdc4a81a
simplify SelectChannelConnector
Franklin Schmidt <fschmidt@gmail.com>
parents:
944
diff
changeset
|
155 for (int i=0;i<_selectSets;i++) |
| 865 | 156 { |
| 157 final int id=i; | |
| 158 execute(new Runnable() | |
| 159 { | |
| 160 public void run() | |
| 161 { | |
| 162 String name=Thread.currentThread().getName(); | |
| 163 try | |
| 164 { | |
| 165 SelectSet[] sets=_selectSet; | |
| 166 if (sets==null) | |
| 167 return; | |
| 168 SelectSet set=sets[id]; | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
169 |
| 865 | 170 Thread.currentThread().setName(name+" Selector"+id); |
| 171 LOG.debug("Starting {} on {}",Thread.currentThread(),this); | |
| 172 while (isRunning()) | |
| 173 { | |
| 174 try | |
| 175 { | |
| 176 set.doSelect(); | |
| 177 } | |
| 178 catch(IOException e) | |
| 179 { | |
| 180 LOG.trace("",e); | |
| 181 } | |
| 182 catch(Exception e) | |
| 183 { | |
| 184 LOG.warn("",e); | |
| 185 } | |
| 186 } | |
| 187 } | |
| 188 finally | |
| 189 { | |
| 190 LOG.debug("Stopped {} on {}",Thread.currentThread(),this); | |
| 191 Thread.currentThread().setName(name); | |
| 192 } | |
| 193 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
194 |
| 865 | 195 }); |
| 196 } | |
| 197 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
198 |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
199 |
| 865 | 200 /* ------------------------------------------------------------------------------- */ |
| 201 @Override | |
| 202 protected void doStop() throws Exception | |
| 203 { | |
| 204 SelectSet[] sets= _selectSet; | |
| 205 _selectSet=null; | |
| 206 if (sets!=null) | |
| 207 { | |
| 208 for (SelectSet set : sets) | |
| 209 { | |
| 210 if (set!=null) | |
| 211 set.stop(); | |
| 212 } | |
| 213 } | |
| 214 super.doStop(); | |
| 215 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
216 |
| 865 | 217 /* ------------------------------------------------------------------------------- */ |
| 218 public abstract AsyncConnection newConnection(SocketChannel channel, AsyncEndPoint endpoint, Object attachment); | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
219 |
| 865 | 220 public String dump() |
| 221 { | |
| 222 return AggregateLifeCycle.dump(this); | |
| 223 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
224 |
| 865 | 225 public void dump(Appendable out, String indent) throws IOException |
| 226 { | |
| 227 AggregateLifeCycle.dumpObject(out,this); | |
| 228 AggregateLifeCycle.dump(out,indent,TypeUtil.asList(_selectSet)); | |
| 229 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
230 |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
231 |
| 865 | 232 public class SelectSet implements Dumpable |
| 233 { | |
| 234 private final int _setID; | |
| 943 | 235 private volatile long _now = System.currentTimeMillis(); |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
236 |
| 865 | 237 private volatile Selector _selector; |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
238 |
| 865 | 239 private volatile Thread _selecting; |
| 240 private int _busySelects; | |
| 241 private long _monitorNext; | |
| 242 private boolean _pausing; | |
| 243 private boolean _paused; | |
| 244 private volatile long _idleTick; | |
| 245 private ConcurrentMap<SelectChannelEndPoint,Object> _endPoints = new ConcurrentHashMap<SelectChannelEndPoint, Object>(); | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
246 |
| 865 | 247 SelectSet(int acceptorID) throws Exception |
| 248 { | |
| 249 _setID=acceptorID; | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
250 |
| 865 | 251 _idleTick = System.currentTimeMillis(); |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
252 |
| 865 | 253 // create a selector; |
| 254 _selector = Selector.open(); | |
| 255 _monitorNext=System.currentTimeMillis()+__MONITOR_PERIOD; | |
| 256 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
257 |
|
949
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
258 private void addChange(SocketChannel channel) |
| 865 | 259 { |
|
949
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
260 try { |
|
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
261 SelectionKey key = channel.register(_selector,SelectionKey.OP_READ,null); |
|
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
262 SelectChannelEndPoint endpoint = createEndPoint(channel,key); |
|
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
263 key.attach(endpoint); |
|
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
264 endpoint.schedule(); |
|
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
265 } catch(IOException e) { |
|
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
266 LOG.warn("",e); |
|
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
267 try { |
|
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
268 channel.close(); |
|
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
269 } catch(IOException e2) { |
|
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
270 LOG.warn("",e2); |
|
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
271 } |
|
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
272 } |
| 865 | 273 } |
| 274 /* ------------------------------------------------------------ */ | |
| 275 /** | |
| 276 * Select and dispatch tasks found from changes and the selector. | |
| 277 * | |
| 278 * @throws IOException | |
| 279 */ | |
| 280 public void doSelect() throws IOException | |
| 281 { | |
| 282 try | |
| 283 { | |
| 284 _selecting=Thread.currentThread(); | |
| 285 final Selector selector=_selector; | |
| 286 // Stopped concurrently ? | |
| 287 if (selector == null) | |
| 288 return; | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
289 |
| 865 | 290 // Do and instant select to see if any connections can be handled. |
| 291 int selected=selector.selectNow(); | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
292 |
| 943 | 293 _now = System.currentTimeMillis(); |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
294 |
| 865 | 295 // if no immediate things to do |
| 296 if (selected==0 && selector.selectedKeys().isEmpty()) | |
| 297 { | |
| 298 // If we are in pausing mode | |
| 299 if (_pausing) | |
| 300 { | |
| 301 try | |
| 302 { | |
| 303 Thread.sleep(__BUSY_PAUSE); // pause to reduce impact of busy loop | |
| 304 } | |
| 305 catch(InterruptedException e) | |
| 306 { | |
| 307 LOG.trace("",e); | |
| 308 } | |
| 943 | 309 _now = System.currentTimeMillis(); |
| 865 | 310 } |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
311 |
| 865 | 312 // workout how long to wait in select |
|
949
e9088af3787f
remove SelectSet._changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
948
diff
changeset
|
313 long wait = __IDLE_TICK; |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
314 |
| 865 | 315 // If we should wait with a select |
| 316 if (wait>0) | |
| 317 { | |
| 943 | 318 long before = _now; |
| 865 | 319 selector.select(wait); |
| 943 | 320 _now = System.currentTimeMillis(); |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
321 |
| 865 | 322 // If we are monitoring for busy selector |
| 323 // and this select did not wait more than 1ms | |
| 943 | 324 if (__MONITOR_PERIOD>0 && _now-before <=1) |
| 865 | 325 { |
| 326 // count this as a busy select and if there have been too many this monitor cycle | |
| 327 if (++_busySelects>__MAX_SELECTS) | |
| 328 { | |
| 329 // Start injecting pauses | |
| 330 _pausing=true; | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
331 |
| 865 | 332 // if this is the first pause |
| 333 if (!_paused) | |
| 334 { | |
| 335 // Log and dump some status | |
| 336 _paused=true; | |
| 337 LOG.warn("Selector {} is too busy, pausing!",this); | |
| 338 } | |
| 339 } | |
| 340 } | |
| 341 } | |
| 342 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
343 |
| 865 | 344 // have we been destroyed while sleeping |
| 345 if (_selector==null || !selector.isOpen()) | |
| 346 return; | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
347 |
| 865 | 348 // Look for things to do |
| 349 for (SelectionKey key: selector.selectedKeys()) | |
| 350 { | |
| 351 SocketChannel channel=null; | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
352 |
| 865 | 353 try |
| 354 { | |
| 355 if (!key.isValid()) | |
| 356 { | |
| 357 key.cancel(); | |
| 358 SelectChannelEndPoint endpoint = (SelectChannelEndPoint)key.attachment(); | |
| 359 if (endpoint != null) | |
| 360 endpoint.doUpdateKey(); | |
| 361 continue; | |
| 362 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
363 |
| 865 | 364 Object att = key.attachment(); |
| 365 if (att instanceof SelectChannelEndPoint) | |
| 366 { | |
| 367 if (key.isReadable()||key.isWritable()) | |
| 368 ((SelectChannelEndPoint)att).schedule(); | |
| 369 } | |
| 370 else if (key.isConnectable()) | |
| 371 { | |
| 372 // Complete a connection of a registered channel | |
| 373 channel = (SocketChannel)key.channel(); | |
| 374 boolean connected=false; | |
| 375 try | |
| 376 { | |
| 377 connected=channel.finishConnect(); | |
| 378 } | |
| 379 catch(Exception e) | |
| 380 { | |
|
948
f5aefdc4a81a
simplify SelectChannelConnector
Franklin Schmidt <fschmidt@gmail.com>
parents:
944
diff
changeset
|
381 LOG.warn(e+","+channel+","+att); |
|
f5aefdc4a81a
simplify SelectChannelConnector
Franklin Schmidt <fschmidt@gmail.com>
parents:
944
diff
changeset
|
382 LOG.debug("",e); |
| 865 | 383 } |
| 384 finally | |
| 385 { | |
| 386 if (connected) | |
| 387 { | |
| 388 key.interestOps(SelectionKey.OP_READ); | |
| 389 SelectChannelEndPoint endpoint = createEndPoint(channel,key); | |
| 390 key.attach(endpoint); | |
| 391 endpoint.schedule(); | |
| 392 } | |
| 393 else | |
| 394 { | |
| 395 key.cancel(); | |
| 396 channel.close(); | |
| 397 } | |
| 398 } | |
| 399 } | |
| 400 else | |
| 401 { | |
| 402 // Wrap readable registered channel in an endpoint | |
| 403 channel = (SocketChannel)key.channel(); | |
| 404 SelectChannelEndPoint endpoint = createEndPoint(channel,key); | |
| 405 key.attach(endpoint); | |
| 406 if (key.isReadable()) | |
| 407 endpoint.schedule(); | |
| 408 } | |
| 409 key = null; | |
| 410 } | |
| 411 catch (CancelledKeyException e) | |
| 412 { | |
| 413 LOG.trace("",e); | |
| 414 } | |
| 415 catch (Exception e) | |
| 416 { | |
| 417 if (isRunning()) | |
| 418 LOG.warn("",e); | |
| 419 else | |
| 420 LOG.trace("",e); | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
421 |
| 865 | 422 try |
| 423 { | |
| 424 if (channel!=null) | |
| 425 channel.close(); | |
| 426 } | |
| 427 catch(IOException e2) | |
| 428 { | |
| 429 LOG.debug("",e2); | |
| 430 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
431 |
| 865 | 432 if (key != null && !(key.channel() instanceof ServerSocketChannel) && key.isValid()) |
| 433 key.cancel(); | |
| 434 } | |
| 435 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
436 |
| 865 | 437 // Everything always handled |
| 438 selector.selectedKeys().clear(); | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
439 |
| 943 | 440 _now = System.currentTimeMillis(); |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
441 |
| 865 | 442 // Idle tick |
| 943 | 443 if (_now-_idleTick>__IDLE_TICK) |
| 865 | 444 { |
| 943 | 445 _idleTick = _now; |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
446 |
| 865 | 447 final long idle_now=((_lowResourcesConnections>0 && selector.keys().size()>_lowResourcesConnections)) |
| 943 | 448 ?(_now+_maxIdleTime) |
| 449 :_now; | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
450 |
| 865 | 451 execute(new Runnable() |
| 452 { | |
| 453 public void run() | |
| 454 { | |
| 455 for (SelectChannelEndPoint endp:_endPoints.keySet()) | |
| 456 { | |
| 457 endp.checkIdleTimestamp(idle_now); | |
| 458 } | |
| 459 } | |
| 460 public String toString() {return "Idle-"+super.toString();} | |
| 461 }); | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
462 |
| 865 | 463 } |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
464 |
| 865 | 465 // Reset busy select monitor counts |
| 943 | 466 if (__MONITOR_PERIOD>0 && _now>_monitorNext) |
| 865 | 467 { |
| 468 _busySelects=0; | |
| 469 _pausing=false; | |
| 943 | 470 _monitorNext=_now+__MONITOR_PERIOD; |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
471 |
| 865 | 472 } |
| 473 } | |
| 474 catch (ClosedSelectorException e) | |
| 475 { | |
| 476 if (isRunning()) | |
| 477 LOG.warn("",e); | |
| 478 else | |
| 479 LOG.trace("",e); | |
| 480 } | |
| 481 catch (CancelledKeyException e) | |
| 482 { | |
| 483 LOG.trace("",e); | |
| 484 } | |
| 485 finally | |
| 486 { | |
| 487 _selecting=null; | |
| 488 } | |
| 489 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
490 |
| 865 | 491 public SelectorManager getManager() |
| 492 { | |
| 493 return SelectorManager.this; | |
| 494 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
495 |
| 865 | 496 public long getNow() |
| 497 { | |
| 943 | 498 return _now; |
| 865 | 499 } |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
500 |
| 865 | 501 public void wakeup() |
| 502 { | |
|
944
1d24b6e422fa
simplify SelectorManager
Franklin Schmidt <fschmidt@gmail.com>
parents:
943
diff
changeset
|
503 Selector selector = _selector; |
|
1d24b6e422fa
simplify SelectorManager
Franklin Schmidt <fschmidt@gmail.com>
parents:
943
diff
changeset
|
504 if (selector!=null) |
|
1d24b6e422fa
simplify SelectorManager
Franklin Schmidt <fschmidt@gmail.com>
parents:
943
diff
changeset
|
505 selector.wakeup(); |
| 865 | 506 } |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
507 |
| 865 | 508 private SelectChannelEndPoint createEndPoint(SocketChannel channel, SelectionKey sKey) throws IOException |
| 509 { | |
|
948
f5aefdc4a81a
simplify SelectChannelConnector
Franklin Schmidt <fschmidt@gmail.com>
parents:
944
diff
changeset
|
510 SelectChannelEndPoint endp = new SelectChannelEndPoint(channel,this,sKey, _maxIdleTime); |
|
f5aefdc4a81a
simplify SelectChannelConnector
Franklin Schmidt <fschmidt@gmail.com>
parents:
944
diff
changeset
|
511 endp.setConnection(getManager().newConnection(channel,endp, sKey.attachment())); |
| 865 | 512 LOG.debug("created {}",endp); |
| 513 _endPoints.put(endp,this); | |
| 514 return endp; | |
| 515 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
516 |
| 865 | 517 public void destroyEndPoint(SelectChannelEndPoint endp) |
| 518 { | |
| 519 LOG.debug("destroyEndPoint {}",endp); | |
| 520 _endPoints.remove(endp); | |
|
948
f5aefdc4a81a
simplify SelectChannelConnector
Franklin Schmidt <fschmidt@gmail.com>
parents:
944
diff
changeset
|
521 endp.getConnection().onClose(); |
| 865 | 522 } |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
523 |
| 865 | 524 Selector getSelector() |
| 525 { | |
| 526 return _selector; | |
| 527 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
528 |
| 865 | 529 void stop() throws Exception |
| 530 { | |
| 531 // Spin for a while waiting for selector to complete | |
| 532 // to avoid unneccessary closed channel exceptions | |
| 533 try | |
| 534 { | |
| 535 for (int i=0;i<100 && _selecting!=null;i++) | |
| 536 { | |
| 537 wakeup(); | |
| 538 Thread.sleep(10); | |
| 539 } | |
| 540 } | |
| 541 catch(Exception e) | |
| 542 { | |
|
944
1d24b6e422fa
simplify SelectorManager
Franklin Schmidt <fschmidt@gmail.com>
parents:
943
diff
changeset
|
543 LOG.warn("",e); |
| 865 | 544 } |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
545 |
| 865 | 546 // close endpoints and selector |
| 547 synchronized (this) | |
| 548 { | |
| 549 Selector selector=_selector; | |
| 550 for (SelectionKey key:selector.keys()) | |
| 551 { | |
| 552 if (key==null) | |
| 553 continue; | |
| 554 Object att=key.attachment(); | |
| 555 if (att instanceof EndPoint) | |
| 556 { | |
| 557 EndPoint endpoint = (EndPoint)att; | |
| 558 try | |
| 559 { | |
| 560 endpoint.close(); | |
| 561 } | |
| 562 catch(IOException e) | |
| 563 { | |
| 564 LOG.trace("",e); | |
| 565 } | |
| 566 } | |
| 567 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
568 |
| 865 | 569 try |
| 570 { | |
| 571 selector=_selector; | |
| 572 if (selector != null) | |
| 573 selector.close(); | |
| 574 } | |
| 575 catch (IOException e) | |
| 576 { | |
| 577 LOG.trace("",e); | |
| 578 } | |
|
944
1d24b6e422fa
simplify SelectorManager
Franklin Schmidt <fschmidt@gmail.com>
parents:
943
diff
changeset
|
579 _selector = null; |
| 865 | 580 } |
| 581 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
582 |
| 865 | 583 public String dump() |
| 584 { | |
| 585 return AggregateLifeCycle.dump(this); | |
| 586 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
587 |
| 865 | 588 public void dump(Appendable out, String indent) throws IOException |
| 589 { | |
| 590 out.append(String.valueOf(this)).append(" id=").append(String.valueOf(_setID)).append("\n"); | |
|
944
1d24b6e422fa
simplify SelectorManager
Franklin Schmidt <fschmidt@gmail.com>
parents:
943
diff
changeset
|
591 AggregateLifeCycle.dump(out,indent,Collections.emptyList()); |
| 865 | 592 } |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
593 |
| 865 | 594 public String toString() |
| 595 { | |
| 596 Selector selector=_selector; | |
| 597 return String.format("%s keys=%d selected=%d", | |
| 598 super.toString(), | |
| 599 selector != null && selector.isOpen() ? selector.keys().size() : -1, | |
| 600 selector != null && selector.isOpen() ? selector.selectedKeys().size() : -1); | |
| 601 } | |
| 602 } | |
|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
603 |
|
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
604 } |
