-
Notifications
You must be signed in to change notification settings - Fork 2k
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
Conversation
API change check APIView has identified API level changes in this PR and created following API reviews. |
/azp run java - core - tests |
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(); |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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.
sdk/core/azure-core/src/main/java/com/azure/core/util/Contexts.java
Outdated
Show resolved
Hide resolved
* | ||
* @param bytesTransferred The total number of bytes transferred during this transaction. | ||
*/ | ||
void onProgress(long bytesTransferred); |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
extendcore.ProgressReceiver
so that users with existing implementations will be able to use it with new apis where we'd use core's type.
There was a problem hiding this comment.
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
public ProgressReporter createChild() { | ||
return new ProgressReporter(this); | ||
} |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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
...core/azure-core-http-netty/src/main/java/com/azure/core/http/netty/NettyAsyncHttpClient.java
Show resolved
Hide resolved
.../src/main/java/com/azure/core/http/netty/implementation/RequestProgressReportingHandler.java
Outdated
Show resolved
Hide resolved
.../src/main/java/com/azure/core/http/netty/implementation/RequestProgressReportingHandler.java
Outdated
Show resolved
Hide resolved
...core/azure-core-http-netty/src/main/java/com/azure/core/http/netty/NettyAsyncHttpClient.java
Show resolved
Hide resolved
* @return The {@link Contexts} instance. | ||
* @throws NullPointerException If {@code context} is null. | ||
*/ | ||
public static Contexts with(HttpPipelineCallContext context) { |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Other option is to make HttpPipelineCallContext.getContext
public.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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) { |
There was a problem hiding this comment.
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)
There was a problem hiding this comment.
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
Line 111 in fc24232
long effectiveResponseTimeout = context.getData(AZURE_RESPONSE_TIMEOUT) |
Also see discussion above #29495 (comment)
sdk/core/azure-core/src/main/java/com/azure/core/util/ProgressReceiver.java
Outdated
Show resolved
Hide resolved
* @return The {@link Contexts} instance. | ||
* @throws NullPointerException If {@code context} is null. | ||
*/ | ||
public static Contexts with(HttpPipelineCallContext context) { |
There was a problem hiding this comment.
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"; |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
Lines 69 to 72 in 515b782
/** | |
* 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).
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
- We want to match signature of existing
ProgressReceiver
s 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. - As for the type name we could do
ProgressReporter
and rename the otherProgressReporter
(the one that is called by our impl to publish) toProgressCollector
/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.
There was a problem hiding this comment.
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)
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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)
Lines 17 to 25 in 0a1b960
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);
}
}
??
There was a problem hiding this comment.
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).
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 { |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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) { |
There was a problem hiding this comment.
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);
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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"; |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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() { |
There was a problem hiding this comment.
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.
sdk/core/azure-core/src/main/java/com/azure/core/util/ProgressReporter.java
Outdated
Show resolved
Hide resolved
…Reporter.java Co-authored-by: Srikanta <[email protected]>
- 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. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Two things:
- s/ProgressReporter/ProgressListener
- Just to be clear - the user would need to
getContext()
and pass that in, rather than expect to mutate the existingContext
passed in to thewith
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);
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- 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. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same as above
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"; | ||
} |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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.
Lines 101 to 110 in df98d84
/* | |
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.:
- with or without lock there's no guarantee of sequencing in paralleled scenarios.
- we're not assuring any thread safety, customer has to use volatile fields in their handler.
- 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
- 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
- not locking by default, if user falls into traps above they can mitigate by altering their code.
) * 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]>
…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]>
This PR:
ProgressReporter
andProgressListener
to the core (copies exist across SDKs and should get replaced by this over time).Contexts
utility to manipulateContext
and set cross-cutting properties there.HttpClient
(with battery of tests).Note
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.
Prototypes