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

Progress reporter promoted to core and used in Http Client. #29495

Merged
merged 29 commits into from
Jun 22, 2022

Conversation

kasobol-msft
Copy link
Contributor

@kasobol-msft kasobol-msft commented Jun 15, 2022

This PR:

  • Adds ProgressReporter and ProgressListener to the core (copies exist across SDKs and should get replaced by this over time).
  • The progress reporter is a tree that can branch out progress reporting to concurrent processes or logical units (like block uploads).
  • Add Contexts utility to manipulate Context and set cross-cutting properties there.
  • Implement progress reporting across existing HttpClient (with battery of tests).

Note

  1. The goal of this PR is to establish baseline of this functionality, i.e. make it work and develop test converage.
    For some clients (JDK, Vertx) there's room for improvement to push it closer to the socket.write, but it's not a goal of this PR to get there now.
  2. The progress reporting itself is standalone functionality that can be used on any flow, not only http client uploads.

Prototypes

  1. Storage - WIP - Storage upload from file - binary data #29277
  2. Comms - kasobol-msft@9f37bae
  3. Comms - kasobol-msft@460f7b2

@ghost ghost added the Azure.Core azure-core label Jun 15, 2022
@azure-sdk
Copy link
Collaborator

azure-sdk commented Jun 15, 2022

API change check

APIView has identified API level changes in this PR and created following API reviews.

azure-core
azure-core-test

@kasobol-msft
Copy link
Contributor Author

/azp run java - core - tests

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

connection.addHandlerLast(WriteTimeoutHandler.HANDLER_NAME, new WriteTimeoutHandler(timeoutMillis));
private void addRequestHandlers(Connection connection, Context context) {
connection.addHandlerLast(WriteTimeoutHandler.HANDLER_NAME, new WriteTimeoutHandler(writeTimeout));
ProgressReporter progressReporter = Contexts.with(context).getProgressReporter();
Copy link
Member

Choose a reason for hiding this comment

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

Should we clarify what determines if something that is user-settable via a Context becomes elevated to be an API on Contexts? For example, I see above code that gets the AZURE_RESPONSE_TIMEOUT and AZURE_EAGERLY_READ_RESPONSE values out of Context. At what stage do we do this elevation, and then, does progress reporter meet that criteria?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I'd say that stuff that has to cross core-sdks boundary is a candidate where HLC logic has interest in orchestrating it.
Especially when there's N:1 relationship of interest, i.e. N SDKS need to use it with core (core is 1 here).
For example:

  • progress reporting is present in 3 storage services plus comms. We should not use magic key for this.
  • The AZURE_EAGERLY_READ_RESPONSE is a contract between RestProxy and HttpClients. Doesn't cross core boundary. Shouldn't be API
  • AZURE_RESPONSE_TIMEOUT (or some form of timeout tbd). We have sync APIs that take Duration timeout in storage, tables. This needs to (plus-minus math transformations in retry policy) travel across sdks-core boundary. This is a good candidate for API.

*
* @param bytesTransferred The total number of bytes transferred during this transaction.
*/
void onProgress(long bytesTransferred);
Copy link
Member

Choose a reason for hiding this comment

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

This could have an @FunctionalInterface annotation (at class level). I also wonder if we should be reporting the total size, if known, so that users can more easily determine percentage progress?

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's replacing https://github.com/Azure/azure-sdk-for-java/search?q=%22interface+ProgressReceiver%22 .

I'll add @FunctionalInterface

I wouldn't add total size eagerly. We have APIs (e.g. in shares) that take Fluxes or InputStreams without defined length and chunk them.
If caller knows the length they can easily implement

class MyReporter {
 private final long totalSize;
 public MyReporter(long totalsize);
 public onProgress(long delta) {
 System.out.println(delta/totalSize + " completed);
}
}

shareClient.upload(flux, new MyReporter(knownSize));

If the caller wouldn't know total size upfront, we wouldn't know it either.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

After conducting this experiment 36b58fd . I think we should:

  • match signature of existing ProgressReceiver in storage and comms
  • eventually make storage/comms.ProgressReceiver extend core.ProgressReceiver so that users with existing implementations will be able to use it with new apis where we'd use core's type.

Copy link
Contributor Author

@kasobol-msft kasobol-msft Jun 16, 2022

Choose a reason for hiding this comment

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

comms prototype for reference as well kasobol-msft@9f37bae

Comment on lines +58 to +60
public ProgressReporter createChild() {
return new ProgressReporter(this);
}
Copy link
Member

Choose a reason for hiding this comment

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

Do you feel this is necessary in the first instance?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yes. We have to be able to track progress for chunked uploads. Including cases where single block hits retries (and partial progress has to be reset).

Example from prototype.
https://github.com/kasobol-msft/azure-sdk-for-java/blob/7c65a6c06ec9845ebf394077ff83e92be0950dfe/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/BlobAsyncClient.java#L1012

@kasobol-msft kasobol-msft changed the title Progress reporter at HttpClient level. Progress reporter promoted to core and used in Http Client. Jun 16, 2022
* @return The {@link Contexts} instance.
* @throws NullPointerException If {@code context} is null.
*/
public static Contexts with(HttpPipelineCallContext context) {
Copy link
Member

Choose a reason for hiding this comment

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

Is this API being used anywhere yet?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Copy link
Member

Choose a reason for hiding this comment

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

I don't see any reason not to make getContext() in HttpPipelineCallContext public. We should just do that instead of coupling Contexts with an HTTP pipeline type.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

public HttpPipelineCallContext.getContext() sounds good.

* @param progressReporter The {@link ProgressReporter} instance.
* @return Itself.
*/
public Contexts setProgressReporter(ProgressReporter progressReporter) {
Copy link
Member

Choose a reason for hiding this comment

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

Are there other commonly used Context keys that should be given APIs here (eventually, not in this PR)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This guy after figuring out how timeout family looks like

long effectiveResponseTimeout = context.getData(AZURE_RESPONSE_TIMEOUT)
.

Also see discussion above #29495 (comment)

* @return The {@link Contexts} instance.
* @throws NullPointerException If {@code context} is null.
*/
public static Contexts with(HttpPipelineCallContext context) {
Copy link
Member

Choose a reason for hiding this comment

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

I don't see any reason not to make getContext() in HttpPipelineCallContext public. We should just do that instead of coupling Contexts with an HTTP pipeline type.

*/
public final class Contexts {

private static final String PROGRESS_REPORTER_CONTEXT_KEY = "com.azure.core.util.ProgressReporter";
Copy link
Member

@srnagar srnagar Jun 16, 2022

Choose a reason for hiding this comment

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

We have used different naming conventions for known context keys. We should standardize the naming of well-known context keys.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

There's also this one

/**
* Key for {@link Context} to pass request retry count metadata for logging.
*/
public static final String RETRY_COUNT_CONTEXT = "requestRetryCount";

There's more context keys in Tracer which are kind of all over the place.

If we're to standardize which format do we pick ? I'd go for com.azure.core.my.awesome.key and encourage long non ambiguous keys (like reactor does).

Also, I'd suggest we pick a standard and keep it going forward and log issue to revisit existing keys (no scope creep).

Copy link
Member

Choose a reason for hiding this comment

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

Yes, I am fine with using key names similar to Java package names.

*
* @param bytesTransferred The total number of bytes transferred during this transaction.
*/
void reportProgress(long bytesTransferred);
Copy link
Member

Choose a reason for hiding this comment

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

Given the name of this method, the type should be ProgressReporter or this method should be receiveProgress to match the type name. Also, if we are thinking of this to be a generic progress tracker (per comment above), should this be bytesTransferred? This could potentially track progress of anything like number of files uploaded or number of pages received in a paged collection.

Copy link
Contributor Author

@kasobol-msft kasobol-msft Jun 16, 2022

Choose a reason for hiding this comment

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

Yeah. we can definietly change name of the parameter to something more generic.

When it comes to symbols. I had ProgressListener.onProgress before but in offline discussion with @JonathanGiles we figured that diverging too much from existing pattern is going to cause user pain and noise on existing types like options bags that take progressreceivers today if they have implementations based on existing types.

  1. We want to match signature of existing ProgressReceivers like this one https://github.com/kasobol-msft/azure-sdk-for-java/blob/36b58fde61222042d7915b88a92313633aacb819/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/ProgressReceiver.java#L27 and make them extend new core type https://github.com/kasobol-msft/azure-sdk-for-java/blob/36b58fde61222042d7915b88a92313633aacb819/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/ProgressReceiver.java#L20 . The reason for that is good deprecation story when they have implementations based on existing interfaces and we stop developing APIs based on old interfaces and deprecate them eventually.
  2. As for the type name we could do ProgressReporter and rename the other ProgressReporter (the one that is called by our impl to publish) to ProgressCollector/ProgressPublisher or so.

Or perhaps if we want to revisit naming we could make something like

core.ProgressListener {
 void onProgress(progress);
}

storage.ProgressReceiver {
 void reportProgress(progress);
 default onProgress(progress) {
   //i.e. delegate to old abstraction by default.
   reportProgress(progress);
 }
}

Please share your thoughts.

Copy link
Member

Choose a reason for hiding this comment

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

Yeah, I think ProgressReporter seems like a more accurate name for what this interface does (reporting progress). For the other type, I like ProgressPublisher but Publisher is overloaded with reactive stream publishers. Other names to consider:

  • ProgressTracker
  • ProgressCollector (mentioned above)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@JonathanGiles Please chime in on naming here.

Copy link
Member

@JonathanGiles JonathanGiles Jun 20, 2022

Choose a reason for hiding this comment

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

I think the choices discussed above can boil down to either ProgressReporter/reportProgress, ProgressListener/onProgress, or ProgressReceiver/reportProgress. From the standpoint of a developer who is providing this interface implementation, they are expecting to listen to (or receive) progress, rather than report progress. In this interpretation, I think we should rule out ProgressReporter. That leaves us with ProgressListener or ProgressReceiver. I don't have a strong preference here, although I would lean towards a Listener being more commonly understood by developers as a general term.

In terms of onProgress vs reportProgress, I again think from a consumers point of view, they are not reporting progress, and we should probably name the API from the consuming users standpoint, so onProgress or receiveProgress or handleProgress or consumeProgress or consume or anything along these lines should work fine.

In the absence of a decision, my suggestion would be to use ProgressListener with a handleProgress method.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I sympathize with @JonathanGiles 's pov on naming. However.

Are we fine with this (and it's copies)

public interface ProgressReceiver {
/**
* The callback function invoked as progress is reported.
*
* @param bytesTransferred The total number of bytes transferred during this transaction.
*/
void reportProgress(long bytesTransferred);
}

becoming

package com.azure.storage.common;

// Eventually get rid of this type.
public interface ProgressReceiver extends ProgressListener {

    @Deprecated
    void reportProgress(long bytesTransferred);
    
    default void onProgress(long progress) {
       reportProgress(progress);
    }
}

??

Copy link
Member

Choose a reason for hiding this comment

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

Yes, I'm fine with that (although it'll be handleProgress rather than onProgress, unless I get overruled).

Copy link
Contributor Author

Choose a reason for hiding this comment

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

If we're going with ProgressListener.handleProgress then I'll keep ProgressReporter.reportProgress as is.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Sample deprecation kasobol-msft@460f7b2 .

/**
* A utility type that can be used to add and retrieve instances commonly used in {@link Context}.
*/
public final class Contexts {
Copy link
Member

Choose a reason for hiding this comment

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

I am considering if we need this additional type because it's not easily discoverable. Context is visible because it is present in all the withResponse methods of sync client. So, we can move the known key-value setters to Context itself.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@JonathanGiles please chime in here.

One concern that I'd have with that approach is growing list of getters and setters that over time obscures the Context.
We create contract by defining reserved key values so these wouldn't be classic get/set pairs.

If we're unsure and we anyway have to define public constants (see discussion below) then perhaps we could ride on public constants until we hate it and defer creation of this type.

Copy link
Member

Choose a reason for hiding this comment

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

I generally don't worry too much about the discoverability of this type. It falls into the category of 'support type' that generally seems common in Java, e.g. Collections, StreamSupport, etc.

Copy link
Member

Choose a reason for hiding this comment

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

I am fine with this new type. We should update documentation and probably replace Context.NONE in code snippets with Contexts.empty() to guide users toward this type.

Copy link
Member

Choose a reason for hiding this comment

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

Contexts.empty() returns a Contexts, so it is not directly a drop-in replacement for Context.NONE, although we could introduce a Contexts.none() that is a drop-in replacement (although I'm not sure the distinction between Contexts.empty() and Contexts.none() is clear enough, so I wouldn't do this automatically.

* @param progressReporter The {@link ProgressReporter} instance.
* @return Itself.
*/
public Contexts setProgressReporter(ProgressReporter progressReporter) {
Copy link
Member

Choose a reason for hiding this comment

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

How does the user use this when working with an async client?

This will need creating Azure context first, then converting to reactor context and then internally will be converted to Azure context again.

Should we make the context key (PROGRESS_REPORTER_CONTEXT_KEY) public, so that users can directly set the key, value in reactor context?

Context azureContext = Contexts.empty().setProgressReporter(reporter).getContext();
reactor.util.context.Context reactorContext = FluxUtil.toReactorContext(azureContext);
asyncClient.foo().contextWrite(reactorContext);

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I did this in the prototype
https://github.com/kasobol-msft/azure-sdk-for-java/blob/7c65a6c06ec9845ebf394077ff83e92be0950dfe/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/BlobAsyncClient.java#L1010-L1017
Which is waste of allocation as you say.
We should make well known keys public constants. Or perhaps we should also create ReactorContexts that mirrors Contexts.

If we're to define public constants where this would be? We don't have a good place for this, so things like azure-eagerly-read-response are scattered across packages.

Copy link
Member

Choose a reason for hiding this comment

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

We could define all these public constants in Contexts class itself. The other option is to define them in Context like we do for Configuration.

/**
* A {@link Context} key for the outgoing request's {@link ProgressReporter}.
*/
public static final String REQUEST_PROGRESS_REPORTER = "com.azure.core.request.progress.reporter";
Copy link
Member

Choose a reason for hiding this comment

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

Should the key name also include http if the request we are referring to is a HTTP request?

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's a good idea. We should be specific here to not run into ambiguity problems later. (I'll also apply this to get/set).

@@ -76,7 +71,7 @@ public Optional<Object> getData(String key) {
*
* @return The context associated to the HTTP call.
*/
Context getContext() {
public Context getContext() {
Copy link
Member

Choose a reason for hiding this comment

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

Since we are making this public, we should also update the javadoc to mention that the Context returned is a snapshot of the context at the time this method was called and updates to the context will not be reflected in the instance returned from this method.

Comment on lines 7 to 9
- Added ability to track progress by passing `ProgressReporter` in the `Context`.
I.e., `Contexts.with(context).setProgressReporter(progressReporter)`
before calling `HttpClient.send(HttpRequest, Context)` API.
Copy link
Member

Choose a reason for hiding this comment

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

Two things:

  1. s/ProgressReporter/ProgressListener
  2. Just to be clear - the user would need to getContext() and pass that in, rather than expect to mutate the existing Context passed in to the with method with the additional progressReporter. I sat here for a second thinking "do we have two different usage patterns here?" before concluding that the naive (and incorrect, but only with knowledge about how Context works) interpretation of the code sample above would be to do the following:
Context ctx = Context.NONE;
Contexts.with(ctx).setProgressListener(progressListener);
httpClient.send(request, ctx);

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Comment on lines 7 to 9
- Added ability to track progress by passing `ProgressReporter` in the `Context`.
I.e., `Contexts.with(context).setProgressReporter(progressReporter)`
before calling `HttpClient.send(HttpRequest, Context)` API.
Copy link
Member

Choose a reason for hiding this comment

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

Same as above

Comment on lines 66 to 74
public static final class Keys {
private Keys() {
}

/**
* A {@link Context} key for the outgoing request's {@link ProgressReporter}.
*/
public static final String HTTP_REQUEST_PROGRESS_REPORTER = "com.azure.core.http.request.progress.reporter";
}
Copy link
Member

Choose a reason for hiding this comment

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

Does this need to be public? If so, I'd be inclined to move this to Contexts as static fields named KEY_* or *_KEY.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

For the first question. This is to make insertions in async flows more memory efficient.
I.e. this

       ProgressReporter progressReporter = null;
        Flux.just(1)
            .contextWrite(
                ctx -> ctx.put(Contexts.Keys.HTTP_REQUEST_PROGRESS_REPORTER, progressReporter)
            ).subscribe();

is less involved than

        ProgressReporter progressReporter = null;
        Flux.just(1)
            .contextWrite(
                FluxUtil.toReactorContext(
                    Contexts.empty().setHttpRequestProgressReporter(progressReporter).getContext()
                )
            ).subscribe();

For the second question.
We could do KEY_* (i.e. prefix is better). However, if I type Contexts. in the IDE I'm going to have all those keys show up in hints. Isn't this a concern?

parent.reportProgress(progress);
}
if (progressListener != null) {
progressListener.handleProgress(totalProgress);
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@rickle-msft Yeah, this particular piece got attention.

/*
It is typically a bad idea to lock around customer code (which the progressReceiver is) because they could
never release the lock. However, we have decided that it is sufficiently difficult for them to make their
progressReporting code threadsafe that we will take that burden and the ensuing risks. Although it is the
case that only one thread is allowed to be in onNext at once, there are multiple independent
requests happening at once to stage/download separate chunks, so we still need to lock either way.
*/
transferLock.lock();
this.progressReceiver.reportProgress(this.totalProgress.addAndGet(bytesTransferred));
transferLock.unlock();

The comment there seems to promise that by introducing the lock magically makes user code thread safe and pushes that burden on us... Which is overpromising...

That lock in existing reporters has more traps than benefits, i.e.:

  1. with or without lock there's no guarantee of sequencing in paralleled scenarios.
  2. we're not assuring any thread safety, customer has to use volatile fields in their handler.
  3. if we happen to be on a thread where reactor.core.scheduler.Schedulers.isInNonBlockingThread() (or on NIO single threaded event loop) we might run into deadlock/resource starvation.

Therefore we'd rather guide user towards success, by

  1. letting them know that they have to provide thread safe implementation. Here https://github.com/kasobol-msft/azure-sdk-for-java/blob/67837d151e5185897506627de50f5dbefa84abaf/sdk/core/azure-core/src/main/java/com/azure/core/util/ProgressListener.java#L59-L62
  2. not locking by default, if user falls into traps above they can mitigate by altering their code.

@kasobol-msft kasobol-msft merged commit 8cf0339 into Azure:main Jun 22, 2022
kwonus-msft pushed a commit to kwonus-msft/azure-sdk-for-java-kw that referenced this pull request Jun 24, 2022
)

* progress reporter.

* contexts

* comment.

* this works.

* progress handlers for http clients.

* vertx.

* fix build.

* changelogs.

* poke ci

* align naming with existing versions.

* functional interface.

* getContext.

* this might come handy.

* some PR feedback.

* remove progress handler after request./

* some feedback.

* add sendSync test.

* wip.

* contexts.

* make it final.

* changelog.

* rename this.

* sample update.

* Update sdk/core/azure-core/src/main/java/com/azure/core/util/ProgressReporter.java

Co-authored-by: Srikanta <[email protected]>

* pr feedback.

* samples in chlog.

* hide keys for now.

Co-authored-by: Srikanta <[email protected]>
kwonus-msft added a commit that referenced this pull request Jun 27, 2022
…tics (#29643)

* Inititial deltas: from microseconds to millisecondsI

* Fixed failed implementation that was reporting 0.0 milliseconds due to integer arithmetic

* Update changelog with PR reference.

* Updated changelog from present tense to past tense (convert ->
converted)

* Merge out from main

* Shortened the summary in changelog.

* dd formatting to changelog

* [Automation] Generate Fluent Lite from mediaservices#package-account-2021-11 (#29595)

* [Automation] Generate Fluent Lite from mediaservices#package-account-2021-11

* Update pom.xml

Co-authored-by: Weidong Xu <[email protected]>

* Increment versions for mediaservices releases (#29598)

Increment package versions for mediaservices releases

* DPG, support latest sdk automation design (#29533)

* latest codegen

* support new design of dpg sdk automation

* support EnableBatchRelease

* remove profile for coverage

* Remove coverage profile from service pom (#29572)

* Remove coverage profile from service pom

* update spring service pom

* fix build failures

* fix script that updates service pom

* resourcemanagerhybrid ci

* Support kafka of azure indentity token credentials and configuration (#29404)

* remove secondary code owner from Search (#29585)

* Mgmt network supports priority (#29503)

* codegen

* changelog for version update

* supports priority

supports priority

* session-records

* related session-records

* changelog for feature

* revapi.skip=true

* nit, remove spaces

* Update sdk/resourcemanager/azure-resourcemanager-network/src/main/java/com/azure/resourcemanager/network/models/ApplicationGatewayRequestRoutingRule.java

Co-authored-by: Weidong Xu <[email protected]>

* fix doc

* code refactor and fix javadoc

* fix javadoc

* exclude samples from code coverage report

* make exclude projects an argument of the script

* rename script parameter

Co-authored-by: Weidong Xu <[email protected]>

* Enable Form Recognizer disabled tests (#29545)

* Increment dependency versions for Key Vault and Container Registry (#29594)

* Updated dependency versions for Key Vault, Form Recognizer and Container Registry. Also updated Key Vault CHANGELOGs.

* Updated a couple more READMEs.

* Reverted version change for Form Recognizer.

* Progress reporter promoted to core and used in Http Client. (#29495)

* progress reporter.

* contexts

* comment.

* this works.

* progress handlers for http clients.

* vertx.

* fix build.

* changelogs.

* poke ci

* align naming with existing versions.

* functional interface.

* getContext.

* this might come handy.

* some PR feedback.

* remove progress handler after request./

* some feedback.

* add sendSync test.

* wip.

* contexts.

* make it final.

* changelog.

* rename this.

* sample update.

* Update sdk/core/azure-core/src/main/java/com/azure/core/util/ProgressReporter.java

Co-authored-by: Srikanta <[email protected]>

* pr feedback.

* samples in chlog.

* hide keys for now.

Co-authored-by: Srikanta <[email protected]>

* Cosmos Spark Connector: Adding .Net/C# port of the NYC-Taxi-Data sample (#29600)

* mgmt, generate desktopvirtualization with async methods in serviceClient (#29582)

* Increment versions for desktopvirtualization releases (#29610)

Increment package versions for desktopvirtualization releases

* codegen (#29612)

* Update CODEOWNERS (#29606)

* Use new credential APIs in Spring Service Bus and Event Hubs and add more test cases (#29484)

* use new credential APIs in Service Bus and Event Hubs and add more test cases
* fix compatibility error across spring boot versions
* add more tests

* [Automation] Generate Fluent Lite from extendedlocation#package-2021-08-31-preview (#29616)

* [Automation] Generate Fluent Lite from digitaltwins#package-2022-05 (#29615)

* Increment versions for orbital releases (#29614)

Increment package versions for orbital releases

* Increment versions for extendedlocation releases (#29619)

Increment package versions for extendedlocation releases

* Implement sendSync in OkHttpClient (#29601)

* simplify request body creation.

* sync okhttp client.

* test buffered responses.

* chlog.

* body's closeable.

* Prepare BOM patch release for June 2022 (#29604)

* Updated versions to latest stable releases.

* Reverted change to AOT GraalVM's POM on Form Recognizer dependency version to use the latest beta instead of the latest stable. Added a beta entry for Form Recognizer on `version_client.txt`.

* Updated BOM version in POM, README and CHANGELOG.

* Reverted `version_client.txt` and AOT GraalVM POM changes.

* Enable Batch release for metricsadvisor (#29622)

* RestProxy Always validate fluxes and inputstreams. (#29603)

* Always validate fluxes and inputstreams.

* unused.

* rebase again
remove epoll dependency from module-info (#29509)

* remove epoll dependency from module-info

Co-authored-by: annie-mac <[email protected]>
Co-authored-by: annie-mac <[email protected]>
Co-authored-by: annie-mac <[email protected]>
Co-authored-by: annie-mac <[email protected]>

* Increment package versions for digitaltwins releases (#29630)

* [ISSUE-29566] Add configuration for visibility timeout in StorageQueueMessageSource (#29567)

* [ISSUE-29566] Add configuration for visibility timeout in StorageQueueMessageSource

* [ISSUE-29566] Adding documentation to sdk/spring/CHANGELOG

Co-authored-by: Soumabrata Chakraborty <[email protected]>

* update codegen to 4.1.0 (#29633)

* mgmt, prepare release 2.16.0 (#29632)

* version_client.txt

* pom.xml

* readme.md

* changelog.md

* samples.json

* autocent

* Fix compatibility tests of deleting range (#29631)

* fix delete range
* add maven pom
* exclude wiremock-jre8

* Performance improvement for case insensitive queries (#29597)

* Performance update for case insensitive queries. No unit tests needed as functionality is already tested with existing tests.

* Fixing logic error.

* Updating logic to be more accurate, including addinga new CriteriaType function. Also added unit tests.

* Adding performance enhancing logic for IS_EQUAL and unit tests.

* Fixing IS_EQUAL performance logic related to case insensitive search and added unit tests.

* Fixing code style issues.

* Update CriteriaType.java

* Update AbstractQueryGenerator.java

* Update CriteriaType.java

* Update AbstractQueryGenerator.java

* Update AbstractQueryGenerator.java

Co-authored-by: Fabian Meiswinkel <[email protected]>

* Increment version for resourcemanager releases (#29636)

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-resources

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-storage

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-authorization

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-keyvault

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-msi

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-network

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-compute

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-sql

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-dns

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-cosmos

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-appservice

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-containerservice

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-eventhubs

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-monitor

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-containerregistry

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-appplatform

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-containerinstance

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-privatedns

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-redis

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-trafficmanager

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-servicebus

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-cdn

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager-search

* Increment package version after release of com.azure.resourcemanager azure-resourcemanager

* Update ResourceManager pipeline to use batch release (#29642)

* Update ResourceManager pipeline to use batch release

* Move azure-resourcemanager-samples to AdditionalModules

* Tracing docs improvements (#29623)

* tracing docs update

* Update Dockerfile image references to avoid using external ones (#29626)

For more info on the requirement see https://aka.ms/containers-security-guidance to remove the reference of container images from external registries

* Sync eng/common directory with azure-sdk-tools for PR 3481 (#29625)

* Support local addons path override in stress test deployment

* Support username based deployId in local stress deployment

* Support WhatIf in stress infrastructure provision script

* Simplify stress user detection

Co-authored-by: Wes Haggard <[email protected]>

* Run helm plugin add with helper

* Add WhatIf support to ps module install helper function

Co-authored-by: Ben Broderick Phillips <[email protected]>
Co-authored-by: Wes Haggard <[email protected]>

* Fixed merge conflicts in CHANGELOG

* Merge out from main

* Inadvertantly reversed a delta with a rebase. re-applying.

* Update spotbugs xml. with correct unit string

Co-authored-by: Azure SDK Bot <[email protected]>
Co-authored-by: Weidong Xu <[email protected]>
Co-authored-by: Srikanta <[email protected]>
Co-authored-by: Yi Liu <[email protected]>
Co-authored-by: Shawn Fang <[email protected]>
Co-authored-by: Xiaofei Cao <[email protected]>
Co-authored-by: Sameeksha Vaity <[email protected]>
Co-authored-by: vcolin7 <[email protected]>
Co-authored-by: Kamil Sobol <[email protected]>
Co-authored-by: Fabian Meiswinkel <[email protected]>
Co-authored-by: Xiaolu Dai <[email protected]>
Co-authored-by: James Suplizio <[email protected]>
Co-authored-by: annie-mac <[email protected]>
Co-authored-by: annie-mac <[email protected]>
Co-authored-by: annie-mac <[email protected]>
Co-authored-by: annie-mac <[email protected]>
Co-authored-by: Soumabrata Chakraborty <[email protected]>
Co-authored-by: Soumabrata Chakraborty <[email protected]>
Co-authored-by: Muyao Feng <[email protected]>
Co-authored-by: Trevor Anderson <[email protected]>
Co-authored-by: Liudmila Molkova <[email protected]>
Co-authored-by: Milis <[email protected]>
Co-authored-by: Ben Broderick Phillips <[email protected]>
Co-authored-by: Wes Haggard <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Azure.Core azure-core
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants