docs/changelogs/v0.33.md
libp2p_rcmgr metricssync on each writeipfs add --to-files no longer works with --wrapipfs --api supports HTTPS RPC endpointsWriteThrough, BlockKeyCacheSize, BatchMaxNodes, BatchMaxSizeKubo now supports sharing the same TCP port (4001 by default) by both raw TCP and WebSockets libp2p transports.
This feature is not yet compatible with Private Networks and can be disabled by setting LIBP2P_TCP_MUX=false if causes any issues.
It is no longer necessary to manually add /tcp/../ws listeners to Addresses.Swarm when AutoTLS.Enabled is set to true. Kubo will detect if /ws listener is missing and add one on the same port as pre-existing TCP (e.g. /tcp/4001), removing the need for any extra configuration.
[!TIP] Give it a try:
console$ ipfs config --json AutoTLS.Enabled trueAnd restart the node. If you are behind NAT, make sure your node is publicly diallable (uPnP or port forwarding), and wait a few minutes to pass all checks and for the changes to take effect.
See AutoTLS for more information.
This release includes some refactorings and improvements affecting Bitswap which should improve reliability. One of the changes affects blocks providing. Previously, the bitswap layer took care itself of announcing new blocks -added or received- with the configured provider (i.e. DHT). This bypassed the "Reprovider", that is, the system that manages precisely "providing" the blocks stored by Kubo. The Reprovider knows how to take advantage of the AcceleratedDHTClient, is able to handle priorities, logs statistics and is able to resume on daemon reboot where it left off. From now on, Bitswap will not be doing any providing on-the-side and all announcements are managed by the reprovider. In some cases, when the reproviding queue is full with other elements, this may cause additional delays, but more likely this will result in improved block-providing behaviour overall.
libp2p_rcmgr metricsBespoke rcmgr metrics were removed, Kubo now exposes only the default libp2p_rcmgr metrics from go-libp2p.
This makes it easier to compare Kubo with custom implementations based on go-libp2p.
If you depended on removed ones, please fill an issue to add them to the upstream go-libp2p.
sync on each writeNew repositories initialized with flatfs in Datastore.Spec will have sync set to false.
The old default was overly conservative and caused performance issues in big repositories that did a lot of writes. There is usually no need to flush on every block write to disk before continuing. Setting this to false is safe as kubo will automatically flush writes to disk before and after performing critical operations like pinning. However, we still provide users with ability to set this to true to be extra-safe (at the cost of a slowdown when adding files in bulk).
ipfs add --to-files no longer works with --wrapOnboarding files and directories with ipfs add --to-files now requires non-empty names. due to this, The --to-files and --wrap options are now mutually exclusive (#10612).
ipfs --api supports HTTPS RPC endpointsCLI and RPC client now supports accessing Kubo RPC over https:// protocol when multiaddr ending with /https or /tls/http is passed to ipfs --api:
$ ipfs id --api /dns/kubo-rpc.example.net/tcp/5001/tls/http
# β https://kubo-rpc.example.net:5001
WriteThrough, BlockKeyCacheSize, BatchMaxNodes, BatchMaxSizeNow that Kubo supports pebble as an experimental datastore backend, it becomes very useful to expose some additional configuration options for how the blockservice/blockstore/datastore combo behaves.
Usually, LSM-tree based datastore like Pebble or Badger have very fast write performance (blocks are streamed to disk) while incurring in read-amplification penalties (blocks need to be looked up in the index to know where they are on disk), specially noticeable on spinning disks.
Prior to this version, BlockService and Blockstore implementations performed a Has(cid) for every block that was going to be written, skipping the writes altogether if the block was already present in the datastore. The performance impact of this Has() call can vary. The Datastore implementation itself might include block-caching and things like bloom-filters to speed up lookups and mitigate read-penalties. Our Blockstore implementation also supports a bloom-filter (controlled by BloomFilterSize and disabled by default), and a two-queue cache for keys and block sizes. If we assume that most of the blocks added to Kubo are new blocks, not already present in the datastore, or that the datastore itself includes mechanisms to optimize writes and avoid writing the same data twice, the calls to Has() at both BlockService and Blockstore layers seem superfluous to they point they even harm write performance.
For these reasons, from now on, the default is to use a "write-through" mode for the Blockservice and the Blockstore. We have added a new option Datastore.WriteThrough, which defaults to true. Previous behaviour can be obtained by manually setting it to false.
We have also made the size of the two-queue blockstore cache configurable with another option: Datastore.BlockKeyCacheSize, which defaults to 65536 (64KiB). Additionally, this caching layer can be disabled altogether by setting it to 0. In particular, this option controls the size of a blockstore caching layer that records whether the blockstore has certain block and their sizes (but does not cache the contents, so it stays relativey small in general).
Finally, we have added two new options to the Import section to control the maximum size of write-batches: BatchMaxNodes and BatchMaxSize. These are set by default to 128 nodes and 20MiB. Increasing them will batch more items together when importing data with ipfs dag import, which can speed things up. It is importance to find a balance between available memory (used to hold the batch), disk latencies (when writing the batch) and processing power (when preparing the batch, as nodes are sorted and duplicates removed).
As a reminder, details from all the options are explained in the configuration documentation.
We recommend users trying Pebble as a datastore backend to disable both blockstore bloom-filter and key caching layers and enable write through as a way to evaluate the raw performance of the underlying datastore, which includes its own bloom-filter and caching layers (default cache size is 8MiB and can be configured in the options.
We have fixed a number of issues that were triggered by writing or copying many files onto an MFS folder: increased memory usage first, then CPU, disk usage, and eventually a deadlock on write operations. The details of the fixes can be read at #10630 and #10623. The result is that writing large amounts of files to an MFS folder should now be possible without major issues. It is possible, as before, to speed up the operations using the ipfs files --flush=false <op> ... flag, but it is recommended to switch to ipfs files --flush=true <op> ... regularly, or call ipfs files flush on the working directory regularly, as this will flush, clear the directory cache and speed up reads.
.eth TLD DNSLinks are now resolved via DNS-over-HTTPS endpoint at https://dns.eth.limo/dns-query.crypto TLD DNSLinks are now resolved via DoH endpoint at https://resolver.unstoppable.io/dns-queryTwo fixes in go-libp2p improve the reliability of the WebRTC Direct listener in Kubo, and by extension dialability from browsers.
Relevant changes in go-libp2p:
This release includes performance and reliability improvements and fixes for minor resource leaks.
boxo to v0.27.4 (incl. v0.25.0 + v0.26.0 + v0.27.0 + v0.27.1 + v0.27.2 + v0.27.3)go-libp2p to v0.38.2 (incl. v0.37.1 + v0.37.2 + v0.38.0 + v0.38.1)go-libp2p-kad-dht to v0.28.2quic-go to v0.49.0p2p-forge/client to v0.3.0 (incl. v0.1.0, v0.2.0, v0.2.1, v0.2.2)ipfs-webui to v4.4.2 (incl. v4.4.1)When navigating to a subdirectory, served by the Kubo web server, a subdirectory without a trailing slash gets redirected to a URL with a trailing slash. If there are special characters such as "%" in the subdirectory name then these must be escaped in the redirect URL. Previously this was not being done and was preventing navigation to such subdirectories, requiring the user to manually add a trailing slash to the subdirectory URL. This is now fixed to handle the redirect to URLs with characters that must be escaped.
go_package for protobuf, rename to a more unique ipns-record.proto (ipfs/boxo#789)WriteThrough(enabled bool) (ipfs/boxo#749)Ls to take results channel instead of returning one (#738) (ipfs/boxo#738)| Contributor | Commits | Lines Β± | Files Changed |
|---|---|---|---|
| Andrew Gillis | 57 | +1995/-1718 | 191 |
| Adin Schmahmann | 7 | +2552/-719 | 84 |
| Marco Munizaga | 27 | +1036/-261 | 51 |
| Hector Sanjuan | 21 | +789/-362 | 65 |
| gammazero | 20 | +407/-419 | 40 |
| sukun | 13 | +519/-233 | 30 |
| Marcin Rataj | 34 | +426/-142 | 59 |
| Marten Seemann | 2 | +11/-261 | 5 |
| Dreamacro | 2 | +161/-68 | 5 |
| Hlib Kanunnikov | 1 | +34/-65 | 4 |
| bashkarev | 1 | +78/-5 | 2 |
| Daniel Norman | 4 | +68/-12 | 6 |
| Andi | 1 | +37/-32 | 20 |
| hannahhoward | 1 | +35/-17 | 7 |
| Carlos Peliciari | 2 | +19/-26 | 2 |
| Cole Brown | 1 | +32/-0 | 3 |
| Will Scott | 2 | +19/-7 | 3 |
| Guillaume Michel | 1 | +21/-2 | 4 |
| 7sunarni | 1 | +3/-19 | 1 |
| Srdjan S | 1 | +11/-2 | 2 |
| web3-bot | 2 | +6/-6 | 3 |
| dashangcun | 1 | +2/-10 | 1 |
| John | 3 | +6/-6 | 5 |
| Daniel N | 3 | +8/-3 | 3 |
| Ivan Shvedunov | 1 | +4/-6 | 2 |
| Piotr Galar | 1 | +4/-4 | 2 |
| Derek Nola | 2 | +4/-4 | 4 |
| Bryer | 1 | +4/-4 | 1 |
| Prithvi Shahi | 2 | +6/-1 | 2 |
| Cameron Wood | 1 | +7/-0 | 1 |
| wangjingcun | 1 | +3/-3 | 2 |
| cuibuwei | 1 | +2/-2 | 2 |
| Jorropo | 1 | +1/-3 | 1 |
| ζͺζ | 1 | +1/-1 | 1 |
| Ubuntu | 1 | +1/-1 | 1 |
| Ryan MacArthur | 1 | +1/-1 | 1 |
| Reymon | 1 | +1/-1 | 1 |
| guillaumemichel | 1 | +1/-0 | 1 |
This release includes performance and reliability improvements and fixes for minor resource leaks. One of the performance changes greatly improves the bitswap clients ability to operate under high load, that could previously result in an out of memory condition.
Improved compatibility with third-party IPNS publishers by restoring support for compact binary CIDs in the Value field of IPNS Records (IPNS Specs). As long the signature is valid, Kubo will now resolve such records (likely created by non-Kubo nodes) and convert raw CIDs into valid /ipfs/cid content paths.
Note: This only adds support for resolving externally created recordsβKuboβs IPNS record creation remains unchanged. IPNS records with empty Value fields default to zero-length /ipfs/bafkqaaa to maintain backward compatibility with code expecting a valid content path.
| Contributor | Commits | Lines Β± | Files Changed |
|---|---|---|---|
| Dreamacro | 1 | +304/-376 | 119 |
| Andrew Gillis | 7 | +306/-200 | 20 |
| Guillaume Michel | 5 | +122/-98 | 14 |
| Marcin Rataj | 2 | +113/-7 | 4 |
| gammazero | 6 | +41/-11 | 6 |
| Sergey Gorbunov | 1 | +14/-2 | 2 |
| Daniel Norman | 1 | +9/-0 | 1 |
go-libp2p to v0.38.3| Contributor | Commits | Lines Β± | Files Changed |
|---|---|---|---|
| sukun | 1 | +122/-23 | 7 |
| Marcin Rataj | 1 | +1/-1 | 1 |