Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add a roadmap for the next 6 months #1784

Merged
merged 6 commits into from
Oct 7, 2022
Merged

add a roadmap for the next 6 months #1784

merged 6 commits into from
Oct 7, 2022

Conversation

marten-seemann
Copy link
Contributor

@marten-seemann marten-seemann commented Sep 27, 2022

I took a first stab at our roadmap for the next half a year. This document contains that are specific to the go-libp2p stack. General libp2p project items are listed in the roadmap in the specs repo. Sections are in no particular order.

This document is intended as a conversation starter.
I intend to keep this PR open for at least a week to give plenty of time for feedback.

@marten-seemann marten-seemann changed the title add a ROADMAP for the next 6 months add a roadmap for the next 6 months Sep 27, 2022
ROADMAP.md Outdated

## 🧠 Smart Dialing

Why: Having a large list of transports to pick from is great. Having an advanced stack that can dial all of them is even greater. But dialing all of them at the same time wastes our, the network’s and the peer’s resources.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Why: Having a large list of transports to pick from is great. Having an advanced stack that can dial all of them is even greater. But dialing all of them at the same time wastes our, the network’s and the peer’s resources.
Why: Having a large list of transports to pick from is great. Having an advanced stack that can dial all of them is even greater. But dialing all of them at the same time wastes the network’s and the peer’s resources.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It also wastes our CPU cycles to start that many handshakes.

@p-shahi
Copy link
Member

p-shahi commented Sep 27, 2022

