{"push_id":1222528789,"size":43,"distinct_size":25,"ref":"refs/heads/setup_flags","head":"15f3f55f43316d11efba0a1cd91e1642242a7854","before":"1d21bc4572ce9872725ab9a3b235d7fb71c7cdf5","commits":[{"sha":"25dcc7b02b65609af26bf7c22e7ed7e06138c723","author":{"name":"The Gitter Badger","email":"41ffb6be4e8e36fbd1ca83166ca2431c5a614f40@gitter.im"},"message":"Add Gitter badge (#103)","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/25dcc7b02b65609af26bf7c22e7ed7e06138c723"},{"sha":"45ec974e09e6588289b60f80283a7e5dc8b2e400","author":{"name":"Nitesh Kant","email":"f5438cd6978f9a7a6349ad145065908db9bbd180@gmail.com"},"message":"Ignoring `ClosedChannelException` from the error stream. (#105)\n\nProblem\r\n\r\nSince `ReactiveSocket` reads and writes from a transport connection, it is completely expected that at some point the underlying connection may have been severed. In such a case, both the read and write will fail on the connection. This pollutes logs of applications that directly log the error stream (as expected).\r\n\r\nModification\r\n\r\nSince, this is kind of an \"expected\" exception, there is no point to send this to the error stream.\r\nThis change adds a filter to the error stream to filter any known exceptions (as of today, it is only `ClosedChannelException`)\r\n\r\nPS: We currently do not unsubscribe from the input (and stop writing) when `ReactiveSocket` is explicitly closed. This change does not mean, we do not clean that up.","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/45ec974e09e6588289b60f80283a7e5dc8b2e400"},{"sha":"a93a3bab4b06fbf0d359d4e1dee0eb4c878f8cb4","author":{"name":"Steve Gury","email":"95d95943a859d93fc46189acf16fb3ef5f93e551@users.noreply.github.com"},"message":"Add an overload of `TcpReactiveSocketServer.create` with SocketAddress. (#108)\n\n**Problem**\r\nIt is impossible to specify the network interface to use when starting a server.\r\nThis can be problematic when we want to design test that run in restricted\r\nenvironment (e.g. CI).\r\n\r\n**Solution**\r\nCreate an overload of `TcpReactiveSocketServer.create` that accept a\r\nSocketAddress instead of just the port.","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/a93a3bab4b06fbf0d359d4e1dee0eb4c878f8cb4"},{"sha":"8d6c83d07d383d2412488bd94f8ef1c26d1b2ce2","author":{"name":"Steve Gury","email":"95d95943a859d93fc46189acf16fb3ef5f93e551@users.noreply.github.com"},"message":"Fix subscription for Websocket transport (#109)\n\n**Problem**\r\nThe websocket DuplexConnection doesn't initialize the Publisher chain\r\nin every cases.\r\n\r\n**Solution**\r\nMove the initialization code `onSubscribe` up, and also rename the subscriber\r\n`subscriber` instead of `s` to avoid confusion with the `Subscription`.","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/8d6c83d07d383d2412488bd94f8ef1c26d1b2ce2"},{"sha":"ef2f9f7e81ecffcd7c72a76294cc98b940e421d1","author":{"name":"Steve Gury","email":"95d95943a859d93fc46189acf16fb3ef5f93e551@users.noreply.github.com"},"message":"Unsubscribe from the connection before `shutdown` the RS. (#107)\n\n* Unsubscribe from the connection before `shutdown` the RS.\r\n\r\n**Problem**\r\nWhen we close a ReactiveSocket, it closes the underlying DuplexConnection\r\nwhich trigger an unnecessary onError on the Requester/Responder.\r\n\r\n**Solution**\r\nStore the disposable of the DuplexConnection subscription as an instance\r\nvariable, and dispose it before closing the DuplexConnection.\r\n\r\n**Modification**\r\nI also added a `name` method in Requester/Responder to simplify debugging\r\ncode where we have client and server in the same JVM.\r\nIt now shows which Requester/Responder is generating an error, the client's\r\none or the server's one.","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/ef2f9f7e81ecffcd7c72a76294cc98b940e421d1"},{"sha":"5db6f54ef278ea7aafad7088c205e40d41569bfe","author":{"name":"Nitesh Kant","email":"f5438cd6978f9a7a6349ad145065908db9bbd180@gmail.com"},"message":"Tabs => Spaces (#114)\n\n#### Problem\r\n\r\nI don't agree with Richard Hendricks to use tabs over spaces.\r\n\r\n#### Solution\r\n\r\nGimme back my spaces.\r\n\r\n#### Result\r\n\r\nAwesomeness .....\r\n\r\nPS: I don't use vim or emacs... Idea rocks!","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/5db6f54ef278ea7aafad7088c205e40d41569bfe"},{"sha":"b815aa3f91c3cbeaf193200b2c78e55e6b2487d4","author":{"name":"Nitesh Kant","email":"f5438cd6978f9a7a6349ad145065908db9bbd180@gmail.com"},"message":"Completing subscriber after sending error frame (caused memory leak). (#115)\n\n* Completing subscriber after sending error frame (caused memory leak).\r\n\r\n#### Problem\r\n\r\nIn some cases, `Responder` was converting an `onError()` to `onNext(Frame.Error)` but was not sending an `onComplete()` after the `onNext()`.\r\nThis causes the `subscriber` to wait for a terminal event, which never arrives, or if it arrives, does not find the `streamId` to be valid since the code was invoking `cleanUp()`.\r\nThis although subtle, but causes memory build up as the `Subscriber` in the case of a server, is the subscriber which is writing the response. If the response does not complete, all state associated with the request is kept alive forever.\r\n\r\n#### Solution\r\n\r\nCall `onComplete()` after sending an error frame.\r\n\r\nThis code does not call `cancel()` after `onComplete()` as reactive streams spec does not mandate cancellation post a terminal event, unlike `RxJava`.\r\n\r\n#### Result\r\n\r\nNo more memory leak!\r\n\r\n* Review comments","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/b815aa3f91c3cbeaf193200b2c78e55e6b2487d4"},{"sha":"2c9c2be73649922b8df286ed850c51c780cec009","author":{"name":"Steve Gury","email":"95d95943a859d93fc46189acf16fb3ef5f93e551@users.noreply.github.com"},"message":"Add encrypted keys for Sonatype/Bintray (#116)\n\n***Problem***\r\nThe Maven Central synchronization is not working (Travis CI is building the jars, but can't copy them to maven central).\r\n\r\n***Solution***\r\nThis is the result of removing the previously encrypted keys, and running this script (authenticated as ReactiveSocketAdmin).\r\n\r\n```\r\ntravis encrypt bintrayUser=*** --add\r\ntravis encrypt bintrayKey=*** --add\r\ntravis encrypt sonatypeUsername=*** --add\r\ntravis encrypt sonatypePassword=*** --add\r\n```","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/2c9c2be73649922b8df286ed850c51c780cec009"},{"sha":"380fd3dc5047717988e5c5ab0a318ca6bdddc98b","author":{"name":"Yuri Schimke","email":"e2d5a018d511c600ef601d5760d2cc7d7d5f6b78@schimke.ee"},"message":"use charset consistently (#113)\n\n* use StandardCharsets.UTF_8 consistently\r\n\r\n* fix null terminated strings and mimetype is US-ASCII\r\n\r\n* fix for exception extraction\r\n\r\n* assume UTF-8 and strings are not null terminated\r\n\r\n* toUtf8String","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/380fd3dc5047717988e5c5ab0a318ca6bdddc98b"},{"sha":"6874b6e91011088da71fdb6872453fbb0d3653ed","author":{"name":"Nitesh Kant","email":"f5438cd6978f9a7a6349ad145065908db9bbd180@gmail.com"},"message":"Statically create `TimeoutException`. (#117)\n\n* Statically create `TimeoutException`.\r\n\r\n#### Problem\r\n\r\nIf a host is latent and most of the requests happen to timeout, creating a new `TimeoutException` for every timeout produces garbage and wastes CPU fetching the stack, which is useless.\r\n\r\n#### Solution\r\n\r\nCreate a static instance of `TimeoutException` and fill it with empty stack.\r\n\r\n#### Result\r\n\r\nLess garbage, less work, more happiness.\r\n\r\n* Review comments.","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/6874b6e91011088da71fdb6872453fbb0d3653ed"},{"sha":"ca8fc9e7d502a504604e524ac818fad4f200d8cb","author":{"name":"Steve Gury","email":"95d95943a859d93fc46189acf16fb3ef5f93e551@users.noreply.github.com"},"message":"Loadbalancer: Refactor socket/factory Map into Lists + bugfix. (#112)\n\n* Loadbalancer: Refactor socket/factory Map into Queues + bugfix.\r\n\r\n**Problem**\r\nThe loadbalancer uses internally 2 maps, one for the list of `ReactiveSocketFactory`\r\nit can use for creating a new `ReactiveSocket`, and one for the active `ReactiveSocket`.\r\nThe link is made between the 2 maps through the `SocketAddress` of the associated\r\nremote server. This is kind of clunky and requires explicit knowledge of\r\nthe `SocketAddress` (result type of `remote()`).\r\n\r\nAlso, when we select a new factory to connect to or when we select the slowest\r\nReactiveSocket to quick out, the sorting is made via the `sorted()` method\r\non the java stream. The comparison function is actually unstable because a\r\ntcp socket can be closed while we do the sorting.\r\n\r\n**Solution**\r\nUse two queues, one for factories and one for ReactiveSocket. Selecting a factory\r\nis made using the \"Power of 2 Choices\" technique, and we also \"age\" the unselected\r\nfactories by moving them at the end of the queue. The WeightedSocket now contains\r\na reference to the associated factory, and closing it add back the factory to the\r\nfactory queue.\r\n\r\n**Modification**\r\nMove the `WeightedSocket` class inside the `LoadBalancer`, no\r\n\r\nI created a proper constructor to `LoadBalancer` with javadoc explaining all\r\nparameters the algorithm requires.\r\n\r\nThe `LatencySubscriber` inside the LoadBalancer treats some exceptions\r\nparticularly:\r\n\r\n- `TimeoutException` latency is used for predicating the next latency\r\n- `TransportException` & `ClosedChannelException` removes the ReactiveSocket\r\n   from the active list.\r\n\r\n`Publishers.onError` now also `cancel` the subscription.\r\n\r\nI created a StressTest file, which stress most of the part of the Client:\r\n\r\n- Adding/Removing new servers\r\n- High request concurrency\r\n- Dealing with failing/black-hole servers","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/ca8fc9e7d502a504604e524ac818fad4f200d8cb"},{"sha":"73e1b5b4813e5b20b6f34fd9ac2eedb8711d6609","author":{"name":"Yuri Schimke","email":"e2d5a018d511c600ef601d5760d2cc7d7d5f6b78@schimke.ee"},"message":"use remaining instead of capacity generally (#121)\n\nReplace use of capacity which is only appropriate if you know exactly what the client has given you (a whole ByteBuffer representing the relevant data). Uses remaining instead which assumes you trust your caller has given you a buffer that won't be changed during the method call, but uses position and limit to support sliced buffers.","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/73e1b5b4813e5b20b6f34fd9ac2eedb8711d6609"},{"sha":"cfb6f0e12f590aa21007b11ed3377f48b01d1c64","author":{"name":"Steve Gury","email":"95d95943a859d93fc46189acf16fb3ef5f93e551@users.noreply.github.com"},"message":"Loadbalancer: Add a ReactiveSocket when none is available. (#119)\n\n***Problem***\r\nThe loadbalancer doesn't find an active socket to use, it doesn't do anything\r\nabout it.\r\n\r\n***Solution***\r\nWhen the \"power of two choices\" algorithm failed to find a socket\r\nafter `EFFORT=5` tries, asynchronously add a new socket.","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/cfb6f0e12f590aa21007b11ed3377f48b01d1c64"},{"sha":"e0a6eab2530d6ee08948d635c1da25714846f773","author":{"name":"Steve Gury","email":"95d95943a859d93fc46189acf16fb3ef5f93e551@users.noreply.github.com"},"message":"Loadbalancer: Move inter-arrival time as constant. (#120)\n\n***Problem***\r\nHard-coded values in the code.\r\n\r\n***Solution***\r\nMove those hard-coded values into static members.\r\n\r\nInitial inter-arrival time is 1 seconds (The average time between\r\ntwo requests for a particular server). This value will be updated continuously.\r\n\r\nInter-arrival factor is now 500, after 500 times the default arrival time\r\nwe'll artificially decrease the load of a server so that it is selected\r\nagain. It solves the problem of server becoming temporarly latent, and\r\nnever being selected again.","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/e0a6eab2530d6ee08948d635c1da25714846f773"},{"sha":"ec819d9f72ed96109d64eba793a7d906996ce6ff","author":{"name":"Steve Gury","email":"95d95943a859d93fc46189acf16fb3ef5f93e551@users.noreply.github.com"},"message":"ClientBuilder: Disable default timeout, remove retries. (#118)\n\n* ClientBuilder: Disable default timeout, remove retries.\r\n\r\n***Problem***\r\nThere's presently no way to disable timeouts/retries other than manually\r\ncomposing the stack.\r\n\r\n***Solution***\r\nDefault to disable any timeout in the ClientBuilder, remove completely retries.\r\n\r\n***Modification***\r\nAlso remove unused fields `backupQuantile`, `counter` and `name`.","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/ec819d9f72ed96109d64eba793a7d906996ce6ff"},{"sha":"d8cc6bf891f192f94de1fe8651bbe9203fa4192b","author":{"name":"Steve Gury","email":"95d95943a859d93fc46189acf16fb3ef5f93e551@users.noreply.github.com"},"message":"Loadbalancer: Only reduce aperture based on active sockets (not pending). (#124)\n\n***Problem***\r\nThe decision of reducing the aperture is based on the number of active sockets\r\n+ the number of pending socket. This could be bad as we close sockets before\r\nthe pending ones connect, which should leave us under the aperture target.\r\n\r\n***Solution***\r\nOnly reduce the aperture when the number of *active* socket is below the\r\naperture.\r\n\r\n***Modification***\r\nI also increase the aperture only when we have available factories in\r\norder to reduce the debug log.\r\nReduce the log level of these logs to DEBUG.","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/d8cc6bf891f192f94de1fe8651bbe9203fa4192b"},{"sha":"f0229f7940d916fd1d8a2acf09c1d8f63ed98fd1","author":{"name":"Steve Gury","email":"95d95943a859d93fc46189acf16fb3ef5f93e551@users.noreply.github.com"},"message":"Add meaningfull toString() methods to most objects. (#122)\n\n* Add meaningfull toString() methods to most objects.\r\n\r\n***Problem***\r\nDebuging and Logging could be improved by adding meaningful `toString()`\r\nmethods (that expose internal state).\r\n\r\n***Solution***\r\nAdd meaningful `toString()` methods.\r\n\r\n***Modification***\r\n- Remove unused chaining functions.\r\n- Change visibility (to protected) of the `child` factory in ReactiveSocketFactory.","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/f0229f7940d916fd1d8a2acf09c1d8f63ed98fd1"},{"sha":"2239906fe96c50e58dbf00507e34f22912b4dd9e","author":{"name":"Nitesh Kant","email":"f5438cd6978f9a7a6349ad145065908db9bbd180@gmail.com"},"message":"Generics correctness in `ClientBuilder` (#125)\n\n#### Problem\r\n\r\n`ClientBuilder.withSource()` takes an argument of `Publisher<Collection<T>>` which means it doesn't accept an `Publisher<List<T>>`.\r\n`Eureka` is providing `Publisher<List<T>>` so it is incompatible with `ClientBuilder`\r\n\r\n#### Modification\r\n\r\nChanged `ClientBuilder.withSource()` to take `Publisher<? extends Collection<T>>`.\r\nAlso changed `Eureka` to return `Publisher<Collection<T>>` which is the correct thing to do as returning a `List` doesn't really make a difference.","distinct":false,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/2239906fe96c50e58dbf00507e34f22912b4dd9e"},{"sha":"400d085aa83af390d338ce334687ce685dba8d26","author":{"name":"Nitesh Kant","email":"f5438cd6978f9a7a6349ad145065908db9bbd180@gmail.com"},"message":"Filter non-up instances in Eureka (#126)\n\n* Filter non-up instances in Eureka\r\n\r\n#### Problem\r\n\r\nEureka source does not currently filter messages if `status != UP`. This means that on graceful shutdown of servers, `LoadBalancer` will not sending requests to the server, till it is shutdown.\r\n\r\n#### Modification\r\n\r\nFilter all messages that do not have status as `UP`\r\n\r\n#### Result\r\n\r\nMore graceful removal of shutting down instances.","distinct":true,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/400d085aa83af390d338ce334687ce685dba8d26"},{"sha":"3a2151f22ce8c32b94eb7394bd6aa834c3e98083","author":{"name":"Nitesh Kant","email":"f5438cd6978f9a7a6349ad145065908db9bbd180@gmail.com"},"message":"Refactor of TCP transport. (#134)\n\nProblem\r\n\r\nThis is a split of PR #106 to make local transport use TCP.\r\nThere seems to be some issue in netty's local transport which creates race-conditions and causes test failures.\r\nThese refactor has some changes that are not necessarily related to local transport but makes the usage better.\r\n\r\nModification\r\n\r\nRefactored common test classes to `reactivesocket-test` module so they can be used in both tcp and local transport without code duplication.\r\nAdded `PayloadImpl` as a utility implementation of `Payload`.","distinct":true,"url":"https://api.github.com/repos/yschimke/reactivesocket-java/commits/3a2151f22ce8c32b94eb7394bd6aa834c3e98083"}]}
{"actor":{"display_login":"yschimke"}}