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

Policies and going forward with RxJava versions #4016

Closed
akarnokd opened this issue Jun 17, 2016 · 13 comments
Closed

Policies and going forward with RxJava versions #4016

akarnokd opened this issue Jun 17, 2016 · 13 comments

Comments

@akarnokd
Copy link
Member

akarnokd commented Jun 17, 2016

As a newly named lead contributor, I suggest the following policies and future plans regarding RxJava.

RxJava 1.x

The unfortunate side-effect of Ben leaving was the slowing down of managing PRs and releases. I intend to speed this up again with the following policies:

Trivial PRs

Trivial PRs no longer require at least 2 👍 from contributors and can be merged by any of them on their own right. A PR is trivial if it is about typo fixes in the javadocs, test fixes or performance tests.

Since documentation expressiveness is a common place for lengthy arguments, the merge first, discuss later policy should be in effect; disagreeing parties are welcome to post their follow-up PRs.

Bugfixes

If a PR aims to fix a bug without changing the public surface API, collaborators can merge them on their own right or ask for additional review from the other collaborators. In this latter case, an additional 👍 is required for merging.

If the bugfix involves surface API changes, at least 2 👍's are required. If the proposer of a PR is a collaborators, that automatically counts as 👍

If the bug (of any complexity) is related to other platforms, such as Android, or is a cross-library bug, such as with rxjava-string, and the fix itself is of some doubt, I propose accepting @JakeWharton's, @artem-zinnatullin's and @davidmoten's 👍 as equal to the 👍's of the core collaborators.

When a bug has been identified and the fix proposed, a patch release has to follow within a week for high impact bugs or within 2 weeks for medium impact bugs. For low impact bugs, the regular release cycle applies (see below). (Example high impact bug: crash in flatMap; medium impact bug: performance degradation in ReplaySubject; low impact bug: missing argument validation.)

If the proposed bug is not merged within the time limit due to lack of feedback or lengthy discussions, I reserve the right to be the final judge on the issue.

Performance enhancements

If a PR contains performance enhancements and no surface API changes, collaborators are allowed to merge the PR without the need for additional 👍 provided there is at least one other person (collaborator, the poster of the original issue or other contributors) confirming the improvements.

API enhancements

There are usually 2 complaints with RxJava's API: "it has too many methods/operators but doesn't have my operator".

On one hand, I'd like to avoid RxJava becoming a dumping ground for all sorts of exotic yet small impact operators. The existing extension points lift, compose and extend allow adding operators with minimal inconveniences.

On the other hand, past enhancement PRs were delayed quite significantly, due to lack of attention or too long discussions, hindering progress on releases and other PRs.

To avoid these problems, enhancement PRs require at least 2 👍 from the collaborators. If the proposer is also a collaborator, the PR still requires at least 2 👍 from the other collaborators.

If such a PR doesn't get the required 👍 (and thus merged) within two consecutive releases, the PR can be closed by any collaborator.

Issues

Issues identified as questions or discussions can be closed by collaborators after 30 calendar days of inactivity. Inactivity means the question appears to be answered or the OP didn't provide additional feedback.

Bug reports should be closed if the fix PR has been merged or rejected without any alternative fix.

Issues related to test failures on Travis CI should be closed if the failure doesn't appear within 60 calendar days again in PRs or in master builds.

Issues related to feature requests or enhancement proposals can be closed after 30 calendar days and if two or more 👎 has been signalled.

Patch releases

As features and bugfixes are merged in and no medium or high impact bugfix is among them, a patch release happen at most within 4 weeks. In the unlikely event there are no merges within this time period, the at most 4 week countdown starts when the next PR is merged.

Medium or high impact bugs and enhancements can be released sooner, provided at least 2 👍 is received for a release proposal.

Since a release involves updating the CHANGES.md, 👍 on the related issue and PRs all count towards the minimum 2. (I.e., no need to 👍 both the issue and the PR actually changing the file).

Release 1.2

The 1.1.x has accumulated quite a few deprecated APIs and I think most high and medium bugs (mostly backpressure related) have been ironed out.

Following the 1.0.x -> 1.1.0 switch before, I propose finishing up and releasing 1.1.7 in 4 weeks from now (15/7/2016) and then release 1.2 in 5 weeks from now (22/7/2016). Version 1.1.7 will have the API intact. Version 1.2 will have the deprecated API removed and beta/experimental APIs promoted/demoted. Suggestions for further deprecation should go through a regular PR before that.

I'll distribute a questionnaire regarding the API promotion/demotion to the collaborators and also publish it publicly.

RxJava 2.x

Although there is a working RxJava 2.x branch, its architecture is quite outdated.

The new architecture, as described in Design.md focuses on performance and reduction of object allocations whenever possible.

Switching to this new architecture requires changing how operators are instantiated in the first place. This change has the largest one-time impact for 2.x. Once done, applying the advanced operator-fusion to the operators can be done in smaller PRs thereafter.

Adding operator-fusion won't block release candidates and can happen incrementally.

This is my proposed schedule for 2.0:

  • Update core architecture: till: 1/7/2016
  • Agree on the maven group ID (Version 2.x Maven Central Identification #3170): till 15/7/2016
  • Decide about operators: to drop, to port from 1.x or to change behavior: till: 5/8/2016
  • Add missing javadoc: till 12/8/2016
  • Synchronize unit tests from 1.x: till 19/08/2016
  • Release Candidate 1 : 26/08/2016
  • Release Candidate 2 : 23/09/2016
  • Release Candidate 3 : 21/10/2016
  • Release 2.0: 28/10/2016

Other responsibilities of mine

You may know I have been contributing to Project Reactor lately and also doing my research in the Reactive-Streams-Commons (Rsc) project. Since both Project Reactor and RxJava 2.x benefit from Rsc (and are basically cousins in their style anyway), I don't expect any duplicate work or split attention between these projects.

In addition, I don't consider Project Reactor to be a direct competition because its dependency on Java 8 and the choice of supported operators (some missing, others extra).

Lastly, I'm also working under their umbrella on porting Rsc/Reactor to JavaScript/TypeScript and .NET. These ports happen mainly for the reason that neither RxJS 5 nor Rx.NET 3 seems to care about the advancements made in RxJava (and in Rsc): synchronous cancellation, backpressure or the Reactive-Streams design in general (not to mention, operator-fusion). (As a side-effect, implementing operators in .NET already revealed a few concurrency-related bugs in the Java implementation.)

Although tedious at times, I don't expect any interference on this regard and can focus on leading RxJava.

@smaldini
Copy link

smaldini commented Jun 17, 2016

Very nice to see at last RSC sourcing two flavors, that will translate in a more robust, efficient operator chain. Very happy and proud that we can at last contribute to rxjava indirectly 👍 I can imagine already cross-library fusion that might be therefore discussed in Reactive Streams. We indeed use Java 8 and only plan to support minimum Android N, Spring Framework 5 uses Reactor and can directly translate to RxJava transparently. I think we are going to be successful together in accumulating knowledge from RSC/reactor and rxjava, we have a solid Java answer to reactive programming and reactive streams, finally.

@benjchristensen
Copy link
Member

+1 on your plan, and happy to see that under your leadership the pace will pick up again.

@stevegury
Copy link
Member

👍 Your plan looks good.

@bobymicroby
Copy link

+1 Its great to see that things will start moving again !

@LalitMaganti
Copy link
Contributor

Very glad to see major movements in RxJava again. Looking forward to seeing awesome results! 👍

@ZacSweers
Copy link
Contributor

ZacSweers commented Jun 17, 2016

Congratulations David, I think the project is in great hands!

@JakeWharton
Copy link
Contributor

Version 1.2 will have the deprecated API removed and beta/experimental APIs promoted/demoted.

(emphasis mine)

Did 1.1 remove deprecated APIs from 1.0.x? This is a breaking change for consumers that may surprise. Isn't RxJava's goal long-term compatibility.

@ZacSweers
Copy link
Contributor

I agree with Jake. Seems unnecessary to remove the deprecated APIs unless absolutely necessary, especially if you're eyeing RxJava 2.x only a few months later.

@abersnaze
Copy link
Contributor

@JakeWharton yes a few methods where deleted between 1.0 and 1.1. They were:

  • rx.Observable.onBackpressureBlock(int maxQueueLength)
  • rx.Observable.onBackpressureBlock()
  • rx.subjects.AsyncSubject.getValues(T[])
  • rx.subjects.PublishSubject.getValue()
  • rx.subjects.PublishSubject.getValues()
  • rx.subjects.PublishSubject.getValues(T[])
  • rx.subjects.PublishSubject.hasValue()
  • rx.subjects.SerializedSubject.getThrowable()
  • rx.subjects.SerializedSubject.getValue()
  • rx.subjects.SerializedSubject.getValues()
  • rx.subjects.SerializedSubject.getValues(T[])
  • rx.subjects.SerializedSubject.hasCompleted()
  • rx.subjects.SerializedSubject.hasThrowable()
  • rx.subjects.SerializedSubject.hasValue()
  • rx.subjects.Subject.getThrowable()
  • rx.subjects.Subject.getValue()
  • rx.subjects.Subject.getValues()
  • rx.subjects.Subject.getValues(T[])
  • rx.subjects.Subject.hasCompleted()
  • rx.subjects.Subject.hasThrowable()
  • rx.subjects.Subject.hasValue()

Only methods marked @Experiment/@beta AND @Depericated are eligible for removal.

@JakeWharton
Copy link
Contributor

Thanks for the clarification. 👍

On Fri, Jun 17, 2016 at 1:55 PM George Campbell notifications@github.com
wrote:

@JakeWharton https://github.com/JakeWharton yes a few methods where
deleted between 1.0 and 1.1. They were:

  • rx.Observable.onBackpressureBlock(int maxQueueLength)
  • rx.Observable.onBackpressureBlock()
  • rx.subjects.AsyncSubject.getValues(T[])
  • rx.subjects.PublishSubject.getValue()
  • rx.subjects.PublishSubject.getValues()
  • rx.subjects.PublishSubject.getValues(T[])
  • rx.subjects.PublishSubject.hasValue()
  • rx.subjects.SerializedSubject.getThrowable()
  • rx.subjects.SerializedSubject.getValue()
  • rx.subjects.SerializedSubject.getValues()
  • rx.subjects.SerializedSubject.getValues(T[])
  • rx.subjects.SerializedSubject.hasCompleted()
  • rx.subjects.SerializedSubject.hasThrowable()
  • rx.subjects.SerializedSubject.hasValue()
  • rx.subjects.Subject.getThrowable()
  • rx.subjects.Subject.getValue()
  • rx.subjects.Subject.getValues()
  • rx.subjects.Subject.getValues(T[])
  • rx.subjects.Subject.hasCompleted()
  • rx.subjects.Subject.hasThrowable()
  • rx.subjects.Subject.hasValue()

Only methods marked @Experiment/@beta https://github.com/Beta AND
@Depericated are eligible for removal.


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
#4016 (comment),
or mute the thread
https://github.com/notifications/unsubscribe/AAEEERdXvtsHeX6uxvTEIDngLsJB3rUrks5qMt-WgaJpZM4I4RD9
.

@akarnokd
Copy link
Member Author

My original intent was to remove anything marked @Deprecated:

  • timer() (long time deprecated)
  • cache(capacityHint)
  • finallyDo()
  • CompositeException constructor
  • 2 BackpressureUtils helper methods (internal API)
  • rx.schedulers.XScheduler deprecated by Jake
  • Completable.doOnComplete (Completable is experimental)
  • Completable.endWith
  • Observable operators with 7-9 source arguments (not yet PR'd)

I assumed these would be low impact and free some room for 1-2 future operators if need to be.

However, if you think the support should stay for everything non beta/experimental I 1.x, then be it.

@abersnaze
Copy link
Contributor

abersnaze commented Jun 17, 2016

@akarnokd I'm fine with deleting those in 2.x but currently the set of methods deprecated and beta/experimental is:

  • rx.Completable.doOnComplete(rx.functions.Action0)
  • rx.Completable.endWith(rx.Completable)
  • rx.Completable.endWith(rx.Observable)

https://github.com/ReactiveX/RxJava#versioning

APIs marked with the @deprecated annotation at the class or method level will remain supported until the next major release but it is recommended to stop using them. APIs marked with @beta and @experimental will be marked as deprecated for at least one minor release before they removed in a minor or patch release respectively.

@akarnokd
Copy link
Member Author

Right, thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

9 participants