From a470ef403dcbb7197512ab9a71c134c7daa03625 Mon Sep 17 00:00:00 2001 From: KtorZ Date: Fri, 12 Jul 2024 10:19:59 +0200 Subject: [PATCH] Ignore AsyncCancelled exception for the ex-units evaluator Client protocols implements some internal try-catch logic with recovery to allow recovering from codecs errors and incompatibility with the node. Yet, this was wrongly catching async cancellation on the special clients that are spun up concurrently for handling transaction evaluations; causing them to stay alive and pile up over time. This commits also adds the total number of active connections to the dashboard, which would have helped noticing that earlier. Fixes #403. --- CHANGELOG.md | 4 +- server/dashboard/dashboard.html | 16 +++++- server/dashboard/yarn.lock | 83 +----------------------------- server/src/Ogmios/App/Protocol.hs | 14 +++-- server/static/dashboard.html | 2 +- server/static/favicon.png | Bin 1808 -> 2937 bytes 6 files changed, 31 insertions(+), 88 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70be10e2d5..4bf840440e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ layout: changelog pre: "5. " --- -### [6.5.0] - UNRELEASED +### [6.5.0] - 2024-07-12 ### Added @@ -98,6 +98,8 @@ $$ - Roll back down to GHC-9.4.8 in an attempt to fix [#399](https://github.com/CardanoSolutions/ogmios/issues/399) possibly caused by a bug in GHC runtime system (possibly patched on 9.4.x). +- Fixed transaction evaluation internal client not being properly terminated and cleaned up after use; resulting in active connections piling up over time. See [#403](https://github.com/CardanoSolutions/ogmios/issues/399). + - Fixed the reported `activeStakeInEpoch` on the `queryLedgerState/rewardsProvenance`, which was mistakenly reporting the `totalStakeInEpoch`. A new value `totalStakeInEpoch` also now correctly reports that information. #### Removed diff --git a/server/dashboard/dashboard.html b/server/dashboard/dashboard.html index 977730e176..e8f6effd09 100644 --- a/server/dashboard/dashboard.html +++ b/server/dashboard/dashboard.html @@ -152,6 +152,19 @@
+
+
+ + + + + Active clients +
+
+ ? +
+
+
@@ -194,10 +207,11 @@ status.classList.add('label-error'); } - sel('#last-update').innerText = (health.lastKnownTip || {}).slot || '?'; + sel('#last-update').innerText = health.lastKnownTip?.slot ?? '?'; sel('#last-update').setAttribute('data-badge', lastUpdate(health.lastTipUpdate)); sel('#network-synchronization').setAttribute('data-badge', percentage(health.networkSynchronization)); sel('#network-synchronization').innerText = health.network; + sel('#active-connections').innerText = health.metrics?.activeConnections ?? '?'; sel('#version').innerText = `-${health.version}` all('.era').forEach(era => { const currentEra = (health.currentEra || "Byron").toLowerCase(); diff --git a/server/dashboard/yarn.lock b/server/dashboard/yarn.lock index c8c52a36f2..be0fd17995 100644 --- a/server/dashboard/yarn.lock +++ b/server/dashboard/yarn.lock @@ -831,11 +831,6 @@ abortcontroller-polyfill@^1.1.9: resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1010,13 +1005,6 @@ domelementtype@^2.0.1, domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" - integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== - dependencies: - domelementtype "^2.0.1" - domhandler@^4.2.0, domhandler@^4.2.2, domhandler@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" @@ -1024,7 +1012,7 @@ domhandler@^4.2.0, domhandler@^4.2.2, domhandler@^4.3.1: dependencies: domelementtype "^2.2.0" -domutils@^2.4.2, domutils@^2.8.0: +domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== @@ -1070,11 +1058,6 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-goat@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-3.0.0.tgz#e8b5fb658553fe8a3c4959c316c6ebb8c842b19c" - integrity sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw== - escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -1128,16 +1111,6 @@ htmlnano@^2.0.0: posthtml "^0.16.5" timsort "^0.3.0" -htmlparser2@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-5.0.1.tgz#7daa6fc3e35d6107ac95a4fc08781f091664f6e7" - integrity sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ== - dependencies: - domelementtype "^2.0.1" - domhandler "^3.3.0" - domutils "^2.4.2" - entities "^2.0.0" - htmlparser2@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" @@ -1304,11 +1277,6 @@ micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" -mime@^2.4.6: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - msgpackr-extract@^3.0.1, msgpackr-extract@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz#e05ec1bb4453ddf020551bcd5daaf0092a2c279d" @@ -1347,13 +1315,6 @@ node-addon-api@^7.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.0.0.tgz#8136add2f510997b3b94814f4af1cce0b0e3962e" integrity sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA== -node-fetch@^2.6.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" - integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== - dependencies: - whatwg-url "^5.0.0" - node-gyp-build-optional-packages@5.0.6: version "5.0.6" resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.6.tgz#2949f5cc7dace3ac470fa2ff1a37456907120a1d" @@ -1386,13 +1347,6 @@ ordered-binary@^1.4.0: resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.4.1.tgz#205cb6efd6c27fa0ef4eced994a023e081cdc911" integrity sha512-9LtiGlPy982CsgxZvJGNNp2/NnrgEr6EAyN3iIEP3/8vd3YLgAZQHbQ75ZrkfBRGrNg37Dk3U6tuVb+B4Xfslg== -parcel-plugin-inliner@^1.0.16: - version "1.0.16" - resolved "https://registry.yarnpkg.com/parcel-plugin-inliner/-/parcel-plugin-inliner-1.0.16.tgz#0c7c3f71bcbc6bb45564a642104312b3da9ed72b" - integrity sha512-2HQUmGshACIPO2paraojM79sII1p3kkUQ6IfCVuiO0RyLYta2nQ4y2w/X1Y0RaL1txshJQj3QptCB+R9JEVmgQ== - dependencies: - posthtml-inline-assets "^3.1.0" - parcel@^2.9.3: version "2.9.3" resolved "https://registry.yarnpkg.com/parcel/-/parcel-2.9.3.tgz#315660ccbaa5a830cf71280ab0cfbd3079247cc5" @@ -1583,11 +1537,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - tslib@^2.4.0: version "2.6.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" @@ -1611,41 +1560,11 @@ utility-types@^3.10.0: resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== -valid-data-url@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/valid-data-url/-/valid-data-url-3.0.1.tgz#826c1744e71b5632e847dd15dbd45b9fb38aa34f" - integrity sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA== - weak-lru-cache@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz#fdbb6741f36bae9540d12f480ce8254060dccd19" integrity sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw== -web-resource-inliner@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz#df0822f0a12028805fe80719ed52ab6526886e02" - integrity sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A== - dependencies: - ansi-colors "^4.1.1" - escape-goat "^3.0.0" - htmlparser2 "^5.0.0" - mime "^2.4.6" - node-fetch "^2.6.0" - valid-data-url "^3.0.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - xxhash-wasm@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz#752398c131a4dd407b5132ba62ad372029be6f79" diff --git a/server/src/Ogmios/App/Protocol.hs b/server/src/Ogmios/App/Protocol.hs index 2b2bb01f26..8facdb8789 100644 --- a/server/src/Ogmios/App/Protocol.hs +++ b/server/src/Ogmios/App/Protocol.hs @@ -22,6 +22,10 @@ import GHC.Generics ) import Ogmios.Control.Exception ( MonadCatch (..) + , MonadThrow (..) + ) +import Ogmios.Control.MonadAsync + ( AsyncCancelled (..) ) import Ogmios.Data.EraTranslation ( MultiEraUTxO @@ -193,6 +197,10 @@ defaultWithInternalError defaultWithInternalError reportException opts continue yield toResponse = do handle $ \(e :: SomeException) -> do let (Rpc.Response _ mirror _) = toResponse (error "unused and unevaluated") - reportException e - yield $ Rpc.ko opts $ Rpc.internalError mirror (displayException e) - continue + case fromException e of + Just AsyncCancelled -> + throwIO e + _ -> do + yield $ Rpc.ko opts $ Rpc.internalError mirror (displayException e) + reportException e + continue diff --git a/server/static/dashboard.html b/server/static/dashboard.html index 734ec40e83..2a9cc668cd 100644 --- a/server/static/dashboard.html +++ b/server/static/dashboard.html @@ -1,3 +1,3 @@ Ogmios

Ho no, the situation is catastrophic!

The dashboard is unable to connect to the server. Try to refresh the page, and if the error persists, please contact project maintainers with the following details:

  
Entrypoints
A brief summary of the server's entrypoints.
Health
Check here if Ogmios is connecting to your node and if your node is correctly syncing with the network.
Status
?
Last known tip
Network
Memory Usage
Real-time view of Ogmios heap size. This should remain relatively low.
\ No newline at end of file +.form-autocomplete{position:relative}.form-autocomplete .form-autocomplete-input{flex-wrap:wrap;align-content:flex-start;height:auto;min-height:1.6rem;padding:.1rem;display:flex}.form-autocomplete .form-autocomplete-input.is-focused{border-color:#5755d9;box-shadow:0 0 0 .1rem #5755d933}.form-autocomplete .form-autocomplete-input .form-input{box-shadow:none;border-color:#0000;flex:1 0 auto;width:auto;height:1.2rem;margin:.1rem;line-height:.8rem;display:inline-block}.form-autocomplete .menu{width:100%;position:absolute;top:100%;left:0}.form-autocomplete.autocomplete-oneline .form-autocomplete-input{flex-wrap:nowrap;overflow-x:auto}.form-autocomplete.autocomplete-oneline .chip{flex:1 0 auto}.calendar{border:.05rem solid #dadee4;border-radius:.1rem;min-width:280px;display:block}.calendar .calendar-nav{background:#f7f8f9;border-top-left-radius:.1rem;border-top-right-radius:.1rem;align-items:center;padding:.4rem;font-size:.9rem;display:flex}.calendar .calendar-body,.calendar .calendar-header{flex-wrap:wrap;justify-content:center;padding:.4rem 0;display:flex}.calendar .calendar-body .calendar-date,.calendar .calendar-header .calendar-date{flex:0 0 14.28%;max-width:14.28%}.calendar .calendar-header{color:#bcc3ce;text-align:center;background:#f7f8f9;border-bottom:.05rem solid #dadee4;font-size:.7rem}.calendar .calendar-body{color:#66758c}.calendar .calendar-date{border:0;padding:.2rem}.calendar .calendar-date .date-item{appearance:none;color:#66758c;cursor:pointer;text-align:center;vertical-align:middle;white-space:nowrap;background:0 0;border:.05rem solid #0000;border-radius:50%;outline:0;width:1.4rem;height:1.4rem;padding:.1rem;font-size:.7rem;line-height:1rem;text-decoration:none;transition:background .2s,border .2s,box-shadow .2s,color .2s;position:relative}.calendar .calendar-date .date-item.date-today{color:#5755d9;border-color:#e5e5f9}.calendar .calendar-date .date-item:focus{box-shadow:0 0 0 .1rem #5755d933}.calendar .calendar-date .date-item:focus,.calendar .calendar-date .date-item:hover{color:#5755d9;background:#fefeff;border-color:#e5e5f9;text-decoration:none}.calendar .calendar-date .date-item.active,.calendar .calendar-date .date-item:active{color:#fff;background:#4b48d6;border-color:#3634d2}.calendar .calendar-date .date-item.badge:after{position:absolute;top:3px;right:3px;transform:translate(50%,-50%)}.calendar .calendar-date .calendar-event.disabled,.calendar .calendar-date .calendar-event:disabled,.calendar .calendar-date .date-item.disabled,.calendar .calendar-date .date-item:disabled{cursor:default;opacity:.25;pointer-events:none}.calendar .calendar-date.next-month .calendar-event,.calendar .calendar-date.next-month .date-item,.calendar .calendar-date.prev-month .calendar-event,.calendar .calendar-date.prev-month .date-item{opacity:.25}.calendar .calendar-range{position:relative}.calendar .calendar-range:before{content:"";background:#f1f1fc;height:1.4rem;position:absolute;top:50%;left:0;right:0;transform:translateY(-50%)}.calendar .calendar-range.range-start:before{left:50%}.calendar .calendar-range.range-end:before{right:50%}.calendar .calendar-range.range-end .date-item,.calendar .calendar-range.range-start .date-item{color:#fff;background:#4b48d6;border-color:#3634d2}.calendar .calendar-range .date-item{color:#5755d9}.calendar.calendar-lg .calendar-body{padding:0}.calendar.calendar-lg .calendar-body .calendar-date{border-bottom:.05rem solid #dadee4;border-right:.05rem solid #dadee4;flex-direction:column;height:5.5rem;padding:0;display:flex}.calendar.calendar-lg .calendar-body .calendar-date:nth-child(7n){border-right:0}.calendar.calendar-lg .calendar-body .calendar-date:nth-last-child(-n+7){border-bottom:0}.calendar.calendar-lg .date-item{align-self:flex-end;height:1.4rem;margin-top:.2rem;margin-right:.2rem}.calendar.calendar-lg .calendar-range:before{top:19px}.calendar.calendar-lg .calendar-range.range-start:before{width:19px;left:auto}.calendar.calendar-lg .calendar-range.range-end:before{right:19px}.calendar.calendar-lg .calendar-events{flex-grow:1;padding:.2rem;line-height:1;overflow-y:auto}.calendar.calendar-lg .calendar-event{text-overflow:ellipsis;white-space:nowrap;border-radius:.1rem;margin:.1rem auto;padding:3px 4px;font-size:.7rem;display:block;overflow:hidden}.carousel .carousel-locator:first-of-type:checked~.carousel-container .carousel-item:first-of-type,.carousel .carousel-locator:nth-of-type(2):checked~.carousel-container .carousel-item:nth-of-type(2),.carousel .carousel-locator:nth-of-type(3):checked~.carousel-container .carousel-item:nth-of-type(3),.carousel .carousel-locator:nth-of-type(4):checked~.carousel-container .carousel-item:nth-of-type(4),.carousel .carousel-locator:nth-of-type(5):checked~.carousel-container .carousel-item:nth-of-type(5),.carousel .carousel-locator:nth-of-type(6):checked~.carousel-container .carousel-item:nth-of-type(6),.carousel .carousel-locator:nth-of-type(7):checked~.carousel-container .carousel-item:nth-of-type(7),.carousel .carousel-locator:nth-of-type(8):checked~.carousel-container .carousel-item:nth-of-type(8){opacity:1;z-index:100;animation:.75s ease-in-out carousel-slidein}.carousel .carousel-locator:first-of-type:checked~.carousel-nav .nav-item:first-of-type,.carousel .carousel-locator:nth-of-type(2):checked~.carousel-nav .nav-item:nth-of-type(2),.carousel .carousel-locator:nth-of-type(3):checked~.carousel-nav .nav-item:nth-of-type(3),.carousel .carousel-locator:nth-of-type(4):checked~.carousel-nav .nav-item:nth-of-type(4),.carousel .carousel-locator:nth-of-type(5):checked~.carousel-nav .nav-item:nth-of-type(5),.carousel .carousel-locator:nth-of-type(6):checked~.carousel-nav .nav-item:nth-of-type(6),.carousel .carousel-locator:nth-of-type(7):checked~.carousel-nav .nav-item:nth-of-type(7),.carousel .carousel-locator:nth-of-type(8):checked~.carousel-nav .nav-item:nth-of-type(8){color:#f7f8f9}.carousel{-webkit-overflow-scrolling:touch;z-index:1;background:#f7f8f9;width:100%;display:block;position:relative;overflow:hidden}.carousel .carousel-container{height:100%;position:relative;left:0}.carousel .carousel-container:before{content:"";padding-bottom:56.25%;display:block}.carousel .carousel-container .carousel-item{opacity:0;width:100%;height:100%;margin:0;animation:1s ease-in-out carousel-slideout;position:absolute;top:0;left:0}.carousel .carousel-container .carousel-item:hover .item-next,.carousel .carousel-container .carousel-item:hover .item-prev{opacity:1}.carousel .carousel-container .item-next,.carousel .carousel-container .item-prev{color:#f7f8f9;opacity:0;z-index:100;background:#f7f8f940;border-color:#f7f8f980;transition:all .4s;position:absolute;top:50%;transform:translateY(-50%)}.carousel .carousel-container .item-prev{left:1rem}.carousel .carousel-container .item-next{right:1rem}.carousel .carousel-nav{z-index:100;justify-content:center;width:10rem;display:flex;position:absolute;bottom:.4rem;left:50%;transform:translate(-50%)}.carousel .carousel-nav .nav-item{color:#f7f8f980;flex:1 0 auto;max-width:2.5rem;height:1.6rem;margin:.2rem;display:block;position:relative}.carousel .carousel-nav .nav-item:before{content:"";background:currentColor;width:100%;height:.1rem;display:block;position:absolute;top:.5rem}@keyframes carousel-slidein{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes carousel-slideout{0%{opacity:1;transform:translate(0)}to{opacity:1;transform:translate(-50%)}}.comparison-slider{-webkit-overflow-scrolling:touch;width:100%;height:50vh;position:relative;overflow:hidden}.comparison-slider .comparison-after,.comparison-slider .comparison-before{height:100%;margin:0;position:absolute;top:0;left:0;overflow:hidden}.comparison-slider .comparison-after img,.comparison-slider .comparison-before img{object-fit:cover;object-position:left center;width:100%;height:100%;position:absolute}.comparison-slider .comparison-before{z-index:1;width:100%}.comparison-slider .comparison-before .comparison-label{right:.8rem}.comparison-slider .comparison-after{z-index:2;min-width:0;max-width:100%}.comparison-slider .comparison-after:before{content:"";cursor:default;z-index:1;background:0 0;height:100%;position:absolute;top:0;left:0;right:.8rem}.comparison-slider .comparison-after:after{color:#fff;content:"";pointer-events:none;background:currentColor;border-radius:50%;width:3px;height:3px;position:absolute;top:50%;right:.4rem;transform:translate(50%,-50%);box-shadow:0 -5px,0 5px}.comparison-slider .comparison-after .comparison-label{left:.8rem}.comparison-slider .comparison-resizer{cursor:ew-resize;opacity:0;resize:horizontal;outline:0;width:0;min-width:.8rem;max-width:100%;height:.8rem;animation:1.5s ease-in-out first-run;position:relative;top:50%;left:0;transform:translateY(-50%)scaleY(30)}.comparison-slider .comparison-label{color:#fff;-webkit-user-select:none;user-select:none;background:#30374280;padding:.2rem .4rem;position:absolute;bottom:.8rem}@keyframes first-run{0%{width:0}25%{width:2.4rem}50%{width:.8rem}75%{width:1.2rem}to{width:0}}.filter .filter-tag#tag-0:checked~.filter-nav .chip[for=tag-0],.filter .filter-tag#tag-1:checked~.filter-nav .chip[for=tag-1],.filter .filter-tag#tag-2:checked~.filter-nav .chip[for=tag-2],.filter .filter-tag#tag-3:checked~.filter-nav .chip[for=tag-3],.filter .filter-tag#tag-4:checked~.filter-nav .chip[for=tag-4],.filter .filter-tag#tag-5:checked~.filter-nav .chip[for=tag-5],.filter .filter-tag#tag-6:checked~.filter-nav .chip[for=tag-6],.filter .filter-tag#tag-7:checked~.filter-nav .chip[for=tag-7],.filter .filter-tag#tag-8:checked~.filter-nav .chip[for=tag-8]{color:#fff;background:#5755d9}.filter .filter-tag#tag-1:checked~.filter-body .filter-item:not([data-tag~=tag-1]),.filter .filter-tag#tag-2:checked~.filter-body .filter-item:not([data-tag~=tag-2]),.filter .filter-tag#tag-3:checked~.filter-body .filter-item:not([data-tag~=tag-3]),.filter .filter-tag#tag-4:checked~.filter-body .filter-item:not([data-tag~=tag-4]),.filter .filter-tag#tag-5:checked~.filter-body .filter-item:not([data-tag~=tag-5]),.filter .filter-tag#tag-6:checked~.filter-body .filter-item:not([data-tag~=tag-6]),.filter .filter-tag#tag-7:checked~.filter-body .filter-item:not([data-tag~=tag-7]),.filter .filter-tag#tag-8:checked~.filter-body .filter-item:not([data-tag~=tag-8]){display:none}.filter .filter-nav{margin:.4rem 0}.filter .filter-body{flex-wrap:wrap;display:flex}.meter{appearance:none;background:#f7f8f9;border:0;border-radius:.1rem;width:100%;height:.8rem;display:block}.meter::-webkit-meter-inner-element{display:block}:is(){border-radius:.1rem}.meter::-webkit-meter-bar{background:#f7f8f9}.meter::-webkit-meter-optimum-value{background:#32b643}.meter::-webkit-meter-suboptimum-value{background:#ffb700}.meter::-webkit-meter-even-less-good-value{background:#e85600}.meter:-moz-meter-optimum{border-radius:.1rem}.meter:-moz-meter-sub-optimum{border-radius:.1rem}.meter:-moz-meter-sub-sub-optimum{border-radius:.1rem}.meter::-moz-meter-bar{border-radius:.1rem}.meter:-moz-meter-optimum::-moz-meter-bar{background:#32b643}.meter:-moz-meter-sub-optimum::-moz-meter-bar{background:#ffb700}.meter:-moz-meter-sub-sub-optimum::-moz-meter-bar{background:#e85600}.off-canvas{flex-flow:row;width:100%;height:100%;display:flex;position:relative}.off-canvas .off-canvas-toggle{z-index:1;transition:none;display:block;position:absolute;top:.4rem;left:.4rem}.off-canvas .off-canvas-sidebar{z-index:200;background:#f7f8f9;min-width:10rem;transition:transform .25s;position:fixed;top:0;bottom:0;left:0;overflow-y:auto;transform:translate(-100%)}.off-canvas .off-canvas-content{flex:auto;height:100%;padding:.4rem .4rem .4rem 4rem}.off-canvas .off-canvas-overlay{background:#3037421a;border-color:#0000;border-radius:0;width:100%;height:100%;display:none;position:fixed;inset:0}.off-canvas .off-canvas-sidebar.active,.off-canvas .off-canvas-sidebar:target{transform:translate(0)}.off-canvas .off-canvas-sidebar.active~.off-canvas-overlay,.off-canvas .off-canvas-sidebar:target~.off-canvas-overlay{z-index:100;display:block}@media (width>=960px){.off-canvas.off-canvas-sidebar-show .off-canvas-toggle{display:none}.off-canvas.off-canvas-sidebar-show .off-canvas-sidebar{flex:none;position:relative;transform:none}.off-canvas.off-canvas-sidebar-show .off-canvas-overlay{display:none!important}}.parallax{width:auto;height:auto;display:block;position:relative}.parallax .parallax-content{transform-style:preserve-3d;width:100%;height:auto;transition:all .4s;transform:perspective(1000px);box-shadow:0 1rem 2.1rem #3037424d}.parallax .parallax-content:before{content:"";width:100%;height:100%;display:block;position:absolute;top:0;left:0}.parallax .parallax-front{color:#fff;text-align:center;text-shadow:0 0 20px #303742bf;z-index:1;justify-content:center;align-items:center;width:100%;height:100%;transition:transform .4s;display:flex;position:absolute;top:0;left:0;transform:translateZ(50px)scale(.95)}.parallax .parallax-top-left{z-index:100;outline:0;width:50%;height:50%;position:absolute;top:0;left:0}.parallax .parallax-top-left:focus~.parallax-content,.parallax .parallax-top-left:hover~.parallax-content{transform:perspective(1000px)rotateX(3deg)rotateY(-3deg)}.parallax .parallax-top-left:focus~.parallax-content:before,.parallax .parallax-top-left:hover~.parallax-content:before{background:linear-gradient(135deg,#ffffff59 0,#0000 50%)}.parallax .parallax-top-left:focus~.parallax-content .parallax-front,.parallax .parallax-top-left:hover~.parallax-content .parallax-front{transform:translate3d(4.5px,4.5px,50px)scale(.95)}.parallax .parallax-top-right{z-index:100;outline:0;width:50%;height:50%;position:absolute;top:0;right:0}.parallax .parallax-top-right:focus~.parallax-content,.parallax .parallax-top-right:hover~.parallax-content{transform:perspective(1000px)rotateX(3deg)rotateY(3deg)}.parallax .parallax-top-right:focus~.parallax-content:before,.parallax .parallax-top-right:hover~.parallax-content:before{background:linear-gradient(-135deg,#ffffff59 0,#0000 50%)}.parallax .parallax-top-right:focus~.parallax-content .parallax-front,.parallax .parallax-top-right:hover~.parallax-content .parallax-front{transform:translate3d(-4.5px,4.5px,50px)scale(.95)}.parallax .parallax-bottom-left{z-index:100;outline:0;width:50%;height:50%;position:absolute;bottom:0;left:0}.parallax .parallax-bottom-left:focus~.parallax-content,.parallax .parallax-bottom-left:hover~.parallax-content{transform:perspective(1000px)rotateX(-3deg)rotateY(-3deg)}.parallax .parallax-bottom-left:focus~.parallax-content:before,.parallax .parallax-bottom-left:hover~.parallax-content:before{background:linear-gradient(45deg,#ffffff59 0,#0000 50%)}.parallax .parallax-bottom-left:focus~.parallax-content .parallax-front,.parallax .parallax-bottom-left:hover~.parallax-content .parallax-front{transform:translate3d(4.5px,-4.5px,50px)scale(.95)}.parallax .parallax-bottom-right{z-index:100;outline:0;width:50%;height:50%;position:absolute;bottom:0;right:0}.parallax .parallax-bottom-right:focus~.parallax-content,.parallax .parallax-bottom-right:hover~.parallax-content{transform:perspective(1000px)rotateX(-3deg)rotateY(3deg)}.parallax .parallax-bottom-right:focus~.parallax-content:before,.parallax .parallax-bottom-right:hover~.parallax-content:before{background:linear-gradient(-45deg,#ffffff59 0,#0000 50%)}.parallax .parallax-bottom-right:focus~.parallax-content .parallax-front,.parallax .parallax-bottom-right:hover~.parallax-content .parallax-front{transform:translate3d(-4.5px,-4.5px,50px)scale(.95)}.progress{appearance:none;color:#5755d9;background:#eef0f3;border:0;border-radius:.1rem;width:100%;height:.2rem;position:relative}.progress::-webkit-progress-bar{background:0 0;border-radius:.1rem}.progress::-webkit-progress-value{background:#5755d9;border-radius:.1rem}.progress::-moz-progress-bar{background:#5755d9;border-radius:.1rem}.progress:indeterminate{background:#eef0f3 linear-gradient(90deg,#5755d9 30%,#eef0f3 30%) 0 0/150% 150% no-repeat;animation:1.5s linear infinite progress-indeterminate}.progress:indeterminate::-moz-progress-bar{background:0 0}@keyframes progress-indeterminate{0%{background-position:200% 0}to{background-position:-200% 0}}.slider{appearance:none;background:0 0;width:100%;height:1.2rem;display:block}.slider:focus{outline:0;box-shadow:0 0 0 .1rem #5755d933}.slider.tooltip:not([data-tooltip]):after{content:attr(value)}.slider::-webkit-slider-thumb{-webkit-appearance:none;background:#5755d9;border:0;border-radius:50%;width:.6rem;height:.6rem;margin-top:-.25rem;transition:transform .2s}.slider::-moz-range-thumb{background:#5755d9;border:0;border-radius:50%;width:.6rem;height:.6rem;transition:transform .2s}.slider::-ms-thumb{background:#5755d9;border:0;border-radius:50%;width:.6rem;height:.6rem;transition:transform .2s}.slider:active::-webkit-slider-thumb{transform:scale(1.25)}.slider:active::-moz-range-thumb{transform:scale(1.25)}.slider:active::-ms-thumb{transform:scale(1.25)}:is(),:is(),:is(){background:#f7f8f9;transform:scale(1)}.slider::-webkit-slider-runnable-track{background:#eef0f3;border-radius:.1rem;width:100%;height:.1rem}.slider::-moz-range-track{background:#eef0f3;border-radius:.1rem;width:100%;height:.1rem}.slider::-ms-track{background:#eef0f3;border-radius:.1rem;width:100%;height:.1rem}.slider::-ms-fill-lower{background:#5755d9}.timeline .timeline-item{margin-bottom:1.2rem;display:flex;position:relative}.timeline .timeline-item:before{content:"";background:#dadee4;width:2px;height:100%;position:absolute;top:1.2rem;left:11px}.timeline .timeline-item .timeline-left{flex:none}.timeline .timeline-item .timeline-content{flex:auto;padding:2px 0 2px .8rem}.timeline .timeline-item .timeline-icon{color:#fff;text-align:center;border-radius:50%;justify-content:center;align-items:center;width:1.2rem;height:1.2rem;display:flex}.timeline .timeline-item .timeline-icon:before{content:"";border:.1rem solid #5755d9;border-radius:50%;width:.4rem;height:.4rem;display:block;position:absolute;top:.4rem;left:.4rem}.timeline .timeline-item .timeline-icon.icon-lg{background:#5755d9;line-height:1.2rem}.timeline .timeline-item .timeline-icon.icon-lg:before{content:none}.viewer-360{flex-direction:column;align-items:center;display:flex}.viewer-360 .viewer-slider[max="36"][value="1"]+.viewer-image{background-position-y:0}.viewer-360 .viewer-slider[max="36"][value="2"]+.viewer-image{background-position-y:2.85714%}.viewer-360 .viewer-slider[max="36"][value="3"]+.viewer-image{background-position-y:5.71429%}.viewer-360 .viewer-slider[max="36"][value="4"]+.viewer-image{background-position-y:8.57143%}.viewer-360 .viewer-slider[max="36"][value="5"]+.viewer-image{background-position-y:11.4286%}.viewer-360 .viewer-slider[max="36"][value="6"]+.viewer-image{background-position-y:14.2857%}.viewer-360 .viewer-slider[max="36"][value="7"]+.viewer-image{background-position-y:17.1429%}.viewer-360 .viewer-slider[max="36"][value="8"]+.viewer-image{background-position-y:20%}.viewer-360 .viewer-slider[max="36"][value="9"]+.viewer-image{background-position-y:22.8571%}.viewer-360 .viewer-slider[max="36"][value="10"]+.viewer-image{background-position-y:25.7143%}.viewer-360 .viewer-slider[max="36"][value="11"]+.viewer-image{background-position-y:28.5714%}.viewer-360 .viewer-slider[max="36"][value="12"]+.viewer-image{background-position-y:31.4286%}.viewer-360 .viewer-slider[max="36"][value="13"]+.viewer-image{background-position-y:34.2857%}.viewer-360 .viewer-slider[max="36"][value="14"]+.viewer-image{background-position-y:37.1429%}.viewer-360 .viewer-slider[max="36"][value="15"]+.viewer-image{background-position-y:40%}.viewer-360 .viewer-slider[max="36"][value="16"]+.viewer-image{background-position-y:42.8571%}.viewer-360 .viewer-slider[max="36"][value="17"]+.viewer-image{background-position-y:45.7143%}.viewer-360 .viewer-slider[max="36"][value="18"]+.viewer-image{background-position-y:48.5714%}.viewer-360 .viewer-slider[max="36"][value="19"]+.viewer-image{background-position-y:51.4286%}.viewer-360 .viewer-slider[max="36"][value="20"]+.viewer-image{background-position-y:54.2857%}.viewer-360 .viewer-slider[max="36"][value="21"]+.viewer-image{background-position-y:57.1429%}.viewer-360 .viewer-slider[max="36"][value="22"]+.viewer-image{background-position-y:60%}.viewer-360 .viewer-slider[max="36"][value="23"]+.viewer-image{background-position-y:62.8571%}.viewer-360 .viewer-slider[max="36"][value="24"]+.viewer-image{background-position-y:65.7143%}.viewer-360 .viewer-slider[max="36"][value="25"]+.viewer-image{background-position-y:68.5714%}.viewer-360 .viewer-slider[max="36"][value="26"]+.viewer-image{background-position-y:71.4286%}.viewer-360 .viewer-slider[max="36"][value="27"]+.viewer-image{background-position-y:74.2857%}.viewer-360 .viewer-slider[max="36"][value="28"]+.viewer-image{background-position-y:77.1429%}.viewer-360 .viewer-slider[max="36"][value="29"]+.viewer-image{background-position-y:80%}.viewer-360 .viewer-slider[max="36"][value="30"]+.viewer-image{background-position-y:82.8572%}.viewer-360 .viewer-slider[max="36"][value="31"]+.viewer-image{background-position-y:85.7143%}.viewer-360 .viewer-slider[max="36"][value="32"]+.viewer-image{background-position-y:88.5714%}.viewer-360 .viewer-slider[max="36"][value="33"]+.viewer-image{background-position-y:91.4286%}.viewer-360 .viewer-slider[max="36"][value="34"]+.viewer-image{background-position-y:94.2857%}.viewer-360 .viewer-slider[max="36"][value="35"]+.viewer-image{background-position-y:97.1429%}.viewer-360 .viewer-slider[max="36"][value="36"]+.viewer-image{background-position-y:100%}.viewer-360 .viewer-slider{cursor:ew-resize;order:2;width:60%;margin:1rem}.viewer-360 .viewer-image{background-position-y:0;background-repeat:no-repeat;background-size:100%;order:1;max-width:100%}

Ho no, the situation is catastrophic!

The dashboard is unable to connect to the server. Try to refresh the page, and if the error persists, please contact project maintainers with the following details:

  
Entrypoints
A brief summary of the server's entrypoints.
Health
Check here if Ogmios is connecting to your node and if your node is correctly syncing with the network.
Status
?
Active clients
?
Last known tip
Network
Memory Usage
Real-time view of Ogmios heap size. This should remain relatively low.
\ No newline at end of file diff --git a/server/static/favicon.png b/server/static/favicon.png index 81e4ea16dc7fdca9614e47733266e85687190a8c..1ce48d3a8fd2dbb3bc5ce17c5a74c24929b87795 100644 GIT binary patch delta 2852 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