Jetty HTTP ERROR: 500 with a GET parameter and subsequent requests

I've been checking out Couchbase's REST API and would like to record and replay some interactions using WireMock. Unfortunately I've encountered an issue where a GET request with a parameter being made multiple times (immediately following the previous) causes Jetty to return a 500 error.
This is the URL I'm GETting, proxied to couchbase via WireMock: http://localhost:8442/pools/default?waitChange=0
I'm mostly using the Insomnia REST client to send the request. I've determined that the following do not affect the result:

HTTP request headers
HTTP request auth
REST client
--container-threads amount
--jetty-acceptor-threads amount
--jetty-accept-queue-size amount

In my tests I've found that removing the parameter ?waitChange=0 does not reproduce the issue (multiple, subsequent requests can be made as quickly as possible with a valid response). I've also found that trying a test parameter (?test=0) does not reproduce the issue.
The reason I think WireMock is the culprit (as opposed to Couchbase's REST implementation) is that I can make the same requests directly to Couchbase and get a successful response every time.
Here are the logs and the startup command used to run the server; the problem URI was hit twice for this test, with the second attempt failing:
java -jar /path/to/wiremock-standalone-2.5.1.jar --container-threads 200 --print-all-network-traffic --verbose --https-port 8443 --port 8442 --root-dir /path/to/wiremock-recordings/test-record --proxy-all="http://<my-couchbase-host>:8091" --record-mappings --match-headers="Accept,Content-Type,Cache-Control,Authorization"

2017-03-02 11:11:30.149 Verbose logging enabled
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2017-03-02 11:11:30.455 Verbose logging enabled
2017-03-02 11:11:30.473 Verbose logging enabled
2017-03-02 11:11:30.512 Recording mappings to /path/to/wiremock-recordings/test-record/mappings
 /$$      /$$ /$$                     /$$      /$$                     /$$
| $$  /$ | $$|__/                    | $$$    /$$$                    | $$
| $$ /$$$| $$ /$$  /$$$$$$   /$$$$$$ | $$$$  /$$$$  /$$$$$$   /$$$$$$$| $$   /$$
| $$/$$ $$ $$| $$ /$$__  $$ /$$__  $$| $$ $$/$$ $$ /$$__  $$ /$$_____/| $$  /$$/
| $$$$_  $$$$| $$| $$  \__/| $$$$$$$$| $$  $$$| $$| $$  \ $$| $$      | $$$$$$/
| $$$/ \  $$$| $$| $$      | $$_____/| $$\  $ | $$| $$  | $$| $$      | $$_  $$
| $$/   \  $$| $$| $$      |  $$$$$$$| $$ \/  | $$|  $$$$$$/|  $$$$$$$| $$ \  $$
|__/     \__/|__/|__/       \_______/|__/     |__/ \______/  \_______/|__/  \__/

port:                         8442
https-port:                   8443
https-keystore:               jar:file:/path/to/wiremock-standalone-2.5.1.jar!/keystore
proxy-all:                    http://<my-couchbase-host>:8091
preserve-host-header:         false
enable-browser-proxying:      false
record-mappings:              true
match-headers:                [Accept, Content-Type, Cache-Control, Authorization]
no-request-journal:           false
verbose:                      true

2017-03-02 11:11:50.615 Opened Socket[addr=/<IP_ADDRESS>,port=60484,localport=8442]
2017-03-02 11:11:50.646 Incoming bytes: GET /pools/default?waitChange=0 HTTP/1.1
Authorization: Basic cm91c2VyOnBhc3N3b3Jk
Accept: */*
User-Agent: insomnia/4.2.14
host: localhost:8442
accept-encoding: gzip, deflate
Connection: keep-alive

2017-03-02 11:11:50.694 Proxying: GET http://<my-couchbase-host>:8091/pools/default?waitChange=0
2017-03-02 11:11:51.001 Request received:
<IP_ADDRESS> - GET /pools/default?waitChange=0

Accept-Encoding: [gzip, deflate]
User-Agent: [insomnia/4.2.14]
Authorization: [Basic cm91c2VyOnBhc3N3b3Jk]
Connection: [keep-alive]
Host: [localhost:8442]
Accept: [*/*]

Matched response definition:
{
  "status" : 200,
  "proxyBaseUrl" : "http://<my-couchbase-host>:8091"
}

Response:
HTTP/1.1 200
Server: [Couchbase Server]
Pragma: [no-cache]
Date: [Thu, 02 Mar 2017 16:11:57 GMT]
Content-Type: [application/json]
Content-Length: [5860]
Cache-Control: [no-cache]

{"etag":"95119255","clusterName":"","storageTotals":{"ram":{"total":12289662976,"quotaTotal":6442450944,"quotaUsed":6442450944,"used":6740443136,"usedByData":611960684,"quotaUsedPerNode":2147483648,"quotaTotalPerNode":2147483648},"hdd":{"total":222675869696,"quotaTotal":222675869696,"used":2226758696,"usedByData":472303039,"free":0}},"balanced":true,"failoverWarnings":[],"goxdcrEnabled":true,"ldapEnabled":false,"serverGroupsUri":"/pools/default/serverGroups?v=108506564","indexMemoryQuota":256,"memoryQuota":2048,"name":"default","alerts":[],"alertsSilenceURL":"/controller/resetAlerts?token=0&uuid=8e989e84e055a831e614fc877e41a325","nodes":[{"systemStats":{"cpu_utilization_rate":4.556962025316456,"swap_total":6442446848,"swap_used":11964416,"mem_total":3975221248,"mem_free":2175139840},"interestingStats":{"cmd_get":0,"couch_docs_actual_disk_size":151499227,"couch_docs_data_size":122352976,"couch_spatial_data_size":5963158,"couch_spatial_disk_size":5974801,"couch_views_actual_disk_size":6020437,"couch_views_data_size":45636,"curr_items":18085,"curr_items_tot":40985,"ep_bg_fetched":0,"get_hits":0,"mem_used":211950032,"ops":0,"vb_replica_curr_items":22900},"uptime":"1375990","memoryTotal":3975221248,"memoryFree":2175139840,"mcdMemoryReserved":3032,"mcdMemoryAllocated":3032,"couchApiBase":"http://<IP_ADDRESS>:8092/","clusterMembership":"active","recoveryType":"none","status":"healthy","otpNode":"ns_1@<IP_ADDRESS>","hostname":"<IP_ADDRESS>:8091","clusterCompatibility":262145,"version":"4.1.1-5914-community","os":"x86_64-unknown-linux-gnu","ports":{"proxy":11211,"direct":11210},"services":["kv"]},{"systemStats":{"cpu_utilization_rate":8.860759493670885,"swap_total":6442446848,"swap_used":91934720,"mem_total":4019945472,"mem_free":2099113984},"interestingStats":{"cmd_get":0,"couch_docs_actual_disk_size":146480622,"couch_docs_data_size":115802791,"couch_spatial_data_size":6016449,"couch_spatial_disk_size":6028080,"couch_views_actual_disk_size":6073704,"couch_views_data_size":45624,"curr_items":17971,"curr_items_tot":40872,"ep_bg_fetched":0,"get_hits":0,"mem_used":211841656,"ops":0,"vb_replica_curr_items":22901},"uptime":"1375466","memoryTotal":4019945472,"memoryFree":2099113984,"mcdMemoryReserved":3066,"mcdMemoryAllocated":3066,"couchApiBase":"http://<my-couchbase-host>:8092/","clusterMembership":"active","recoveryType":"none","status":"healthy","otpNode":"ns_1@<my-couchbase-host>","thisNode":true,"hostname":"<my-couchbase-host>:8091","clusterCompatibility":262145,"version":"4.1.1-5914-community","os":"x86_64-unknown-linux-gnu","ports":{"proxy":11211,"direct":11210},"services":["index","kv","n1ql"]},{"systemStats":{"cpu_utilization_rate":7.770859277708593,"swap_total":5032693760,"swap_used":2974310400,"mem_total":4294496256,"mem_free":1784737792},"interestingStats":{"cmd_get":0,"couch_docs_actual_disk_size":138140830,"couch_docs_data_size":107413823,"couch_spatial_data_size":6007194,"couch_spatial_disk_size":6019831,"couch_views_actual_disk_size":6065507,"couch_views_data_size":45676,"curr_items":18010,"curr_items_tot":40877,"ep_bg_fetched":0,"get_hits":0,"mem_used":188168996,"ops":0,"vb_replica_curr_items":22869},"uptime":"1375673","memoryTotal":4294496256,"memoryFree":1784737792,"mcdMemoryReserved":3276,"mcdMemoryAllocated":3276,"couchApiBase":"http://<another-couchbase-host>:8092/","clusterMembership":"active","recoveryType":"none","status":"healthy","otpNode":"ns_1@<another-couchbase-host>","hostname":"<another-couchbase-host>:8091","clusterCompatibility":262145,"version":"4.1.1-5914-community","os":"win64","ports":{"proxy":11211,"direct":11210},"services":["index","kv","n1ql"]}],"buckets":{"uri":"/pools/default/buckets?v=80956094&uuid=8e989e84e055a831e614fc877e41a325","terseBucketsBase":"/pools/default/b/","terseStreamingBucketsBase":"/pools/default/bs/"},"remoteClusters":{"uri":"/pools/default/remoteClusters?uuid=8e989e84e055a831e614fc877e41a325","validateURI":"/pools/default/remoteClusters?just_validate=1"},"controllers":{"addNode":{"uri":"/controller/addNodeV2?uuid=8e989e84e055a831e614fc877e41a325"},"rebalance":{"uri":"/controller/rebalance?uuid=8e989e84e055a831e614fc877e41a325"},"failOver":{"uri":"/controller/failOver?uuid=8e989e84e055a831e614fc877e41a325"},"startGracefulFailover":{"uri":"/controller/startGracefulFailover?uuid=8e989e84e055a831e614fc877e41a325"},"reAddNode":{"uri":"/controller/reAddNode?uuid=8e989e84e055a831e614fc877e41a325"},"reFailOver":{"uri":"/controller/reFailOver?uuid=8e989e84e055a831e614fc877e41a325"},"ejectNode":{"uri":"/controller/ejectNode?uuid=8e989e84e055a831e614fc877e41a325"},"setRecoveryType":{"uri":"/controller/setRecoveryType?uuid=8e989e84e055a831e614fc877e41a325"},"setAutoCompaction":{"uri":"/controller/setAutoCompaction?uuid=8e989e84e055a831e614fc877e41a325","validateURI":"/controller/setAutoCompaction?just_validate=1"},"clusterLogsCollection":{"startURI":"/controller/startLogsCollection?uuid=8e989e84e055a831e614fc877e41a325","cancelURI":"/controller/cancelLogsCollection?uuid=8e989e84e055a831e614fc877e41a325"},"replication":{"createURI":"/controller/createReplication?uuid=8e989e84e055a831e614fc877e41a325","validateURI":"/controller/createReplication?just_validate=1"}},"rebalanceStatus":"none","rebalanceProgressUri":"/pools/default/rebalanceProgress","stopRebalanceUri":"/controller/stopRebalance?uuid=8e989e84e055a831e614fc877e41a325","nodeStatusesUri":"/nodeStatuses","maxBucketCount":10,"autoCompactionSettings":{"parallelDBAndViewCompaction":false,"databaseFragmentationThreshold":{"percentage":30,"size":"undefined"},"viewFragmentationThreshold":{"percentage":30,"size":"undefined"},"indexFragmentationThreshold":{"percentage":30}},"tasks":{"uri":"/pools/default/tasks?v=81654723"},"counters":{"rebalance_success":1,"rebalance_start":1},"indexStatusURI":"/indexStatus?v=101727310"}

2017-03-02 11:11:51.005 Recording mappings for /pools/default?waitChange=0
2017-03-02 11:11:51.038 Outgoing bytes: HTTP/1.1 200 OK
Server: Couchbase Server
Pragma: no-cache
Date: Thu, 02 Mar 2017 16:11:57 GMT
Content-Type: application/json
Cache-Control: no-cache
Content-Encoding: gzip
Vary: Accept-Encoding, User-Agent
Transfer-Encoding: chunked

A

2017-03-02 11:11:51.038 Problem decoding network traffic
java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(CoderResult.java:277)
    at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:798)
    at com.github.tomakehurst.wiremock.http.trafficlistener.ConsoleNotifyingWiremockNetworkTrafficListener.outgoing(ConsoleNotifyingWiremockNetworkTrafficListener.java:34)
    at com.github.tomakehurst.wiremock.jetty9.JettyHttpServer$NetworkTrafficListenerAdapter.outgoing(JettyHttpServer.java:369)
    at wiremock.org.eclipse.jetty.io.NetworkTrafficSelectChannelEndPoint.notifyOutgoing(NetworkTrafficSelectChannelEndPoint.java:144)
    at wiremock.org.eclipse.jetty.io.NetworkTrafficSelectChannelEndPoint.flush(NetworkTrafficSelectChannelEndPoint.java:65)
    at wiremock.org.eclipse.jetty.io.WriteFlusher.flush(WriteFlusher.java:408)
    at wiremock.org.eclipse.jetty.io.WriteFlusher.write(WriteFlusher.java:302)
    at wiremock.org.eclipse.jetty.io.AbstractEndPoint.write(AbstractEndPoint.java:129)
    at wiremock.org.eclipse.jetty.server.HttpConnection$SendCallback.process(HttpConnection.java:676)
    at wiremock.org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:246)
    at wiremock.org.eclipse.jetty.util.IteratingCallback.iterate(IteratingCallback.java:208)
    at wiremock.org.eclipse.jetty.server.HttpConnection.send(HttpConnection.java:471)
    at wiremock.org.eclipse.jetty.server.HttpChannel.sendResponse(HttpChannel.java:763)
    at wiremock.org.eclipse.jetty.server.HttpChannel.write(HttpChannel.java:801)
    at wiremock.org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:147)
    at wiremock.org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:140)
    at wiremock.org.eclipse.jetty.server.HttpOutput.flush(HttpOutput.java:242)
    at java.io.FilterOutputStream.flush(FilterOutputStream.java:140)
    at wiremock.org.eclipse.jetty.servlets.gzip.AbstractCompressedStream.flush(AbstractCompressedStream.java:125)
    at com.github.tomakehurst.wiremock.servlet.WireMockHandlerDispatchingServlet.writeAndTranslateExceptions(WireMockHandlerDispatchingServlet.java:165)
    at com.github.tomakehurst.wiremock.servlet.WireMockHandlerDispatchingServlet.applyResponse(WireMockHandlerDispatchingServlet.java:154)
    at com.github.tomakehurst.wiremock.servlet.WireMockHandlerDispatchingServlet$ServletHttpResponder.respond(WireMockHandlerDispatchingServlet.java:121)
    at com.github.tomakehurst.wiremock.http.AbstractRequestHandler.handle(AbstractRequestHandler.java:63)
    at com.github.tomakehurst.wiremock.servlet.WireMockHandlerDispatchingServlet.service(WireMockHandlerDispatchingServlet.java:100)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at wiremock.org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:808)
    at wiremock.org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669)
    at wiremock.org.eclipse.jetty.servlets.UserAgentFilter.doFilter(UserAgentFilter.java:83)
    at wiremock.org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:364)
    at wiremock.org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
    at wiremock.org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)
    at wiremock.org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
    at wiremock.org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
    at wiremock.org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
    at wiremock.org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at wiremock.org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110)
    at wiremock.org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
    at wiremock.org.eclipse.jetty.server.Server.handle(Server.java:499)
    at wiremock.org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
    at wiremock.org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
    at wiremock.org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
    at wiremock.org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
    at wiremock.org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
    at java.lang.Thread.run(Thread.java:745)
2017-03-02 11:11:51.043 Outgoing bytes:
686

2017-03-02 11:11:51.044 Problem decoding network traffic
java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(CoderResult.java:277)
    at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:798)
    at com.github.tomakehurst.wiremock.http.trafficlistener.ConsoleNotifyingWiremockNetworkTrafficListener.outgoing(ConsoleNotifyingWiremockNetworkTrafficListener.java:34)
    at com.github.tomakehurst.wiremock.jetty9.JettyHttpServer$NetworkTrafficListenerAdapter.outgoing(JettyHttpServer.java:369)
    at wiremock.org.eclipse.jetty.io.NetworkTrafficSelectChannelEndPoint.notifyOutgoing(NetworkTrafficSelectChannelEndPoint.java:144)
    at wiremock.org.eclipse.jetty.io.NetworkTrafficSelectChannelEndPoint.flush(NetworkTrafficSelectChannelEndPoint.java:65)
    at wiremock.org.eclipse.jetty.io.WriteFlusher.flush(WriteFlusher.java:408)
    at wiremock.org.eclipse.jetty.io.WriteFlusher.write(WriteFlusher.java:302)
    at wiremock.org.eclipse.jetty.io.AbstractEndPoint.write(AbstractEndPoint.java:129)
    at wiremock.org.eclipse.jetty.server.HttpConnection$SendCallback.process(HttpConnection.java:684)
    at wiremock.org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:246)
    at wiremock.org.eclipse.jetty.util.IteratingCallback.iterate(IteratingCallback.java:208)
    at wiremock.org.eclipse.jetty.server.HttpConnection.send(HttpConnection.java:480)
    at wiremock.org.eclipse.jetty.server.HttpChannel.sendResponse(HttpChannel.java:768)
    at wiremock.org.eclipse.jetty.server.HttpChannel.write(HttpChannel.java:801)
    at wiremock.org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:147)
    at wiremock.org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:140)
    at wiremock.org.eclipse.jetty.server.HttpOutput.close(HttpOutput.java:171)
    at wiremock.org.eclipse.jetty.servlets.gzip.DeflatedOutputStream.close(DeflatedOutputStream.java:96)
    at wiremock.org.eclipse.jetty.servlets.gzip.AbstractCompressedStream.close(AbstractCompressedStream.java:162)
    at com.github.tomakehurst.wiremock.servlet.WireMockHandlerDispatchingServlet.writeAndTranslateExceptions(WireMockHandlerDispatchingServlet.java:166)
    at com.github.tomakehurst.wiremock.servlet.WireMockHandlerDispatchingServlet.applyResponse(WireMockHandlerDispatchingServlet.java:154)
    at com.github.tomakehurst.wiremock.servlet.WireMockHandlerDispatchingServlet$ServletHttpResponder.respond(WireMockHandlerDispatchingServlet.java:121)
    at com.github.tomakehurst.wiremock.http.AbstractRequestHandler.handle(AbstractRequestHandler.java:63)
    at com.github.tomakehurst.wiremock.servlet.WireMockHandlerDispatchingServlet.service(WireMockHandlerDispatchingServlet.java:100)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at wiremock.org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:808)
    at wiremock.org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669)
    at wiremock.org.eclipse.jetty.servlets.UserAgentFilter.doFilter(UserAgentFilter.java:83)
    at wiremock.org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:364)
    at wiremock.org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
    at wiremock.org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)
    at wiremock.org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
    at wiremock.org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
    at wiremock.org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
    at wiremock.org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at wiremock.org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110)
    at wiremock.org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
    at wiremock.org.eclipse.jetty.server.Server.handle(Server.java:499)
    at wiremock.org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
    at wiremock.org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
    at wiremock.org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
    at wiremock.org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
    at wiremock.org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
    at java.lang.Thread.run(Thread.java:745)
2017-03-02 11:11:51.046 Outgoing bytes:
0

2017-03-02 11:11:51.685 Incoming bytes: GET /pools/default?waitChange=0 HTTP/1.1
Authorization: Basic cm91c2VyOnBhc3N3b3Jk
Accept: */*
User-Agent: insomnia/4.2.14
host: localhost:8442
accept-encoding: gzip, deflate
Connection: keep-alive

2017-03-02 11:11:51.686 Proxying: GET http://<my-couchbase-host>:8091/pools/default?waitChange=0
2017-03-02 11:11:51.689 Outgoing bytes: HTTP/1.1 500 Server Error
Cache-Control: must-revalidate,no-cache,no-store
Content-Type: text/html; charset=ISO-8859-1
Content-Length: 395
Connection: close
Server: Jetty(9.2.z-SNAPSHOT)

2017-03-02 11:11:51.690 Outgoing bytes: <html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
<title>Error 500 </title>
</head>
<body>
<h2>HTTP ERROR: 500</h2>
<p>Problem accessing /pools/default. Reason:
<pre>    java.lang.RuntimeException: wiremock.org.apache.http.NoHttpResponseException: The target server failed to respond</pre></p>
<hr /><i><small>Powered by Jetty://</small></i>
</body>
</html>

2017-03-02 11:11:51.691 Closed Socket[addr=/<IP_ADDRESS>,port=60484,localport=8442]
2017-03-02 11:11:51.692 Closed Socket[addr=/<IP_ADDRESS>,port=60484,localport=8442]

I am getting a similar problem as well, except I am trying to use WireMock to proxy a 2-way SSL connection from an Apache server that I'm hosting locally. I wonder if we cannot use charset "UTF-8" in ConsoleNotifyingWiremockNetworkTrafficListener.java. My server normally sends back a response with gzip content-encoding.
java -jar wiremock-standalone-2.5.0.jar --port '8093' --https-port '8091' --https-keystore keystores/client.jks --verbose --proxy-all="https://<IP_ADDRESS>" --https-truststore keystores/server.jks --record-mappings --https-require-client-cert --truststore-password="password" --print-all-network-traffic
I have certificates imported into Firefox, and when I hit https://<IP_ADDRESS>:8091/, I get a similar trace in the console starting with:
2017-03-02 15:40:57.554 Opened Socket[addr=/<IP_ADDRESS>,port=37672,localport=8091] 2017-03-02 15:40:57.627 Problem decoding network traffic java.nio.charset.MalformedInputException: Input length = 1 	at java.nio.charset.CoderResult.throwException(CoderResult.java:281) 	at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:816) 	at com.github.tomakehurst.wiremock.http.trafficlistener.ConsoleNotifyingWiremockNetworkTrafficListener.incoming(ConsoleNotifyingWiremockNetworkTrafficListener.java:25) 	at com.github.tomakehurst.wiremock.jetty9.JettyHttpServer$NetworkTrafficListenerAdapter.incoming(JettyHttpServer.java:345) 	at wiremock.org.eclipse.jetty.io.NetworkTrafficSelectChannelEndPoint.notifyIncoming(NetworkTrafficSelectChannelEndPoint.java:125) 	at wiremock.org.eclipse.jetty.io.NetworkTrafficSelectChannelEndPoint.fill(NetworkTrafficSelectChannelEndPoint.java:48) 	at wiremock.org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.fill(SslConnection.java:507) 	at wiremock.org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:239) 	at wiremock.org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) 	at wiremock.org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) 	at wiremock.org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) 	at java.lang.Thread.run(Thread.java:745)

Sorry @jharrilim, my issue is not the trace in the console. That is simply an issue with outputting the headers to the console (see that this is coming from ConsoleNotifyingWiremockNetworkTrafficListener, which is quite literally named. Unless you're experiencing the Error 500 from Jetty in your response body, please file a separate issue.

@wojciechbulaty any idea why this might be happening?

I was also receiving a 500 as well. I found something out which created a temporary fix. When I set Firefox to prompt me every time for a client certificate, and then I connect to my server (without WireMock), I receive the prompt and I am returned a 200. Right after this, if I connect to my server through WireMock, it works fine.
If I open a new browser and try to connect through WireMock again, I will get the 500, and if I connect to my server without WireMock with "Select One Automatically" chosen and then try again with WireMock, it will also give 500.

@jharrilim it is possible this is related, but I am not using SSL/TLS in my requests to either WireMock or Couchbase, so I believe this may be a separate issue you are having.

I've done some more testing. It appears that any secondary call will fail if made immediately after a call to pools/default?waitChange=0, even if that waitChange call already received a response. I'm starting to suspect that Couchbase has some kind of logic happening behind-the-scenes when waitChange is specified with any positive integer value, which affects the response of a second, immediate request when proxied via WireMock.
Why this happens with WireMock but not with direct requests, I'm not sure. Here are the instances of waitChange in what I believe to be the applicable Couchbase repository... Not sure if that will be of any help in diagnosing the issue, as I'm not familiar with Erlang.

Here are some WireShark recordings I've made, in CSV format:
Two direct requests
"No.","Time","Source","Destination","Protocol","Length","Info"
"1001","08:26:45.844849","<IP_ADDRESS>","<IP_ADDRESS>","TCP","78","61858  >  8091 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=32 TSval=172395807 TSecr=0 SACK_PERM=1"
"1003","08:26:45.850254","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61858  >  8091 [ACK] Seq=1 Ack=1 Win=131584 Len=0 TSval=172395812 TSecr=429851455"
"1004","08:26:45.850632","<IP_ADDRESS>","<IP_ADDRESS>","HTTP","306","GET /pools/default?waitChange=0 HTTP/1.1 "
"1008","08:26:45.888748","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61858  >  8091 [ACK] Seq=241 Ack=180 Win=131392 Len=0 TSval=172395849 TSecr=429851464"
"1011","08:26:45.888881","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61858  >  8091 [ACK] Seq=241 Ack=2980 Win=129664 Len=0 TSval=172395849 TSecr=429851464"
"1013","08:26:45.888986","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61858  >  8091 [ACK] Seq=241 Ack=5780 Win=126848 Len=0 TSval=172395849 TSecr=429851464"
"1016","08:26:45.889161","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61858  >  8091 [ACK] Seq=241 Ack=6040 Win=126592 Len=0 TSval=172395849 TSecr=429851464"
"1017","08:26:45.889161","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61858  >  8091 [ACK] Seq=241 Ack=6041 Win=126592 Len=0 TSval=172395849 TSecr=429851464"
"1018","08:26:45.891788","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","[TCP Window Update] 61858  >  8091 [ACK] Seq=241 Ack=6041 Win=131072 Len=0 TSval=172395852 TSecr=429851464"
"1019","08:26:45.894693","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61858  >  8091 [FIN, ACK] Seq=241 Ack=6041 Win=131072 Len=0 TSval=172395854 TSecr=429851464"
"1050","08:26:47.141537","<IP_ADDRESS>","<IP_ADDRESS>","TCP","78","61859  >  8091 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=32 TSval=172397093 TSecr=0 SACK_PERM=1"
"1055","08:26:47.147689","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61859  >  8091 [ACK] Seq=1 Ack=1 Win=131584 Len=0 TSval=172397099 TSecr=429851779"
"1056","08:26:47.147931","<IP_ADDRESS>","<IP_ADDRESS>","HTTP","306","GET /pools/default?waitChange=0 HTTP/1.1 "
"1065","08:26:47.177242","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61859  >  8091 [ACK] Seq=241 Ack=180 Win=131392 Len=0 TSval=172397125 TSecr=429851786"
"1068","08:26:47.177430","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61859  >  8091 [ACK] Seq=241 Ack=2980 Win=128608 Len=0 TSval=172397125 TSecr=429851786"
"1070","08:26:47.177589","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61859  >  8091 [ACK] Seq=241 Ack=5780 Win=125792 Len=0 TSval=172397125 TSecr=429851786"
"1073","08:26:47.177738","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61859  >  8091 [ACK] Seq=241 Ack=6040 Win=125536 Len=0 TSval=172397125 TSecr=429851786"
"1074","08:26:47.177738","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61859  >  8091 [ACK] Seq=241 Ack=6041 Win=125536 Len=0 TSval=172397125 TSecr=429851786"
"1075","08:26:47.178388","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","[TCP Window Update] 61859  >  8091 [ACK] Seq=241 Ack=6041 Win=131072 Len=0 TSval=172397126 TSecr=429851786"
"1076","08:26:47.180093","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61859  >  8091 [FIN, ACK] Seq=241 Ack=6041 Win=131072 Len=0 TSval=172397127 TSecr=429851786"

Two WireMock-proxied requests
"No.","Time","Source","Destination","Protocol","Length","Info"
"97","08:29:49.512391","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61912  >  8091 [FIN, ACK] Seq=1 Ack=1 Win=4096 Len=0 TSval=172578294 TSecr=429895524"
"98","08:29:49.512622","<IP_ADDRESS>","<IP_ADDRESS>","TCP","78","61914  >  8091 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=32 TSval=172578294 TSecr=0 SACK_PERM=1"
"102","08:29:49.518171","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61914  >  8091 [ACK] Seq=1 Ack=1 Win=131584 Len=0 TSval=172578299 TSecr=429897371"
"103","08:29:49.518390","<IP_ADDRESS>","<IP_ADDRESS>","HTTP","294","GET /pools/default?waitChange=0 HTTP/1.1 "
"108","08:29:49.563194","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61914  >  8091 [ACK] Seq=229 Ack=180 Win=131392 Len=0 TSval=172578343 TSecr=429897383"
"109","08:29:49.563272","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61914  >  8091 [ACK] Seq=229 Ack=2980 Win=129664 Len=0 TSval=172578343 TSecr=429897383"
"114","08:29:49.563624","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61914  >  8091 [ACK] Seq=229 Ack=4380 Win=131072 Len=0 TSval=172578343 TSecr=429897383"
"115","08:29:49.563647","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61914  >  8091 [ACK] Seq=229 Ack=6041 Win=129408 Len=0 TSval=172578343 TSecr=429897383"
"116","08:29:49.563647","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61914  >  8091 [ACK] Seq=229 Ack=6042 Win=129408 Len=0 TSval=172578343 TSecr=429897383"
"187","08:29:51.036454","<IP_ADDRESS>","<IP_ADDRESS>","HTTP","294","GET /pools/default?waitChange=0 HTTP/1.1 "
"188","08:29:51.036582","<IP_ADDRESS>","<IP_ADDRESS>","TCP","66","61914  >  8091 [FIN, ACK] Seq=457 Ack=6042 Win=131072 Len=0 TSval=172579802 TSecr=429897383"

To make this work today, as a workaround, you can remove " --print-all-network-traffic" from the command line when starting Wiremock until this issue gets fixed or we figure out what is the root cause.
I can investigate this further when I get a free moment, unfortunately I did not have time for Wiremock lately. Can anybody else pick this up in the meantime?
Note to self: the java CharsetDecoder cannot parse the response in UTF-8. Also, hardcoding UTF-8 is a dodgy, when the traffic is binary.

@wojciechbulaty as stated in my previous comment, the stack trace printed is not at all related to my issue. I can reproduce this reliably with --print-all-network-traffic not present as a command line argument. Here is the STDOUT with this flag not present:
java -jar /path/to/wiremock-standalone-2.5.1.jar --container-threads 200 --verbose --https-port 8443 --port 8442 --root-dir /path/to/some --proxy-all="http://<my-couchbase-host>:8091" --record-mappings --match-headers="Accept,Content-Type,Cache-Control,Authorization"
2017-03-07 08:11:36.190 Verbose logging enabled
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2017-03-07 08:11:36.471 Verbose logging enabled
2017-03-07 08:11:36.502 Recording mappings to /path/to/some/mappings
 /$$      /$$ /$$                     /$$      /$$                     /$$
| $$  /$ | $$|__/                    | $$$    /$$$                    | $$
| $$ /$$$| $$ /$$  /$$$$$$   /$$$$$$ | $$$$  /$$$$  /$$$$$$   /$$$$$$$| $$   /$$
| $$/$$ $$ $$| $$ /$$__  $$ /$$__  $$| $$ $$/$$ $$ /$$__  $$ /$$_____/| $$  /$$/
| $$$$_  $$$$| $$| $$  \__/| $$$$$$$$| $$  $$$| $$| $$  \ $$| $$      | $$$$$$/
| $$$/ \  $$$| $$| $$      | $$_____/| $$\  $ | $$| $$  | $$| $$      | $$_  $$
| $$/   \  $$| $$| $$      |  $$$$$$$| $$ \/  | $$|  $$$$$$/|  $$$$$$$| $$ \  $$
|__/     \__/|__/|__/       \_______/|__/     |__/ \______/  \_______/|__/  \__/

port:                         8442
https-port:                   8443
https-keystore:               jar:file:/path/to/wiremock-standalone-2.5.1.jar!/keystore
proxy-all:                    http://<my-couchbase-host>:8091
preserve-host-header:         false
enable-browser-proxying:      false
record-mappings:              true
match-headers:                [Accept, Content-Type, Cache-Control, Authorization]
no-request-journal:           false
verbose:                      true

2017-03-07 08:11:42.258 Proxying: GET http://<my-couchbase-host>:8091/pools/default?waitChange=0
2017-03-07 08:11:42.531 Request received:
<IP_ADDRESS> - GET /pools/default?waitChange=0

Connection: [close]
Authorization: [Basic cm91c2VyOnBhc3N3b3Jk]
User-Agent: [insomnia/4.2.14]
Host: [localhost:8442]
Accept-Encoding: [gzip, deflate]
Accept: [*/*]

Matched response definition:
{
  "status" : 200,
  "proxyBaseUrl" : "http://<my-couchbase-host>:8091"
}

Response:
HTTP/1.1 200
Server: [Couchbase Server]
Pragma: [no-cache]
Date: [Tue, 07 Mar 2017 13:11:48 GMT]
Content-Type: [application/json]
Content-Length: [5855]
Cache-Control: [no-cache]