This is awesome, my preliminary questions for now are:

  1. How did we arrive at this specific list? What other items were up for consideration that did not make it here (if we organize our roadmap items in terms of "Now", "Next", "Later" buckets which items in "Late"r didn't make it this "Next" list)
  2. Are there any tech debt items that should also be a part of this list?
  3. What is the priority of each roadmap item in comparison to another? We should come up with the priority here. I can create a PR to this branch if you like. This way we can create milestones for go-libp2p
  4. Is feasible it is to achieve all of this in the next 6 months?
  5. Can I create tracking issues for the items that don't have them?

ROADMAP.md Outdated Show resolved Hide resolved
@marten-seemann
Copy link
Contributor Author

How did we arrive at this specific list?

We didn't, I did ;) I just wrote down what I think would be the most valuable to work on in the next half a year. So this is just my opinion.

This list is intended as a starting point for the roadmap conversation, and shouldn't be viewed as a conclusion that was reached behind closed doors (it really isn't, I made up this entire list without asking for anybody's opinion on it). I'm happy to add and remove items based on feedback on this PR.

What other items were up for consideration that did not make it here

Everything below "Peer Routing Records" (including) from our general libp2p roadmap didn't make it. In addition to that, I've not included the part of Protocol Select that would replace multistream (libp2p/specs#349), since we're getting most of the benefit of the Protocol Select proposal by just doing the address change and the early muxer negotiation.

Are there any tech debt items that should also be a part of this list?

I was debating putting flaky tests on the list. We'll also engage with any bug reports and community PRs that come in, but I'm not sure if that needs a roadmap item or if it's just understood that we'll spend a certain amount of time on those.
One other item that we'll likely need to tackle is transport performance: making sure all of our transports perform well (as compared to plain HTTP for example). Not sure if that's tech debt or should be its own section.

What is the priority of each roadmap item in comparison to another? We should come up with the priority here. I can create a PR to this branch if you like. This way we can create milestones for go-libp2p

We'd need to assign priorities to sub-items. For example, the early muxer negotiation from the Handshake section has higher priority than the item right on top (putting the security protocol in the multiaddr). How would we capture that?

Is feasible it is to achieve all of this in the next 6 months?

That's a good question. We have to keep in mind that we're losing 1 - 1.5 months due to Lab Week, Thanksgiving and Xmas. My hope is that we can at least make significant progress on all of these points, but I might be too optimistic here.

ROADMAP.md Outdated Show resolved Hide resolved
@@ -0,0 +1,58 @@
# go-libp2p roadmap Q4’22/Q1’23
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great write up!
A general thought is that as libp2p is getting more widely deployed maybe we also need to think about beef up more security features. May or may not fit in to the next 6 months time frame.
For example behavior based security. The peer is usually not backed by a root of trust, so the traditional identity and chain of trust based approach does not work in this scenario. We may need to consider new approaches to enforce security.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@julian88110 Do you have anything specific in mind?
Would that belong into the go-libp2p roadmap, or would that first and foremost be an item for the general libp2p roadmap (https://github.com/libp2p/specs/blob/master/ROADMAP.md)?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes this should belong to the general roadmap for libp2p. I have some thoughts, may take some time to write it up after the muxer thing is done.

ROADMAP.md Outdated Show resolved Hide resolved
ROADMAP.md Outdated Show resolved Hide resolved
ROADMAP.md Outdated Show resolved Hide resolved
@MarcoPolo
Copy link
Collaborator

One other item that we'll likely need to tackle is transport performance: making sure all of our transports perform well (as compared to plain HTTP for example). Not sure if that's tech debt or should be its own section.

I'd like to see benchmarks as a section here. I think it's inline with future-proof testing as it's easy for things to get slow if you're not tracking them.

I'll probably have some other comments, but I need to think about this a bit more.

@marten-seemann
Copy link
Contributor Author

marten-seemann commented Sep 29, 2022

@MarcoPolo Good point! I added a benchmarking section in 60c4fce. How does that look to you?

Copy link
Contributor

@BigLep BigLep left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@marten-seemann: thanks for getting the ball rolling here. This is good stuff!

@marten-seemann @p-shahi ;
I know this a dump of milestone definitions in no particular order and that there is more work happening in https://www.notion.so/pl-strflt/go-libp2p-22-Q4-23-Q1-Product-Roadmap-48bc31fd5b394a29812d6cda624fffa0 for faster iteration which will makes it way out hee.

I'll leave my current thoughts from what I'm seeing here so it's public and tied to the milestone definitions. This is a drive by because I'm not sure when I'll be able to circle back. I expect manh of these things are on your radar. Don't feel the need to respond to each comment. This is a dump while the thoughts were there for me.

  1. I like how "Comprehensive Metrics" has a tracking issue. I think that's useful for communicating if/where there are dependencies between milestone and it allows someone to follow along with progress and or ask questions. When we settle here, I think it would be good have these for the other items.
  2. It seems like some of these things are themes like "Universal Browser Connectivity" and that some items within them are milestones on their own ("WebTransport", "WebRTC"). I think having a way to index into the specific milestone within a theme is good/useful. That seems to be what Prithvi is doing here with "A1.1", "B1.2". etc. Great.
  3. I know this is coming, but we ultimately need to give expected dates (month targets ideally). A list broken out by month (sort of like what's in https://www.notion.so/pl-strflt/Milestone-Roadmap-a90d888d6bf14b999131ea7a802c9960 ) would be great. Not required, but showing which milestones are being developed in a given month is nice as well to set expectation on when progress will begin.
  4. On the surface "Judicious Address Advertisements" seems like a stretch for the next 6 months and the lowest priority. I'll be interested to see where that lands on the calendar estimate.
  5. Should we bring Futureproof testing to the forefront? I'm viewing some it as necessary for "Handshakes at the Speed of Light" to be completed and IPDX has laid a good foundation to build on from what they did in libp2p/test-plans. New/exciting work is still going to be happening with landing WebRTC (with LBL driving this). Part of me wonders if we'll be happy for "eating our veggies" so we have a solid foundation for 2023.

General roadmap hygiene/logistics:

  1. When this gets merged, lets make sure we have a link from "libp2p vision ROADMAP"
  2. Please also expose within go-libp2p README itself.
  3. Make sure we have a way for users to ask questions or comment. I worry that "open a PR to ask a question or make a suggestion" will prevent people from engaging.
  4. Set expectations on when this was last edited and when it will next be reviewed. Maybe there is a tracking issue for the next review we can link to give the community visibility. That would also be a place for people to leave comments.

ROADMAP.md Outdated

How:

1. implement some kind of “Happy-Eyeballs” style prioritization among all supported transports
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
1. implement some kind of “Happy-Eyeballs” style prioritization among all supported transports
1. implement some kind of “[Happy-Eyeballs](https://en.wikipedia.org/wiki/Happy_Eyeballs)” style prioritization among all supported transports

ROADMAP.md Outdated

Why: Having lots of transports is great, and shaving off RTTs is awesome. We need to stay backwards-compatible with legacy go-libp2p implementations, and less advanced libp2p stacks.

Goal: We have cross-version and cross-implementation Testground coverage that makes sure that we are able to establish a libp2p connection between two nodes, in the expected number of RTTs. This makes sure that the optimizations don’t break compatibility, actually have the performance impact we expect them to have, and serves as a regression test in the future.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We talk about ensuring compability between versions and implementations, but I assume there is an extra dimension we need to add around transports (and likely encryption and muxer).

Basically want to show

<go-libp2p, vX, QUIC> can talk with <go-libp2p, vY, QUIC>
<go-libp2p, vX, TCP> can talk with <go-libp2p, vY, TCP>
<go-libp2p, vX, WebTransport> can talk with <go-libp2p, vY, WebTranport>
etc.

mxinden added a commit to mxinden/rust-libp2p that referenced this pull request Oct 6, 2022
Here is my (@mxinden) proposal for a roadmap for the next 6 months for the rust-libp2p
maintainers (@elenaf9, @thomaseizinger and @mxinden) working on the rust-libp2p project.

(rust-)libp2p is an open source and open community project. Thus:

- I want to make sure we listen to the community and align our work accordingly. I invite
  **everyone** to leave feedback here.
- The below is only planning work for the maintainers, not the community. Folks from the community
  may suggest and pick up work not prioritized (e.g. [Kademlia efficient
  querying](#kademlia-efficient-querying)) nor mentioned on this roadmap and we (maintainers) should
  be supporting them as best as we can.

I consider this more of a short-lived document, enabling everyone working and using rust-libp2p to
discuss and eventually align on a common mission, making prioritization explicit. Once done, it will
likely be outdated quickly and thus I suggest never actualy merge it. In my eyes, continued
project management is better done via GitHub issues and thus all the information here should
eventually make it into the corresponding GitHub issues if not already the case.

Also see:
- [libp2p roadmap](https://github.com/libp2p/specs/blob/master/ROADMAP.md)
- [go-libp2p roadmap](libp2p/go-libp2p#1784)

The items in this roadmap are ordered by importance where I define importance as:

- Enable others to build with rust-libp2p before building components ourself.
  - e.g.[cross behaviour communication](#cross-behaviour-communication) over[Kademlia client
    mode](#kademlia-client-mode) where the former enables the latter
- Invest into tools that enable us to work more efficiently
  - e.g.[Testground](#testground-abstraction) and [release process](#release-process)
- Better do one thing well than many things close to right.
  - e.g. deprioritize [BitSwap implementation](#bitswap-implementation) and continue on
    [QUIC](#quic-support) even once first ieration is merged. That does not imply that we won't
    support community members implementing it.
- Improve existing components before introducing new ones.
  - e.g.[Kademlia client mode](#kademlia-client-mode) before [WebTransport](#webtransport)

I am curious what folks think and again encourage everyone to share their thoughts.
mxinden added a commit to mxinden/rust-libp2p that referenced this pull request Oct 6, 2022
Here is my (@mxinden) proposal for a roadmap for the next 6 months for the rust-libp2p
maintainers (@elenaf9, @thomaseizinger, @jxs and @mxinden) working on the rust-libp2p project.

(rust-)libp2p is an open source and open community project. Thus:

- I want to make sure we listen to the community and align our work accordingly. I invite
  **everyone** to leave feedback here.
- The below is only planning work for the maintainers, not the community. Folks from the community
  may suggest and pick up work not prioritized (e.g. [Kademlia efficient
  querying](#kademlia-efficient-querying)) nor mentioned on this roadmap and we (maintainers) should
  be supporting them as best as we can.

I consider this more of a short-lived document, enabling everyone working and using rust-libp2p to
discuss and eventually align on a common mission, making prioritization explicit. Once done, it will
likely be outdated quickly and thus I suggest never actualy merge it. In my eyes, continued
project management is better done via GitHub issues and thus all the information here should
eventually make it into the corresponding GitHub issues if not already the case.

Also see:
- [libp2p roadmap](https://github.com/libp2p/specs/blob/master/ROADMAP.md)
- [go-libp2p roadmap](libp2p/go-libp2p#1784)

The items in this roadmap are ordered by importance where I define importance as:

- Enable others to build with rust-libp2p before building components ourself.
  - e.g.[cross behaviour communication](#cross-behaviour-communication) over[Kademlia client
    mode](#kademlia-client-mode) where the former enables the latter
- Invest into tools that enable us to work more efficiently
  - e.g.[Testground](#testground-abstraction) and [release process](#release-process)
- Better do one thing well than many things close to right.
  - e.g. deprioritize [BitSwap implementation](#bitswap-implementation) and continue on
    [QUIC](#quic-support) even once first ieration is merged. That does not imply that we won't
    support community members implementing it.
- Improve existing components before introducing new ones.
  - e.g.[Kademlia client mode](#kademlia-client-mode) before [WebTransport](#webtransport)

I am curious what folks think and again encourage everyone to share their thoughts.
@BigLep
Copy link
Contributor

BigLep commented Oct 7, 2022

Followup comments are in the followup PR: #1804 (review)

Copy link
Contributor

@BigLep BigLep left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@p-shahi and @marten-seemann : thanks for the continued work here. A couple of additional high level things:

  1. This doesn't need to be solved now, but I would love to solve surfacing key tenets of libp2p.
    I personally view these as security, stability (we don't regress with new versions), and performance (we don't regress between releases and there is insignificant performance difference with options like HTTP). I know those aren't tenets we've formalized in libp2p itself and more discussion needs to be had, but maybe it's worth us stating them for the go-libp2p project itself and we can discuss hoisting them up to libp2p as a whole.

  2. what are the thoughts on how we handle open comments that won't be easily resolvable? We'll want to get this PR merged, but presumably we'll do so without incorporating all the feedback. I want us to be able to make incremental progress without needing to keep PRs open indefinitely.

# Roadmap Appendix
## [A.⚡️Handshakes at the Speed of Light](https://github.com/libp2p/go-libp2p/issues/1807)

**Why**: Historically, libp2p has been very wasteful when it comes to round trips spent during connection establishment. This is slowing down our users, especially their TTFB (time to first byte) metrics.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree this is true. I would love to have more insight on the actual impact. For example, it would be great to have anecdotes from users on how much this is an adoption blocker.

This is more general comment. I don't think there's necessarily anything to do right now. It's more just to push to find ways to quantify problems in terms of impact as much as possible.

I do agree this issue rolls into one of our key pillars of "performance". TTFB performance isn't the existential threat I have heard complaints about though (vs. libp2p is slower than HTTP). I could be tuned in here though. Getting user input would be great.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe TTFB is an important metric to both Saturn and ipfs cluster folks.

Comment on lines +22 to +25
#### End of Q4 (December)
- B.1 🧠 Smart Dialing - **Happy Eyeballs**
- C 📊 Comprehensive Metrics - **Swarm metrics**
- D.1 📺 Universal Browser Connectivity - **[WebRTC Browser -> Server](https://github.com/libp2p/go-libp2p/pull/1655)**
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the ordering should be:

  • D.1 📺 Universal Browser Connectivity - WebRTC Browser -> Server
  • B.1 🧠 Smart Dialing - Happy Eyeballs
  • C 📊 Comprehensive Metrics - Swarm metrics

Reason being:

  1. We're not going to do anything to slow down the browser connectivity story. This closes up the story as well on "all modern browsers can connect with a go-libp2p node".
  2. Smart dialing - assuming we actually hitting a breaking point for what transport to use

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Per comment other places I believe, I would bump smart dialing and comprehensive metrics until we're more solid on future proofing interoperability and performance.


**How**: This will look similar to how we already expose resource manager metrics. Metrics can be added incrementally for libp2p’s components. First milestone is having metrics for the swarm.

## [D. 📺 Universal Browser Connectivity](https://github.com/libp2p/go-libp2p/issues/1811)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know the ordering of milestones is defined above. Maybe in a future PR we move the themes around to be in priority order. For example, as a theme, I think browser connectivity should be before all of these. I would likely put future proof testing at the top.

ROADMAP.md Outdated Show resolved Hide resolved

**Goal**: We have cross-version and cross-implementation Testground coverage that makes sure that we are able to establish a libp2p connection between two nodes, in the expected number of RTTs. This makes sure that the optimizations don’t break compatibility, actually have the performance impact we expect them to have, and serves as a regression test in the future.

1. RTT test for Early Muxer Negotiation (A.1)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm less convinced this warrants its own milestone. This is basically part of the done criteria for early muxer integration negotiation. All new functionality needs to be testing correctly as part of marking it complete. I think it should be moved up.

I think we need:

Comprehensive interoperability testing across:
libp2p implementations (already happening)
implementation versions (already happening)
transports (I don't think we're exhaustive)
security/encryption (I don't think we're exhaustive)
muxers (I don't think we're exhaustive)

That is the key thing we want I believe so we can move forward with confidence that we're not breaking anything.

Comment on lines +16 to +17
- A.1⚡Handshakes at the Speed of Light - **[Early Muxer Negotiation](https://github.com/libp2p/specs/issues/426)**
- E.1 🧪 Future-proof testing - **RTT test for Early Muxer Negotiation**
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Per below, I think these should be combined.

- E.1 🧪 Future-proof testing - **RTT test for Early Muxer Negotiation**

### Mid Q4 (November)
- F.1 ⏱ Future-proof Benchmarking - **[Using nix-builders](https://github.com/testground/testground/pull/1425)**
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think before we spin up benchmarking, lets get interoperability nailed. The pieces are in place for that already with libp2p/test-plans. I discussed this more below.

@p-shahi
Copy link
Member

p-shahi commented Oct 7, 2022

what are the thoughts on how we handle open comments that won't be easily resolvable? We'll want to get this PR merged, but presumably we'll do so without incorporating all the feedback. I want us to be able to make incremental progress without needing to keep PRs open indefinitely.

Open comments will be captured in #1806 so that we can merge this PR and make incremental updates

Co-authored-by: Steve Loeppky <stvn@loeppky.com>
@p-shahi p-shahi merged commit c8336a4 into master Oct 7, 2022
@p-shahi p-shahi deleted the roadmap branch October 15, 2022 18:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants