## Apache Incubation:

Apache Gearpump enters Apache incubation. Now, we are working on importing the source code to Apache Git (INFRA-11435), and
 a bunch of other tasks (GEARPUMP-1).

Apache Gearpump Jira: https://issues.apache.org/jira/browse/GEARPUMP
Mail list:

* Subscribe link to User list: user-subscribe@gearpump.incubator.apache.org
* Subscribe link to Dev list: dev-subscribe@gearpump.incubator.apache.org
* Subscribe link to Private list: private-subscribe@gearpump.incubator.apache.org
* Subscribe link to commits list: commits-subscribe@gearpump.incubator.apache.org

## What are the changes for the process for Apache Incubation?

The code importing to Apache Git is still in process. During this transtion time,
We will follow these procedures:

 1. For new issue, we should no longer open issue in Github issues. Instead, we
   need to open an issue at Apache Jira: https://issues.apache.org/jira/browse/GEARPUMP
 2. Pull Requests are still submitted to http://github.com/gearpump/gearpump for review.
 3. We should cross post the link of PR to Jira site, and Jira link to Pull Request context.
 4. Code will still be commited to https://github.com/gearpump/gearpump
 5. During this transition time, document change doesn't require a +1 if it comes from committers.
 6. The release tag requires a consensus in project discussion like sync-meeting. But it doesn't
   additional "+1" on code commit.
   For example, we will ask around that whether it is OK to trigger a tag; if every one agrees,
   then the assignee can tag the build and change the release doc directly without a written "+1" on the commit.

After the transition period, the proposed process is like this:

 1. The official repo will be at git://git.apache.org/gearpump.git, all other repos will be
    mirror of this repo.
 2. We will disable "write" in github issues, and switch to Apache Jira.
 3. We will enable Apache Github integration, which allow us to mirror official Git repo in Github.
 4. When the user submit a PR, there should be at least one +1 before doing merge.
 5. For all commits, the commit should commit the path manually to official repo
   git://git.apache.org/gearpump.git, "Github merge" will be disabled.
 6. For document change, we can have further discussion on whether it should requires a +1.

Before completing importing source code to Apache Git, we will still use

## Why we make a tag release now, but not wait until Apache importing complete?

There are quite a lot of open task at https://issues.apache.org/jira/browse/GEARPUMP-1, which
would take a significant time. For example, we still don't have the new maven artifact yet.

Making incremental releases like this one allow us to be more prepared to make a full Apache release.

## Highlights:

1. Update Akka to Akka 2.4.2 (#1988). Now we only support Java 8 and Scala 2.11, Java7, Scala 2.10 support is dropped
   (Be compatible with Akka 2.4.2). The performance of Gearpump 0.8.0 is as good at Gearpump 0.76.
2. Fix Min clock slow-advancing issue (#1318) when some graph edge (Possibly means networking between two hosts) don't
   have enough traffic.
3. Add OAuth2 social login for UI server.

## Lowlights:

Akka-stream DSL module is temporary disabled, as Akka-Stream 2.4.2 has big API change compared with Akka-Stream 1.0. We'd
like to add the full functional module back in next release.

## Change log:

From now on, new issues should be submitted to https://issues.apache.org/jira/browse/GEARPUMP

- GEARPUMP-10, Downgrade netty from Netty 4 to Netty 3.8 cause the OAuth2 authentication failure
- GEARPUMP-9, Clean and fix integration test
- GEARPUMP-8, fix "two machines can possibly have same worker id for single-master cluster"
- GEARPUMP-6: show add/remove worker buttons for admin
- GEARPUMP-5, Add additional authorization check like checking user-organization for cloudfoundry OAuth2 Authenticator.
- GEARPUMP-3, Define REST API to add/remove worker instances, which allow us to scale out in YARN.
- GEARPUMP-2, Define REST API to submit job jar
- #1988, upgrade akka to akka 2.4.2
- #2015, do not send AckRequest or LatencyProbe when no pending messages
- #1943 allow user to config how many executors to use in an application
- #1641, add exactly-once it
- #1318, fix MinClock not updated fast enough for slow stream
- #1981, Support OAuth2 Social login
- #2007, add Java DSL
- #2002, add akka stream examples
- #1996, EmbeddedCluster requires master configuration like ClusterActorRefProvider.
- #1989: add confirmation dialog for kill app and restart app
- #1983, fix KafkaUtilSpec failure
- #1975,  fix storm integration test
- #1972, backoff retry kafka consuming on exception
- #1966 make Partitioner API Java compatible
- #1892: added instruction text to operate network graph (2) minor tweaks of context menu
- #1963, rename CommitGuideline.md to CONTRIBUTING.md
- #1958: better test report organizing
- #1906: some visual glichtes found in mobile view