{"etag":"11476611","clusterName":"","storageTotals":{"ram":{"total":12289662976,"quotaTotal":6442450944,"quotaUsed":6442450944,"used":7370633216,"usedByData":603268732,"quotaUsedPerNode":2147483648,"quotaTotalPerNode":2147483648},"hdd":{"total":222675869696,"quotaTotal":222675869696,"used":2226758696,"usedByData":471120397,"free":0}},"balanced":true,"failoverWarnings":[],"goxdcrEnabled":true,"ldapEnabled":false,"serverGroupsUri":"/pools/default/serverGroups?v=108506564","indexMemoryQuota":256,"memoryQuota":2048,"name":"default","alerts":[],"alertsSilenceURL":"/controller/resetAlerts?token=0&uuid=8e989e84e055a831e614fc877e41a325","nodes":[{"systemStats":{"cpu_utilization_rate":25.15151515151515,"swap_total":6442446848,"swap_used":11927552,"mem_total":3975221248,"mem_free":1933709312},"interestingStats":{"cmd_get":0,"couch_docs_actual_disk_size":151499293,"couch_docs_data_size":122352976,"couch_spatial_data_size":5963158,"couch_spatial_disk_size":5974801,"couch_views_actual_disk_size":6020437,"couch_views_data_size":45636,"curr_items":18085,"curr_items_tot":40985,"ep_bg_fetched":0,"get_hits":0,"mem_used":211950176,"ops":0,"vb_replica_curr_items":22900},"uptime":"1797170","memoryTotal":3975221248,"memoryFree":1933709312,"mcdMemoryReserved":3032,"mcdMemoryAllocated":3032,"couchApiBase":"http://<IP_ADDRESS>:8092/","clusterMembership":"active","recoveryType":"none","status":"healthy","otpNode":"ns_1@<IP_ADDRESS>","hostname":"<IP_ADDRESS>:8091","clusterCompatibility":262145,"version":"4.1.1-5914-community","os":"x86_64-unknown-linux-gnu","ports":{"proxy":11211,"direct":11210},"services":["kv"]},{"systemStats":{"cpu_utilization_rate":9.063444108761329,"swap_total":6442446848,"swap_used":16384,"mem_total":4019945472,"mem_free":2051289088},"interestingStats":{"cmd_get":0,"couch_docs_actual_disk_size":145285416,"couch_docs_data_size":115802791,"couch_spatial_data_size":6016449,"couch_spatial_disk_size":6028080,"couch_views_actual_disk_size":6073704,"couch_views_data_size":45624,"curr_items":17971,"curr_items_tot":40872,"ep_bg_fetched":0,"get_hits":0,"mem_used":203331336,"ops":0,"vb_replica_curr_items":22901},"uptime":"60771","memoryTotal":4019945472,"memoryFree":2051289088,"mcdMemoryReserved":3066,"mcdMemoryAllocated":3066,"couchApiBase":"http://<my-couchbase-host>:8092/","clusterMembership":"active","recoveryType":"none","status":"healthy","otpNode":"ns_1@<my-couchbase-host>","thisNode":true,"hostname":"<my-couchbase-host>:8091","clusterCompatibility":262145,"version":"4.1.1-5914-community","os":"x86_64-unknown-linux-gnu","ports":{"proxy":11211,"direct":11210},"services":["index","kv","n1ql"]},{"systemStats":{"cpu_utilization_rate":10.48141377209019,"swap_total":5032693760,"swap_used":3154784256,"mem_total":4294496256,"mem_free":1694707712},"interestingStats":{"cmd_get":0,"couch_docs_actual_disk_size":138153328,"couch_docs_data_size":107413823,"couch_spatial_data_size":6007194,"couch_spatial_disk_size":6019831,"couch_views_actual_disk_size":6065507,"couch_views_data_size":45676,"curr_items":18010,"curr_items_tot":40877,"ep_bg_fetched":0,"get_hits":0,"mem_used":187987220,"ops":0,"vb_replica_curr_items":22869},"uptime":"1796863","memoryTotal":4294496256,"memoryFree":1694707712,"mcdMemoryReserved":3276,"mcdMemoryAllocated":3276,"couchApiBase":"http://<another-couchbase-host>:8092/","clusterMembership":"active","recoveryType":"none","status":"healthy","otpNode":"ns_1@<another-couchbase-host>","hostname":"<another-couchbase-host>:8091","clusterCompatibility":262145,"version":"4.1.1-5914-community","os":"win64","ports":{"proxy":11211,"direct":11210},"services":["index","kv","n1ql"]}],"buckets":{"uri":"/pools/default/buckets?v=80956094&uuid=8e989e84e055a831e614fc877e41a325","terseBucketsBase":"/pools/default/b/","terseStreamingBucketsBase":"/pools/default/bs/"},"remoteClusters":{"uri":"/pools/default/remoteClusters?uuid=8e989e84e055a831e614fc877e41a325","validateURI":"/pools/default/remoteClusters?just_validate=1"},"controllers":{"addNode":{"uri":"/controller/addNodeV2?uuid=8e989e84e055a831e614fc877e41a325"},"rebalance":{"uri":"/controller/rebalance?uuid=8e989e84e055a831e614fc877e41a325"},"failOver":{"uri":"/controller/failOver?uuid=8e989e84e055a831e614fc877e41a325"},"startGracefulFailover":{"uri":"/controller/startGracefulFailover?uuid=8e989e84e055a831e614fc877e41a325"},"reAddNode":{"uri":"/controller/reAddNode?uuid=8e989e84e055a831e614fc877e41a325"},"reFailOver":{"uri":"/controller/reFailOver?uuid=8e989e84e055a831e614fc877e41a325"},"ejectNode":{"uri":"/controller/ejectNode?uuid=8e989e84e055a831e614fc877e41a325"},"setRecoveryType":{"uri":"/controller/setRecoveryType?uuid=8e989e84e055a831e614fc877e41a325"},"setAutoCompaction":{"uri":"/controller/setAutoCompaction?uuid=8e989e84e055a831e614fc877e41a325","validateURI":"/controller/setAutoCompaction?just_validate=1"},"clusterLogsCollection":{"startURI":"/controller/startLogsCollection?uuid=8e989e84e055a831e614fc877e41a325","cancelURI":"/controller/cancelLogsCollection?uuid=8e989e84e055a831e614fc877e41a325"},"replication":{"createURI":"/controller/createReplication?uuid=8e989e84e055a831e614fc877e41a325","validateURI":"/controller/createReplication?just_validate=1"}},"rebalanceStatus":"none","rebalanceProgressUri":"/pools/default/rebalanceProgress","stopRebalanceUri":"/controller/stopRebalance?uuid=8e989e84e055a831e614fc877e41a325","nodeStatusesUri":"/nodeStatuses","maxBucketCount":10,"autoCompactionSettings":{"parallelDBAndViewCompaction":false,"databaseFragmentationThreshold":{"percentage":30,"size":"undefined"},"viewFragmentationThreshold":{"percentage":30,"size":"undefined"},"indexFragmentationThreshold":{"percentage":30}},"tasks":{"uri":"/pools/default/tasks?v=39150923"},"counters":{"rebalance_success":1,"rebalance_start":1},"indexStatusURI":"/indexStatus?v=101727310"}

2017-03-07 08:11:42.533 Recording mappings for /pools/default?waitChange=0
2017-03-07 08:11:43.286 Proxying: GET http://<my-couchbase-host>:8091/settings/autoFailover

Here is a screenshot of Insomnia's received response from WireMock/Jetty after the second request:

Here is the same in Postman, just to support that Insomnia is not affecting the result:

Again, the procedure for this test was:

GET /pools/default?waitChange=0
GET /settings/autoFailover

In my case, we received error "Problem decoding network traffic java.nio.charset.MalformedInputException: Input length = 1" because of GZIP compression that resulted into malformed response on latest WireMock image.
The fix was to disable GZIP compression by adding following parameter to WIREMOCK_OPTIONS:
--disable-gzip


Viewer does not display PET CT image if no patient weight is provided[Bug]

Describe the Bug
When the OHIF viewer attempts to load a PET images which has either no patient weight or a patient weight of zero the image does not display in the main viewer panel.
Steps to Reproduce

Download this phantom data set https://fileshare.uhn.ca/download/f74813e9-2522-4357-87e2-ad7115c7fb82 password "animal"
open it in basic viewer
drag series 401 into the main view panel

This test was done on our dev branch of the viewer but was confirmed by @jbocce it could be reproduced. (https://github.com/OHIF/Viewers/issues/3439#issuecomment-1671193859)
Repository URL
https://github.com/OHIF/Viewers/
Data Citation
https://github.com/OHIF/Viewers/blob/master/DATACITATION.md
Version number
3.7.0-beta.39
UHN Version
(7/27/2023, 8:17:33 PM)
Build number
0
Commit Hash
869b8ced0581904ebac1867ca302635a93129f02
Browser
Chrome 114.0.0
OS
Windows 10
The current behavior
In this phantom image set (provided below) the units are "BQML" and patient weight is 0.
The automatic window level displayed shows values that appear to be in BQML but the image is blank.
When using the probe tool it appears to try and calculate in SUV.

When changing the window level to something more realistic for SUV (W 5 L 1) the image becomes grey.

The expected behavior
The image should display in units of BQML on the screen as SUV can't be calculated without a patient weight.
OS
Win 10
Node version
Not sure
Browser
Chrome 114.0.0

New upload as previous expired.
https://fileshare.uhn.ca/download/09b66cb1-d647-4f09-99fd-106ec1585474 password "haircut"
Please note that this file upload will expire in 30 days.

FYI @sedghi and @BrandonDatUHN.
I have confirmed that this continues to be an issue despite the changes made for #3411. For #3411, the PatientWeight was completely missing from the DICOM, whereas in this case it is zero.

This issue will be addressed by @cornerstonejs/calculate-suv PR 19 and then a subsequent PR for OHIF to link the released calculate-suv library.
In summary, the change is to treat a zero PatientWeight as if it were missing.


drivers: led: Add LED driver support for TI LP5562

Add driver support and sample for the TI LP5562 4 channel I2C-based LED driver.
This driver supports the entire currently available API and a sample is provided.

@galak I don't really get how the dts works in that case... I just looked at the PCA9633 sample. How do you determine at what register the device is added to the I2C node?

Codecov Report

:exclamation: No coverage uploaded for pull request base (master@c12fa74). Click here to learn what that means.
The diff coverage is n/a.

@@            Coverage Diff            @@
##             master    #9031   +/-   ##
=========================================
  Coverage          ?   52.33%
=========================================
  Files             ?      197
  Lines             ?    24903
  Branches          ?     5181
=========================================
  Hits              ?    13034
  Misses            ?     9775
  Partials          ?     2094

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update c12fa74...7b67cd6. Read the comment docs.

@galak I updated it for device tree compatibility but I am not sure whether it is done the right way. As I understand it, we will never get rid of fixup files for I2C slaves because the architecture specific definitions generated from the dts have to be mapped. Is this correct? Or am I missing the clean approach?

@galak Not sure why I'm not being notified for the LED API/Driver Pull Requests even though my github handle is being listed in CODEOWNERS!

@JoeHut Please give me some time to look into this. I have just seen this PR and the absence of prompt notification added the delay.
Thanks!

@Mani-Sadhasivam No problem. If you are the LED codeowner we can maybe talk about RGB and brightness fading extensions of the API afterwards.

@JoeHut Sure. We can do the API discussion in #7619

@JoeHut You still need to add a devicetree node for this driver in a board which utilizes it!

@Mani-Sadhasivam I addressed your requests. I added a device tree overlay in the sample I provided for the nrf52840_pca10056 board I used for development. I don't know of a standard/devkit board that uses this driver. I implemented it for our own custom board.

@Mani-Sadhasivam Could you re-review at some point, please :)

@Mani-Sadhasivam I fixed up the commits (sorry for that). I changed the set_brightness implementation to keep the blinking rate but change the brightness, if led_blink was called before. It is a little bit hacky, but I think the API was designed with a certain functionality in mind that not all LED drivers provide necessarily. I think it might make sense to also change the comment in the LED API in order to make sure, that the brightness should be changed, but the blinking rate not. At least for me it was not clear :)

LGTM! @JoeHut Thanks a lot for contributing the driver :-) I know that we are very much limited with the API for these kind of complex devices, but obviously we can't do much here. One suggestion I would say it to have an API which does chip specific configuration (like programming the engine in this case). This was pointed out by @iha during the initial LED PR and still yet to be implemented.

Thanks for the feedback and review, @Mani-Sadhasivam! I think the problem is that the range of devices to support with this API is quite large with LEDs that can just be turned on or off via GPIO to proper multi-color chips with fading and blinking. Do you think adding brightness fading does not make sense to add to the API? In the initial PR @mbolivar planned to add RGB support, but I don't know if he has time for that.
If we won't change the general LED API, should I implement those things rather with an API exposed in include/drivers/led? I think that would make more sense than passing some void pointers.

@JoeHut I didn't say that the API cannot be extended ;-) It should be extended to cover wide range of LED devices (like this one). Still I haven't looked at your API proposal but if you have any idea to extend the API to support more devices please submit a PR :)
RGB support is something which is missing from day one and I don't have any exact time frame to add that. Regarding the brightness fading, yeah we can add that to API (sceptical) if we also have a driver utilising that ;-)


Develop Prescribed Platform Motion capability with aero-elasticity

Good evening,
I'm trying to implement a capability in OpenFAST that will allow a user to prescribe periodic platform motions to the simulations. The objective is to run these simulations with aero-elasticity so I'm trying to see how to implement this in a fully coupled framework instead of in the AeroDyn module alone. I'll show below where in the code I'm standing now and where I'm thinking of making the changes. If you could give me some guidance, it would be amazing.
As far as my understanding goes, ElastoDyn is the module that receives the loads and calculates the displacements, velocities and accelerations of the system's DOF, so the motion prescription should be done here. I also went through the code starting from the OpenFAST driver (FAST_Prog.f90) and it lead me to ElastoDyn. In the beginning of ElastoDyn.f90 (line 557), there's this:
! SEE IF THESE NEED TO BE CALLED (i.e., if UpdateStates was called, these values are already calculated)
   IF ( UpdateValues ) THEN
         ! Update the OtherState data by calculating the derivative...
      !OtherState%HSSBrTrqC = SIGN( u%HSSBrTrqC, x%QDT(DOF_GeAz) )
      CALL ED_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrStat, ErrMsg ) ! sets m%QD2T = dxdt%QDT
      CALL ED_DestroyContState( dxdt, ErrStat2, ErrMsg2 )
      IF (ErrStat >= AbortErrLev) RETURN
   END IF

and UpdateValues is set to .TRUE..
At the beginning of the function ED_CalcContStateDeriv (ElastoDyn.f90 line 1825), there's this:
         ! set the coordinate system variables:
      CALL SetCoordSy( t, m%CoordSys, m%RtHS, u%BlPitchCom, p, x, ErrStat2, ErrMsg2 )
         call setErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName)
         IF (ErrStat >= AbortErrLev) RETURN

      CALL CalculatePositions(        p, x, m%CoordSys,    m%RtHS ) ! calculate positions
      CALL CalculateAngularPosVelPAcc(p, x, m%CoordSys,    m%RtHS ) ! calculate angular positions, velocities, and partial accelerations, including partial angular quantities
      CALL CalculateLinearVelPAcc(    p, x, m%CoordSys,    m%RtHS ) ! calculate linear velocities and partial accelerations
      CALL CalculateForcesMoments(    p, x, m%CoordSys, u, m%RtHS ) ! calculate the forces and moments (requires AeroBladeForces and AeroBladeMoments)

The 4 functions found in this piece of code (CalculatePositions, CalculateAngularPosVelPAcc, CalculateLinearVelPAcc and CalculateForcesMoments) calculate an object called RtHSdat which seems to contains partial moments, forces and linear and angular accelerations which will be used to calculate the same total quantities in the ED_CalcOutput routine. The RtHSdat object contains the following properties, among others:
REAL(R8Ki) , DIMENSION(1:3)  :: rZ      !< Position vector from inertia frame origin to platform reference (point Z) [m]
REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE  :: PAngVelEX      !< Partial angular velocity (and its 1st time derivative) of the platform (body B) in the inertia frame (body E for earth) [-]
REAL(ReKi) , DIMENSION(1:3)  :: AngVelEX      !< Angular velocity of the platform (body X) in the inertia frame (body E for earth) [-]
REAL(ReKi) , DIMENSION(1:3)  :: LinVelEZ      !< Linear velocity of platform reference (point Z) in the inertia frame [-]

My first idea was to prescribe all the fields in RtHSdat that correspond to the linear and angular positions, velocities and accelerations from the inertia frame origin to platform reference (point Z) but there seem to be some platform motions (including the actual platform DOF like surge and pitch) which relate to the objects x%QT, x%QDT and m%Q2DT as can be seen below (ElastoDyn.f90 line 931):
     ! Platform Motions:

   m%AllOuts( PtfmTDxt) =  DOT_PRODUCT(       m%RtHS%rZ, m%CoordSys%a1 )
   m%AllOuts( PtfmTDyt) = -DOT_PRODUCT(       m%RtHS%rZ, m%CoordSys%a3 )
   m%AllOuts( PtfmTDzt) =  DOT_PRODUCT(       m%RtHS%rZ, m%CoordSys%a2 )
   m%AllOuts( PtfmTDxi) = x%QT  (DOF_Sg )
   m%AllOuts( PtfmTDyi) = x%QT  (DOF_Sw )
   m%AllOuts( PtfmTDzi) = x%QT  (DOF_Hv )
   m%AllOuts( PtfmTVxt) =  DOT_PRODUCT( m%RtHS%LinVelEZ, m%CoordSys%a1 )
   m%AllOuts( PtfmTVyt) = -DOT_PRODUCT( m%RtHS%LinVelEZ, m%CoordSys%a3 )
   m%AllOuts( PtfmTVzt) =  DOT_PRODUCT( m%RtHS%LinVelEZ, m%CoordSys%a2 )
   m%AllOuts( PtfmTVxi) = x%QDT (DOF_Sg )
   m%AllOuts( PtfmTVyi) = x%QDT (DOF_Sw )
   m%AllOuts( PtfmTVzi) = x%QDT (DOF_Hv )
   m%AllOuts( PtfmTAxt) =  DOT_PRODUCT(                 LinAccEZ, m%CoordSys%a1 )
   m%AllOuts( PtfmTAyt) = -DOT_PRODUCT(                 LinAccEZ, m%CoordSys%a3 )
   m%AllOuts( PtfmTAzt) =  DOT_PRODUCT(                 LinAccEZ, m%CoordSys%a2 )
   m%AllOuts( PtfmTAxi) = m%QD2T(DOF_Sg  )
   m%AllOuts( PtfmTAyi) = m%QD2T(DOF_Sw  )
   m%AllOuts( PtfmTAzi) = m%QD2T(DOF_Hv  )
   m%AllOuts( PtfmRDxi) = x%QT  (DOF_R )*R2D
   m%AllOuts( PtfmRDyi) = x%QT  (DOF_P )*R2D
   m%AllOuts( PtfmRDzi) = x%QT  (DOF_Y )*R2D
   m%AllOuts( PtfmRVxt) =  DOT_PRODUCT( m%RtHS%AngVelEX, m%CoordSys%a1 )*R2D
   m%AllOuts( PtfmRVyt) = -DOT_PRODUCT( m%RtHS%AngVelEX, m%CoordSys%a3 )*R2D
   m%AllOuts( PtfmRVzt) =  DOT_PRODUCT( m%RtHS%AngVelEX, m%CoordSys%a2 )*R2D
   m%AllOuts( PtfmRVxi) = x%QDT (DOF_R )*R2D
   m%AllOuts( PtfmRVyi) = x%QDT (DOF_P )*R2D
   m%AllOuts( PtfmRVzi) = x%QDT (DOF_Y )*R2D
   m%AllOuts( PtfmRAxt) =  DOT_PRODUCT(                 AngAccEX, m%CoordSys%a1 )*R2D
   m%AllOuts( PtfmRAyt) = -DOT_PRODUCT(                 AngAccEX, m%CoordSys%a3 )*R2D
   m%AllOuts( PtfmRAzt) =  DOT_PRODUCT(                 AngAccEX, m%CoordSys%a2 )*R2D
   m%AllOuts( PtfmRAxi) = m%QD2T(DOF_R )*R2D
   m%AllOuts( PtfmRAyi) = m%QD2T(DOF_P )*R2D
   m%AllOuts( PtfmRAzi) = m%QD2T(DOF_Y )*R2D

Also, the RtHSdat properties of interest are calculated from x%QT, x%QDT and m%Q2DT and partial angular and linear velocities generally speaking. Now, I think I should prescribed x%QT, x%QDT and m%Q2DT and partial angular and linear velocities that are used to calculate the RtHSdat properties from the inertia frame origin to platform reference (point Z).
Is this reasoning correct or am I completely off of the tracks? If not, I think x%QT, x%QDT and m%Q2DT are straightforward to prescribe since they seem the position, velocity and acceleration of the typical platform degrees of freedom corrected by a constant (which I don't know what it is) but I don't understand what are the partial angular and linear velocities.
Best regards,
Ricardo Amaral

Dear Ricardo,
The platform motions are structural DOFs of ElastoDyn.  As such, they are solved by calculating F=m*a for the acceleration (a, the unknowns) based on applied loads (F, the knowns) and time integrating.  I would generally not recommend trying to prescribe some of the states while calculating others, as, this would likely require a rearrangement of the formulation in terms of which terms are knowns (a for the platform, F for other components) and which are unknowns (F for the platform, a for the other components).
Instead, I would recommend applying loads at the platform reference point that result in the desired motion of the platform.  The user-specified external platform called via CompSub = 2 in the OpenFAST primary input file provides a direct means for setting the platform loads.
Similar topics have been discussed a number of times on our forum, e.g. see: https://wind.nrel.gov/forum/wind/viewtopic.php?f=4&t=2259&p=12800.  I suggest review these for further information.
Best regards,

Dear jjonkman,
Thank you for the explanation, I understand. On that case, according to what I read about the ExtPtfm module and the Craig-Bampton reduction, I first need to produce the reduced matrices (M,C and K) and reduced loads for the floater using a high-fidelity FEM software.

Assuming that I want to prescribe a surge motion in OpenFAST, do I need to then apply loads in the surge direction on the FEM software? If I want to prescribe another type of motion, for instance pitch, do I need to recalculate the reduced matrices?

If I still want to prescribed a surge motion but with a different amplitude and since the system is linearized, is it sufficient to multiply the reduced loads in the ExtPtfm input by a given constant (with no change in the reduced matrices) or do I need to recalculate the reduced matrices and loads?

Best regards,
Ricardo Amaral

Dear Ricardo,
Actually, I would forget the Craig-Bampton reduction.
Instead, I would set the externally applied force in ExtPtfm equal to
F = K*( DesiredDisplacement - X ) + C*( DesiredVelocity - Xdot )
This is effectively what the Seismic module of FAST v7 does to impose earthquake excitation of the platform.  See equations (1)-(3) in the Seismic documentation for more information: https://drive.google.com/file/d/1YbZgeOZ46R5IiMOT-kpHtoElOfyBlwUG/view?usp=sharing.
Best regards,

Dear jjonkman,
I think I understood the force that but I'm not sure regarding the M, C and K matrix inputs. Would these be 6x6 matrices considering the 6 platform degrees of freedom where:

M = Mptfm + Madded(f = f_imposed_motion), where Mptfm comes from ElastoDyn's inertia and Madded from the .1 file from the HydroDyn inputs. I also read that this inertia should be increased so that the applied loads dominate other loads on the platform;
C(f = f_imposed_motion), coming from the .1 file from HydroDyn inputs;
K = Khst + Kmooring, where Khst comes from the HydroDyn's .hst file. Kmooring I wouldn't know how to obtain.

At the same time, I have the feeling that the actual matrix values don't matter as long as they are in accordance with the coefficients k and c used to calculate the prescribed forces. At least looking at the equation of motion for pure surge [mxdd + cxd + kx = F = k(xtarget - x) + c(xdtarget - xd)], I can see the terms cancelling on the left and right sides, is this correct?
In this case:

For a pure degree of freedom, the frequency of the motion is tuned by the m, c and k parameters which are related by equations (1) and (2) of the Seismic module documentation?
If 2 degrees of freedom are prescribed, then the coupling terms need to be taken into account in the prescribed force?

And finally, on the ExtPtfm input file:
Comment describing the model
---------------------- SIMULATION CONTROL --------------------------------------
False          Echo         - Echo input data to <RootName>.ech (flag)
"default"     DT           - Communication interval for controllers (s) (or "default")
   3          IntMethod    - Integration Method {1:RK4; 2:AB4, 3:ABM4} (switch)
---------------------- REDUCTION INPUTS ----------------------------------------
   1          FileFormat    - File Format {0:Guyan; 1:FlexASCII} (switch)
"ExtPtfm_SE.dat"   Red_FileName    - Path of the file containing Guyan/Craig-Bampton inputs (-)
"NA"         RedCst_FileName - Path of the file containing Guyan/Craig-Bampton constant inputs (-) (currently unused)
-1           NActiveDOFList - Number of active CB mode listed in ActiveDOFList, use -1 for all modes (integer)
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25     ActiveDOFList  - List of CB modes index that are active, [unused if NActiveDOFList<=0]
0          NInitPosList   - Number of initial positions listed in InitPosList, using 0 implies all DOF initialized to 0  (integer)
0,         InitPosList    - List of initial positions for the CB modes  [unused if NInitPosList<=0 or EquilStart=True]
0          NInitVelList   - Number of initial positions listed in InitVelList, using 0 implies all DOF initialized to 0  (integer)
0,         InitVelList    - List of initial velocities for the CB modes  [unused if NInitVelPosList<=0 or EquilStart=True]
---------------------- OUTPUT --------------------------------------------------
True          SumPrint      - Print summary data to <RootName>.sum (flag)
         1    OutFile      - Switch to determine where output will be placed: {1: in module output file only; 2: in glue code output file only; 3: both} (currently unused)
True          TabDelim     - Use tab delimiters in text tabular output file? (flag) (currently unused)
"ES10.3E2"    OutFmt       - Format used for text tabular output (except time).  Resulting field should be 10 characters. (quoted string) (currently unused)
          0   TStart       - Time to begin tabular output (s) (currently unused)
              OutList      - The next line(s) contains a list of output parameters.  See OutListParameters.xlsx for a listing of available output channels, (-) ```

Should I put the ActiveDOFList to 0? Is there something else I need to change?

Best regards,
Ricardo Amaral

Dear Ricardo,
My understanding is that you want to prescribe the motion of the platform.  As such, you don't need to consider any physically correct values for platform mass/inertia, hydrodynamics, or moorings.  Instead, as discussed in the Seismic documentation, you should specify an artificially high platform mass/inertia, and choose a stiffness, damping, and force that results in the desired motion.
In your equation of motion, you've double booked the c*xd and k*x terms.  Instead, the single DOF equation of motion should be:
m*xdd+c*xd+k*x = c*xdtarget + k*xtarget.
(This is equivalent to m*xdd = c*(xdtarget - xd) + k*(xtarget - x).)
The ExtPtfm module allows you to specify M, C, K, and F for a rigid platform by setting FileFormat = 0 (Guyan).  I would choose M such that when it is added to the physical mass/inertia of the wind turbine atop the platform that M dominates.  C and K can be derived from M as discussed in the Seismic documentation.  Then, F includes the terms that are left on the right-hand side: F = C*xdtarget + K*xtarget.  If the mass added via ExtPtfm (M) is large relative to the physical/mass inertia of the wind turbine, then I would expect you could get by with making M, C, and K diagonal matrices (the Seismic module didn't have to worry about off-diagonal terms because Seismic only applied to the platform translation DOFs).
I hope that helps.
Best regards,

Dear jjonkman,
I'm coming back to you to report my progress on this. After prescribing the force indicated by the formula F = Cxdtarget + Kxtarget considering: the relation between M, K and C found in the Seismic module documentation, a pure surge motion with Amp = 2 m and f = 0.05 Hz, MoorDyn turned off, the remaining 5 DOF's turned off in ElastoDyn and a prescribed mass in the surge DOF's of 100 times the platform's mass found in the ElastoDyn input, I found out that the motion's amplitude was overpredicted by around 25%. This can be seen below on a prescribed mass sensitivity study I perfomed to see when would the motion converge to the prescribed one. For a prescribed mass of 100 times the platform mass, one can see that the motion has converged by comparison with the purple curve. "PM" is the prescribed mass and "TM" is the turbine's platform mass:

Facing this problem, I changed my approach and decided to prescribe a force based on a single DOF system's response to a constant amplitude force whose formula is depicted below, where F is the prescribed force's amplitude, omega is the force's frequency and c and k are the system's damping and stiffness in the DOF:

(This formula can be found in books on vibrations and system dynamics).
Considering this, one can see that prescribing the force below will result in a motion with the correct amplitude and the same frequency as the force:

This made sense to me because, for such a high prescribed mass and stiffness and damping along with it, the scale of the turbine originated perturbations would be so low compared to the ones prescribed that the system would effectively be in the single DOF approximation which, I think, is why you told me to prescribe such a dominant prescribed mass. After this, I managed to get the correct amplitude of 2 m for prescribed masses which were 10 or 100 times that of the platform's mass:

This force prescription formula was tested for the remaining pure DOF and also for surge with other amplitudes and frequencies and the obtained motion was correct.
I may have missed something in your explanation or made a mistake while launching the first simulations but in any case, what I did seems to have worked so I thought it would be of value to report it back to this repository.
Best regards,
Ricardo Amaral

Dear Ricardo,
I'm not following everything you are saying, but from my original description, I was suggesting that the mass in ExtPtfm be set much larger than the full system mass (actual platform mass + tower mass + nacelle mass + rotor mass).  The stiffness and damping can be derived from that mass and an actuator frequency that is higher than the highest natural frequency of the turbine model when the platform is fixed.  With these values for M, C, and K, you should get the desired motion to match any target motion you specify.
Best regards,


Goofy overrides audio controls on Touch Bar MBP

Goofy shows up as a viable audio source and overrides other audio sources for use of the controls on the touch bar.


feat(dialog): add ScrollBody and ScrollOverlay demos

this PR closes #73

before creating any branch make sure you have latest changes on your origins

Don't know why I have 3 commits, always make changes in new branches 🤔

Discard those changes, and sync fork, don't worry

ok, I will update this PR to all changes from dev branch)

@sadeghbarati ready for review ❤

Wops Zernonia changes are still here
I'll explain my way of creating PR

Always check my origin (my fork) and see if upstream (shadcn-vue) is ahead of me or not

Sync fork, sometimes Discard changes and Sync together

Create a new branch in my IDE based on my origin/dev

ok, i will make a new PR, thanks

@romanhrynevych
Can you add me to your fork?

Send invite to you, I have 4 commits on dev branch, that are magically removed from this repo, don't know how to delete them, ahahaha 😂

Did something funny 😆
dev-fresh is added now make it default and remove previous dev branch

I do sync yesterday, I think that zernonia pushed this 3 commits, but then deleted them 🤔


FSDP Training crashes everytime, while single GPU training works fine.

I am fine-tuning the falcon-7B model on AWS g512x.large instance with the adapter_v2 script. This works when I keep the device=1 as in the original script, but when I increase the device count to 4, training fails with the following error :
/databricks/driver/lit-gpt/finetune/adapter_v2.py:302: JsonargparseDeprecationWarning:
    Only use the public API as described in https://jsonargparse.readthedocs.io/en/stable/#api-reference.
    Importing from jsonargparse.cli is kept only to avoid breaking code that does not correctly use the public
    API. It will no longer be available from v5.0.0.

  from jsonargparse.cli import CLI
/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/pydantic/_migration.py:282: UserWarning: `pydantic.utils:Representation` has been removed. We are importing from `pydantic.v1.utils:Representation` instead.See the migration guide for more details: https://docs.pydantic.dev/latest/migration/
  warnings.warn(
Initializing distributed: GLOBAL_RANK: 0, MEMBER: 1/4
/databricks/driver/lit-gpt/finetune/adapter_v2.py:302: JsonargparseDeprecationWarning:
    Only use the public API as described in https://jsonargparse.readthedocs.io/en/stable/#api-reference.
    Importing from jsonargparse.cli is kept only to avoid breaking code that does not correctly use the public
    API. It will no longer be available from v5.0.0.

  from jsonargparse.cli import CLI
/databricks/driver/lit-gpt/finetune/adapter_v2.py:302: JsonargparseDeprecationWarning:
    Only use the public API as described in https://jsonargparse.readthedocs.io/en/stable/#api-reference.
    Importing from jsonargparse.cli is kept only to avoid breaking code that does not correctly use the public
    API. It will no longer be available from v5.0.0.

  from jsonargparse.cli import CLI
/databricks/driver/lit-gpt/finetune/adapter_v2.py:302: JsonargparseDeprecationWarning:
    Only use the public API as described in https://jsonargparse.readthedocs.io/en/stable/#api-reference.
    Importing from jsonargparse.cli is kept only to avoid breaking code that does not correctly use the public
    API. It will no longer be available from v5.0.0.

  from jsonargparse.cli import CLI
/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/pydantic/_migration.py:282: UserWarning: `pydantic.utils:Representation` has been removed. We are importing from `pydantic.v1.utils:Representation` instead.See the migration guide for more details: https://docs.pydantic.dev/latest/migration/
  warnings.warn(
/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/pydantic/_migration.py:282: UserWarning: `pydantic.utils:Representation` has been removed. We are importing from `pydantic.v1.utils:Representation` instead.See the migration guide for more details: https://docs.pydantic.dev/latest/migration/
  warnings.warn(
/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/pydantic/_migration.py:282: UserWarning: `pydantic.utils:Representation` has been removed. We are importing from `pydantic.v1.utils:Representation` instead.See the migration guide for more details: https://docs.pydantic.dev/latest/migration/
  warnings.warn(
Initializing distributed: GLOBAL_RANK: 1, MEMBER: 2/4
Initializing distributed: GLOBAL_RANK: 2, MEMBER: 3/4
Initializing distributed: GLOBAL_RANK: 3, MEMBER: 4/4
----------------------------------------------------------------------------------------------------
distributed_backend=nccl
All distributed processes registered. Starting with 4 processes
----------------------------------------------------------------------------------------------------

[rank: 2] Global seed set to 1337
[rank: 1] Global seed set to 1337
[rank: 3] Global seed set to 1337
[rank: 0] Global seed set to 1337
[rank: 3] Global seed set to 1340
[rank: 2] Global seed set to 1339
[rank: 1] Global seed set to 1338
[rank: 0] Global seed set to 1337
Traceback (most recent call last):
  File "/databricks/driver/lit-gpt/finetune/adapter_v2.py", line 304, in <module>
    CLI(setup)
  File "/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/jsonargparse/_cli.py", line 85, in CLI
    return _run_component(component, cfg_init)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/jsonargparse/_cli.py", line 147, in _run_component
    return component(**cfg)
           ^^^^^^^^^^^^^^^^
  File "/databricks/driver/lit-gpt/finetune/adapter_v2.py", line 79, in setup
    fabric.launch(main, data_dir, checkpoint_dir, out_dir)
  File "/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/lightning/fabric/fabric.py", line 805, in launch
    return self._wrap_and_launch(function, self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/lightning/fabric/fabric.py", line 887, in _wrap_and_launch
    return to_run(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/lightning/fabric/fabric.py", line 892, in _wrap_with_setup
    return to_run(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/databricks/driver/lit-gpt/finetune/adapter_v2.py", line 120, in main
    train(fabric, model, optimizer, train_data, val_data, checkpoint_dir, out_dir, speed_monitor)
  File "/databricks/driver/lit-gpt/finetune/adapter_v2.py", line 180, in train
    fabric.backward(loss / gradient_accumulation_iters)
  File "/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/lightning/fabric/fabric.py", line 398, in backward
    self._strategy.backward(tensor, module, *args, **kwargs)
  File "/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/lightning/fabric/strategies/strategy.py", line 179, in backward
    self.precision.backward(tensor, module, *args, **kwargs)
  File "/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/lightning/fabric/plugins/precision/fsdp.py", line 136, in backward
    super().backward(tensor, model, *args, **kwargs)
  File "/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/lightning/fabric/plugins/precision/precision.py", line 91, in backward
    tensor.backward(*args, **kwargs)
  File "/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/torch/_tensor.py", line 491, in backward
    torch.autograd.backward(
  File "/root/miniconda3/envs/lit-gpt/lib/python3.11/site-packages/torch/autograd/__init__.py", line 204, in backward
    Variable._execution_engine.run_backward(  # Calls into the C++ engine to run the backward pass
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 564.00 MiB. GPU 1 has a total capacty of 22.20 GiB of which 203.12 MiB is free. Process 9841 has 22.00 GiB memory in use. Of the allocated memory 19.13 GiB is allocated by PyTorch, and 1.69 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
[E ProcessGroupNCCL.cpp:456] [Rank 3] Watchdog caught collective operation timeout: WorkNCCL(SeqNum=8743, OpType=_ALLGATHER_BASE, NumelIn=51794866, NumelOut=207179464, Timeout(ms)=1800000) ran for 1800070 milliseconds before timing out.
[E ProcessGroupNCCL.cpp:456] [Rank 0] Watchdog caught collective operation timeout: WorkNCCL(SeqNum=8743, OpType=_ALLGATHER_BASE, NumelIn=51794866, NumelOut=207179464, Timeout(ms)=1800000) ran for 1800976 milliseconds before timing out.
[E ProcessGroupNCCL.cpp:470] Some NCCL operations have failed or timed out. Due to the asynchronous nature of CUDA kernels, subsequent GPU operations might run on corrupted/incomplete data.
[E ProcessGroupNCCL.cpp:476] To avoid data inconsistency, we are taking the entire process down.
[E ProcessGroupNCCL.cpp:838] [Rank 3] NCCL watchdog thread terminated with exception: [Rank 3] Watchdog caught collective operation timeout: WorkNCCL(SeqNum=8743, OpType=_ALLGATHER_BASE, NumelIn=51794866, NumelOut=207179464, Timeout(ms)=1800000) ran for 1800070 milliseconds before timing out.
terminate called after throwing an instance of 'std::runtime_error'
  what():  [Rank 3] NCCL watchdog thread terminated with exception: [Rank 3] Watchdog caught collective operation timeout: WorkNCCL(SeqNum=8743, OpType=_ALLGATHER_BASE, NumelIn=51794866, NumelOut=207179464, Timeout(ms)=1800000) ran for 1800070 milliseconds before timing out.
[E ProcessGroupNCCL.cpp:470] Some NCCL operations have failed or timed out. Due to the asynchronous nature of CUDA kernels, subsequent GPU operations might run on corrupted/incomplete data.
[E ProcessGroupNCCL.cpp:476] To avoid data inconsistency, we are taking the entire process down.
[E ProcessGroupNCCL.cpp:838] [Rank 0] NCCL watchdog thread terminated with exception: [Rank 0] Watchdog caught collective operation timeout: WorkNCCL(SeqNum=8743, OpType=_ALLGATHER_BASE, NumelIn=51794866, NumelOut=207179464, Timeout(ms)=1800000) ran for 1800976 milliseconds before timing out.
terminate called after throwing an instance of 'std::runtime_error'
  what():  [Rank 0] NCCL watchdog thread terminated with exception: [Rank 0] Watchdog caught collective operation timeout: WorkNCCL(SeqNum=8743, OpType=_ALLGATHER_BASE, NumelIn=51794866, NumelOut=207179464, Timeout(ms)=1800000) ran for 1800976 milliseconds before timing out.```

The same training fails on a p3.16xlarge instance (supports NVME). , with  16-true precision also.

fails with adapter v1 and cpu_offloading=True as well.

Hey how much GPU memory is required to train Falcon-7B on alpaca dataset. When i tried with 1 40gb GPU A100, i am getting OOM. Any Suggestions? Thank you.

I would also like to add that sharding seems to cause a CUDA out of memory issue much earlier than not using any at all, utilising adapter.py
The following error outputs are done with micro_batch_size = 1 and precision set as "bf16-true", and the system has a number of GTX3090 24GB GPUs available. The environment variable related to "max_split_size_mb" is set to 128.
With 1 GPU, the following occurs:
iter 3436 step 53: loss 2.9911, iter time: 400.10ms
Traceback (most recent call last):
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 8.06 GiB. GPU 0 has a total capacty of 23.70 GiB of which 1.27 GiB is free. Including non-PyTorch memory, this process has 22.43 GiB memory in use. Of the allocated memory 12.62 GiB is allocated by PyTorch, and 8.65 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

With 2 GPUs:
iter 4 step 0: loss 2.6297, iter time: 827.80ms
...
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 8.06 GiB. GPU 1 has a total capacty of 23.70 GiB of which 1.60 GiB is free. Including non-PyTorch memory, this process has 22.10 GiB memory in use. Of the allocated memory 12.16 GiB is allocated by PyTorch, and 8.76 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
...
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 8.06 GiB. GPU 0 has a total capacty of 23.70 GiB of which 2.15 GiB is free. Including non-PyTorch memory, this process has 21.54 GiB memory in use. Of the allocated memory 12.16 GiB is allocated by PyTorch, and 8.20 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

With 4:
iter 28 step 1: loss 3.1707, iter time: 1705.49ms
...
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 8.06 GiB. GPU 1 has a total capacty of 23.70 GiB of which 3.42 GiB is free. Including non-PyTorch memory, this process has 20.28 GiB memory in use. Of the allocated memory 10.47 GiB is allocated by PyTorch, and 8.63 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
[rank: 1] Child process with PID 433976 terminated with code 1. Forcefully terminating all other processes to avoid zombies 🧟
Killed

And with 6:
iter 180 step 18: loss 2.7013, iter time: 3271.34ms
...
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 8.06 GiB. GPU 4 has a total capacty of 23.70 GiB of which 4.29 GiB is free. Including non-PyTorch memory, this process has 19.41 GiB memory in use. Of the allocated memory 8.74 GiB is allocated by PyTorch, and 9.48 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
[rank: 4] Child process with PID 456677 terminated with code 1. Forcefully terminating all other processes to avoid zombies 🧟
Killed

From what I observe, using more than 1 GPU instead caused a CUDA out of memory issue to occur earlier while causing iteration times to be much longer. In addition, for some reason the size reserved by PyTorch but unallocated is larger than the size tried to be allocated.

Also getting that strange behaviour @Colonelvinnie mentioned with finetune/lora.py, 7b model fits and trains in single RTX 3090 but fails with OOM when setting devices=2 (2xRTX 3090) or devices=3 (1xRTX 3090 and 2xRTX 3080). If I understand correctly FSDP splits the model between several GPUs so if it fits in 1 3090 it should fit in 2 right?


add speculative decoding example for llama

Example that loads huggingface llama weights, and "engine" class that holds the draft and regular model to do speculative decoding. Basic test script so you can compare their speed on a prompt where SD should obviously help (repeating a monologue from Hamlet)

Looks super cool! Will try and get to this soon :)

I started looking at this. I added the ability to sample with a temperature of 0.0. The first thing I noticed is there is not complete overlap when using the same model and draft_model and a temp of 0.0. I think they should match completely in that case, let's fix that first.
I will take look at perf next..

Cool! Yeah not sure what's going on with the lack of perfect overlap. I checked that they generally overlap when draft model and verifier model are the same, but don't know what would cause this edge case. I copied the sampling from the existing Llama example. I wouldn't be surprised if there are small bugs related to KV-cache, as that's the part I'm least familiar with / gave me the most pain. The logic of truncating it the right amount etc. required lots of mental shape rotation and debugging 😄

I think I have it working now, I think it was a minor off-by-one with the cache as you say. I will push it shortly, just want to confirm!

Nice!

Just a quick update. I pushed to your branch. It works now in the sense that I get the same output with and without speculative decoding. Using tiny llama and llama 7b it accepts 110 out of 125 tokens which seems pretty good to me
The main problem is it is slower with speculative decoding (about 9 seconds vs 11.5 seconds). I didn't really spend any time on perf yet so there could be some hidden bottleneck there. Will investigate that next.

I ran into this too, I initially was getting similar times for both and was going to make a note of that in my PR, but then when I started testing it again right before submitting the PR I was getting 15s for regular and 8s for speculative so I removed the note about performance. There's probably some ways to unlock faster perf but MLX is new territory for me so I'm not sure what to try. :) Prefill the draft model on CPU while prefilling big model on GPU? Idk haha.

Ok, so I made a bunch of changes. The two big ones being:

Switch to use T5 like the original paper. It has two nice properties: first a very small draft model (30M) and second the tasks tend to be a lot more constrained (encoder-decoder style) so speculative decoding seems to work better.
Using the original accept reject criteria based on the model and draft model probabilities.

I think we can merge this as an example as it's pretty cool. A big thing to figure out would be if / how we can use it for more open ended text generation.  I'll leave that as a future endeavor!


Add more information to error log

This PR closes #167939342, by:
I didn't reproduce it, so I added more information to the log to understand why is that happening, which field is generating the error, and which is the value before being cleaned...

From the different occurrences of the error (found that it happens in signup email/phone, and also in profile edit)... I could reproduce it by cleaning up one of the fields (in edit, deleting the username, it triggered the error)


I can't edit pydpiper.service file

Hi,
My system RPI3,alloboss dac and volumio V 2.575
Pydpiper app. Installation Instructions step1 ok but step2 unsuccessful.
How can I edit the pydpiper.service file step by step.I'm a beginner for linux.
Thanks.....

Hi,
I solved with chmod :)


Go to between notebooks and .py files

Since the editorLangId for notebooks and python files is the same, I am re-using the same (one) command to do the switching. The way I check if we're in the notebook is by checking the vscode.window.activeNotebookEditor which will be set if it's notebook and undefined otherwise.
The rest of the code should be self-explanatory (I included a bunch of comments). I'll try to add some tests in tomorrow.

Hi @hamelsmu ! I came across your bounty when searching for VSCode integration with nbdev, and that led me to this fresh PR from @peterj. (Thanks @peterj!)  I'm sold on nbdev, but thanks to CoPilot and many other reasons, I'm nervous about using or recommending NBDev outside of my team's precious VSCode environment. It looks like you're working on making this better, and I am just dropping a note to say thank you, and express my interest. :)  Is there anything major holding this PR back at the moment?

Nothing holding it back just my slowness :) I'm a bit occupied this week but hope to get to it next week.  I suspect there isn't anything special needed to merge the PR as I already tested it.  I just wanted to also publish the package etc
Please note that this is very exploratory and I'm learning myself :) I don't know what direction this might go in


libpython path/name issue (with solution)

The codon uses libpython.so as the default python library. However, there is a path/name issue among Linux distributions. For example, Debian (11) uses specific name libpython3.9.so rather than libpython.so. Currently, I set up a soft-link for this issue:
ln -s /usr/lib/x86_64-linux-gnu/libpython3.9.so /usr/lib/x86_64-linux-gnu/libpython.so

You can also set the environment variable CODON_PYTHON to point to the correct shared library (docs):
export CODON_PYTHON=/usr/lib/x86_64-linux-gnu/libpython3.9.so


Enable UsernameOnlyAccountManager to support OAuth

Fixes email verification failure in UsernameOnlyAccountManager during OAuth by supporting the Email field.

For web use case:

Add email field in login page
Store the entered email in the cookie for further use

For CLI use case:

enable setting UserEmail = <email> in cvdr.toml to configure the email in UsernameOnlyUser. For example:

Authn = {
  HTTPBasicAuthn = {
    UsernameSrc = "unix",
    UserEmail = <Account used for OAuth>
  }
}

We've decided to obtain and manage access tokens using cvdr (#348). We don't need this for now.


Allow gzip compression in high-level server response interface

This is a feature request.  The StreamResponse class only allows deflate compression and requires setting the header manually.  It would be useful to allow the use of gzip and perhaps set the header automatically.
I could work on this if you like.  Maybe just a new encoding kwarg to StreamResponse.enable_compression?

Sounds good!

Fixed in #403


Append new authorized user to blossom-ci whitelist [skip ci]

Signed-off-by: Navin Kumar<EMAIL_ADDRESS>

build


Small improvements to import performance

The easiest wins from #7423 - avoiding any imports of pydantic.deprecated at import time.
Selected Reviewer: @davidhewitt

please review

This reduced import time for me on Windows by ~8-9 ms


[Datafactory] Added SQL DW Copy Command support in Copy Activity

You forgot to check in new models such as DWCopyCommandSettings.cs

@isra-fel , sorry for missing the two files, which have been added.


RuntimeError: "LayerNormKernelImpl" not implemented for 'Half'

I followed the installation instructions and got everything installed, but when I launch A1111 Web UI and enter a txt2img prompt, I receive RuntimeError: "LayerNormKernelImpl" not implemented for 'Half' in the bottom right corner and it does not return any images.
I am on Windows 10 with an AMD GPU and using PS 2023.

this is issue seems more related to automatic1111:
you could try disabling "half" implementation. you should try adding the following args, in the same way you've added --api:
--skip-torch-cuda-test --precision full --no-half


Add separate blog page

This PR focuses on cleaning up the frontpage by reducing the number of displayed blogposts, instead opting for a separate blog page that lists all entries.
This is a first step which will soon be followed by adding some more WG-related information to improve on-boarding for the WG's meetings and Github Issues. I thought it better to split PRs so people can review them individually.

I'm for the general idea of this PR (the front page is going to get very long if we don't split stuff up a bit!), but I do have a few things that I think need resolving first:

Changing the URLs will break all of the existing links to the site on Twitter and Reddit, which wouldn't be great. Either the URLs should stay the same, or you'll need to go through and add aliases for each existing post so that Zola will generate redirects.

Similarly, please don't remove all of the existing aliases!

I don't think adding transparent = true to a post actually does anything - Zola's docs only mention it in the context of a section (_index.md) file. I might be wrong though.
Could the markup for post lists be extracted out into a macro so it's not duplicated in multiple pages?

If you're not familiar enough with Tera/Zola to do this, it's fine - I can pick it up as a seperate PR.

Also, a couple of styling nitpicks:

I think the @import "./minima" that's been added is redundant - the root file already brings it into scope. The inline-block on .post-link also doesn't seem to do anything.
safe is special-cased by Tera, so you have to use it as the last filter in the chain - it needs to look like this, otherwise you'll lose some of the apostrophes and stuff in the output:

{{ post.description | default(value=post.content | striptags | trim | truncate(length=max_length)) | safe }}

Also, here's some screenshots if other people don't want to build the branch locally:

@17cupsofcoffee Thanks for the review. To answer your questions:

Changing the URLs will break all of the existing links to the site on Twitter and Reddit, which wouldn't be great. Either the URLs should stay the same, or you'll need to go through and add aliases for each existing post so that Zola will generate redirects.
Similarly, please don't remove all of the existing aliases!

Sorry, that's my bad. I tried using the alias url's locally, but they weren't directing me anywhere, so thought it might be incorrect. I will fix them and make sure that the links still work by trying some of RustGamedev's tweets.

I don't think adding transparent = true to a post actually does anything - Zola's docs only mention it in the context of a section (_index.md) file. I might be wrong though.

It actually does. Since the newsletters are all grouped in folders, when you create a new section and request {% for post in section.pages %}, it won't actually include the _index.md files in the subdirectories unless transparent = true.

Could the markup for post lists be extracted out into a macro so it's not duplicated in multiple pages?

I've never used tera until now, but I'm figuring it out so far. Will give it a try.

I think the @import "./minima" that's been added is redundant - the root file already brings it into scope.

I'll see if I can remove it.

The inline-block on .post-link also doesn't seem to do anything.

There is actually a difference. inline-block will limit the clicking rectangle to the width and height of the text lines, whereas block will occupy the full width of the parent container. So on mobile you still get the nice clicking experience, while on tablet/PC you won't be directed to another page just because you clicked on a piece of whitespace far to the right from the title/link.
inline-block:

block:

safe is special-cased by Tera, so you have to use it as the last filter in the chain - it needs to look like this, otherwise you'll lose some of the apostrophes and stuff in the output:
{{ post.description | default(value=post.content | striptags | trim | truncate(length=max_length)) | safe }}

The documentation I read mentioned preceding striptags with safe.

@17cupsofcoffee I'm pretty sure I addressed all of your requested changes in the above three commits. If/when you are happy with them, I can git rebase the commits into the original changes to make history concise.

Cool, I'll take a look at the changes now :)

It actually does. Since the newsletters are all grouped in folders, when you create a new section and request {% for post in section.pages %}, it won't actually include the _index.md files in the subdirectories unless transparent = true.

Ah, I thought that only affected _index.md files, not index.md. I'll take your word for it :)

There is actually a difference.

D'oh, you're right. Ignore me :)

(I still don't know if I think the change from /posts to /blog is entirely neccecary - I think I'm missing the context of what extra content you/the WG are hoping to add in future, though.)

The reason I did that is because I added the /blog page that lists all blogs. That naming made most sense to me. At that point you cannot just redirect to the /posts to reach all md articles underneath that namespace - I think.
I can also just put everything under /posts, but it seemed to make most sense if people can just type rust-gamedev.github.io/blog.
The bigger change that I was planning was to add some information on how people can contribute to the WG and where to find appropriate information on the home page. Now you have to go through 3 or more layers before you actually find the necessary information, at which point - I am afraid - you will already have lost a lot of potential contributors 😅

Ah, that makes sense, I definitely like the idea of there being some contributing info/extra links on the homepage.

I can also just put everything under /posts, but it seemed to make most sense if people can just type rust-gamedev.github.io/blog.

I would be fine with either option - let's see what the other people tagged in think 🙂

I just resolved your only remaining comment. Let's wait and see what the others think. Then I'll fix problems accordingly and rebase to clean up the history a bit.

@ozkriff just checking to see whether you had any additional comments?

I don't really feel that section renaming and summaries are worth it, but I'm fine with these changes.

Would you rather only show titles?

Would you rather only show titles?

@Wodann Initially I decided not to use summaries for the newsletter because it seems to me that every issue has too many changes from too many projects to meaningfully summarise all that in any other way except for rephrasing "Here're some updates about rust games, libraries, and other tools".

@ozkriff @17cupsofcoffee After having a discussion with @ozkriff I decide to greatly minimize the set of changes. I also reverted back to usage of posts instead of blog just to simplify this PR.
The PR now merely minimises styling on the front page by only listing the latest three posts and adds a button that redirects to a complete listing of all posts. For styling we might want to consider doing something similar to Rust - in the future.

For reference, this is how the homepage looks now:

And this is the complete listing of all posts - on a separate page:

:timer_clock: Merging this tomorrow if there're no objections

One last tweak that might be nice to do before merging - could you add transparent = true to the newsletter template in the root of the directory?

Well-spotted. I'll fix that.

I wouldn't be opposed to styling changes if someone came up with a good design.

Nor would I. Design just never came as naturally to me as programming 😬

I added transparent = true to the newsletter template. The PR should be ready to merge now.

Merged!


calico 3.1.0 error calling getv: key does not exist

My setup running on virtualbox:
calico 3.1.0
k8s 1.10.1
etcd 3.2.18
centos7
default calico configs and manifests from docs
3 master nodes and 1 worker
kubm1.dev, kubm2.dev, kubm3.dev
kubw1.dev
Today when I started cluster for usual workflow everything worked but then in some amount of time, I've noticed that all my apps which require internal k8s networking are in CrashLoopBack (some php app, k8s-dashboard, coredns)
CoreDns can't reach api servers clusters.
I looked into calico logs and discovered never ending error log.
Restarting cluster helps for a few minutes then errors in calico are starting again.
Something triggers calico config update.
here is log output
https://pastebin.com/uLqDTUp8
For last few days I have not touched anything related to k8s networking or infrastructure.
I assume that something got corrupted because of often cluster shutdowns.
Absolutely same cluster setup is running as "production" sandbox environment without any issues

Have you verified your etcd cluster is healthy and not corrupted and all 3 are still clustered together?
I see 2018-04-17 09:35:13.415 [WARNING][62] felix.go 933: Config change requires restart key="IpInIpTunnelAddr" old="<IP_ADDRESS>" updateType="delete" in the pastebin that think the etcd endpoints might not be clustered together.  It may look like that key was removed if it is written to one etcd and then it later reads from a different one (and they aren't clustered or are degraded).

I'm sorry,
Because of urgency I had to destroy and rebuild this cluster. I haven't looked into etcd itself for health status.
Only thing I did, except monitoring logs for some time, was looking at kubectl get componentstatus which was showing everything as healthy.
Only assumption I have was - corrupted etcd.
Rebuilding exactly same setup doesn't has this issue.
Posted this issue just in case if you guys could notice something more important.
Closing this issue.


#995: Pkg - cards starter page.

@xak - everything is there for the starter page, but i cannot get the icons to render. can you please let me know what's missing.

@saadmhybris There are no files changed here, see https://github.com/SAP/techne/pull/1017

strange... most of my changes didn't get pushed for some reason...
closing this since we have another PR with a complete feature.


Cannot find module '../src/services'

After installing this package, and running node ace configure adonis-sail, I get this errror thrown:
Cannot find module '../src/services'
Require stack:
-<EMAIL_ADDRESS>
Which makes sense - in /node_modules/adonis-sail/build/commands/InstallSail.js, there is a line that requires the file const services_1 = require("../src/services");, but this file is not included in the NPM package:

If it is just a case of adding the services folder to the package JSON files array, I can create a PR to do this...

Works great now - thanks! 🙌