-
Notifications
You must be signed in to change notification settings - Fork 0
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
lazy load rank processor, refresh config and relaod token on expiry #12
Conversation
@@ -65,6 +69,8 @@ public PersonalizerClient(Uri endpoint, TokenCredential credential, Personalizer | |||
MultiSlotEventsRestClient = new MultiSlotEventsRestClient(_clientDiagnostics, _pipeline, stringEndpoint); | |||
ServiceConfigurationRestClient = new ServiceConfigurationRestClient(_clientDiagnostics, _pipeline, stringEndpoint); | |||
PolicyRestClient = new PolicyRestClient(_clientDiagnostics, _pipeline, stringEndpoint); | |||
_credentialType = "Token"; |
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.
As the enum you defined in RlClient, can you define the same enum type 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.
removed type and directly validating based on the assigned credential
@@ -548,34 +552,59 @@ public virtual Response ActivateMultiSlot(string eventId, CancellationToken canc | |||
} | |||
} | |||
|
|||
/// <summary> Gets the configuration details for the live model to use </summary> | |||
internal Configuration GetConfigurationForLiveModel(string authType, string authValue) | |||
/// <summary> Gets the rank process initiated with live model to use </summary> |
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.
rank processor?
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.
renamed it
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 still don't see the rename.
"weather": "rainy" | ||
"Entries": [ | ||
{ | ||
"RequestUri": "https://singleslotrecordsdktests.cognitiveservices.azure.com/personalizer/v1.1-preview.1/configurations/service", |
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 need to update sdktestmultislot in MultiSlotTest.json?
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 is single-slot tests. As we are not calling rank API when islocalInference is true, in the json file rank API response are not required
{ | ||
if ((_credentialType == "Token" && | ||
DateTimeOffset.Compare(tokenExpiry, DateTimeOffset.MinValue) != 0 && | ||
DateTimeOffset.Compare(tokenExpiry, DateTimeOffset.UtcNow) < 0) || |
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 change to <=? I am wondering about the case when the token expires right now.
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 agree with John. We need a buffer. We should be checking if token expires within a minute or two to avoid race conditions and clock skew.
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.
updated it to <=
@@ -20,11 +20,16 @@ public class PersonalizerClient | |||
private readonly HttpPipeline _pipeline; | |||
private readonly bool _isLocalInference; | |||
private string stringEndpoint; | |||
private string apiKey; | |||
private AzureKeyCredential _azureKeyCredential; |
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.
Please try to be consistent with naming conventions. Either all private variables have an underscore or none of them do. Underscore is not a CSharp standard so I would suggest leaving them out.
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.
removed _ for private variables and did cleanup
CancellationToken cancellationToken = default; | ||
AccessToken token = _tokenCredential.GetToken(tokenRequestContext, cancellationToken); | ||
config["http.api.key"] = "Bearer " + token.Token; | ||
config["HTTP_API_HEADER_KEY_NAME"] = "Authorization"; |
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 must have missed this in the VW PR. Please fix this naming to be consistent.
"http.api.key" and "HTTP_API_HEADER_KEY_NAME" are not in alignment at all. They have different delimiters, case, and structure. Please make them close to the same.
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.
updated the name
private AzureKeyCredential _azureKeyCredential; | ||
private TokenCredential _tokenCredential; | ||
private int liveModelRefreshTimeInMinutes = 15; | ||
private string _credentialType; |
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.
Better to define _credentialType
as an enum than a string. String operations are error prone, expensive, and are not IDE friendly. With that said, is _credentialType
even necessary? Why not the following?
if (_tokenCredential != null) {
// do work
} else if (_azureKeyCredential != null) {
// do work
}
//config["http.token.key"] = authValue; | ||
var tokenRequestContext = new TokenRequestContext(scopes); | ||
CancellationToken cancellationToken = default; | ||
AccessToken token = _tokenCredential.GetToken(tokenRequestContext, cancellationToken); |
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 the implementation requires a cancellationToken
it's best to propagate it to the function signature.
{ | ||
if ((_credentialType == "Token" && | ||
DateTimeOffset.Compare(tokenExpiry, DateTimeOffset.MinValue) != 0 && | ||
DateTimeOffset.Compare(tokenExpiry, DateTimeOffset.UtcNow) < 0) || |
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 agree with John. We need a buffer. We should be checking if token expires within a minute or two to avoid race conditions and clock skew.
{ | ||
_personalizerServiceProperties = ServiceConfigurationRestClient.Get(); | ||
_personalizerPolicy = PolicyRestClient.Get(); | ||
liveModelLastRefresh = DateTimeOffset.UtcNow; |
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 time should be set after the model has been updated in case an exception is thrown during update.
sdk/personalizer/Azure.AI.Personalizer/src/Models/PersonalizerClient.cs
Outdated
Show resolved
Hide resolved
sdk/personalizer/Azure.AI.Personalizer/src/Models/PersonalizerClient.cs
Outdated
Show resolved
Hide resolved
sdk/personalizer/Azure.AI.Personalizer/src/Models/PersonalizerClient.cs
Outdated
Show resolved
Hide resolved
{ | ||
if ((tokenCredential != null && | ||
DateTimeOffset.Compare(tokenExpiry, DateTimeOffset.MinValue) != 0 && | ||
DateTimeOffset.Compare(tokenExpiry, DateTimeOffset.UtcNow) <= 0) || |
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.
Token expiry need to be a couple minutes away from now.
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.
until the token expiry the same token is generated. So even with the buffer of 1 min unless the token is expired new token won't be generated with the new expiry. That's what I understood
11db8ec
to
3eafa1b
Compare
* new version client generation * fix build error * record test in new version * add changelog * update assembly and metadata * fix code generation discrepency * vnet and platform version tests (#7) * add system data validation (#9) * vnet and platform version tests * validate system data Co-authored-by: Kacie <[email protected]> * backup restore using msi (#10) * new changes * bump version * added test for private endpoint (#11) * playback * Update private endpoint test (#12) * added test for private endpoint * updated test Co-authored-by: Kacie Kang <[email protected]> Co-authored-by: Samir Solanki <[email protected]> Co-authored-by: Alan Feng <[email protected]>
* 12767912: Add isLocalInference in the public SDK * Rename the variable * Thick clent feature (#5) * 12767907: Add a package dependency on Microsoft.RL * Add RankProcessor * Remove unused file * Remove some key * Toggle commented codes so that most tests can pass * Getting the required config details for rankprocessor to enable livemode * Updating the wrong variable name * Cleanup * Revert "12767907: Add a package dependency on Microsoft.RL" This reverts commit c586920. * Revert "Add RankProcessor" This reverts commit 43967d3. * Revert "Remove unused file" This reverts commit 1e400a8. * Revert "Toggle commented codes so that most tests can pass" This reverts commit 7ec50ec. * Delete DisposeHelper.cs * Revert "Revert "12767907: Add a package dependency on Microsoft.RL"" This reverts commit d6df6b5. * Cleanup after reverting * generating client configuration using autorest * Revert "generating client configuration using autorest" This reverts commit 6b75695. * Configuration details for livemodel * cleanup * cleanup * Added ToDo comments * correct the version in endpoints Co-authored-by: Tejaswi Paruchuri <[email protected]> Co-authored-by: Tparuchuri <[email protected]> * 12768045: Add rank processor for single slot (#3) Add RankProcessor Remove unused file Remove some key Toggle commented codes so that most tests can pass RankProcessor is working. Still need to clean up the codes Add test json files only construct LiveModel when localInference is true Move rankprocessor to under model Add latest generated files from autorest Add autogenerated files from autorest Fix the setting in DecisionContext Remove wrong comment Revert unexpected auto-generated file changes Addressed a comment Move suppression to GlobalSuppressions.cs Remove the decoration in MultiSlotClient.cs Refactor rankProcessor so that the actions is not modified and restored; added a converter between sdk and Rl.Net; replace Newtonsoft.json with System.Text.Json Address comments Refactor RlObjuectConverter; remove some unneeded setters, etc. Added unit tests for RlObjectConverter, DecisionContext, JsonRawStringListConverter Remove unused using * 13009290: Create RankProcessor class to Azure Personalizer client library for .NET for multi slot (#7) * 13009290: Create RankProcessor class to Azure Personalizer client library for .NET for multi slot * Address comments * Subsampling * Cleanup and added tests * Cleanup and added tests * cleanup * cleanup * Single SubSample rate * Cleanup * Cleanup * Variable name * 13192221: Point to the Rl.Net nuget package from SDK dev drop (#9) * Adding test code for Model/Put api and moving to preview.3 * Johnhuang/13216589 reward activate local inference api (#10) * Update API view file * 13216589: Add local inference reward api 13216590: Add local inference activate api * Fix the comments * Remove IsDisposed method * Revert "Update API view file" This reverts commit 0a4dcbf. * Remove MultiSlotClient class as it is never used * Add more change after other PRs were merged * Revert "Add more change after other PRs were merged" This reverts commit 35a3120. * 13225147: Update API view file for thick client (#11) * 13225147: Update API view file for thick client * Remove some suppressing warning * Add more changes after 2 PRs were merged * lazy load rank processor, refresh config and relaod token on expiry (#12) * lazy load rank processor, refresh config and relaod token on expiry * Comments & Cleanup * Cleanup * Addressed comments * Cleanup * Fix conflict Co-authored-by: John Huang <[email protected]> * 13309375: Improve the tests by mocking LiveModel when test mode is (#14) * 13309375: Improve the tests by mocking LiveModel when test mode is Playback but using real LiveModel when test mode is Live * Change some public classes to private * Address those comments in the main PR * Update Microsoft.RL version * Rename some properties * Update Microsoft.RL version * Fix spelling check * Remove the unneeded warning * Update live model config * Use similar method names for export and import apis * Johnhuang/13170630 address thick client sdk review (#18) * 13170630: Address comments from SDK review * Update API view file * Remove unnecessary file under Gerated folder * Add more test for RLObjectConverter * Remove unused parameter * Remove unneeded comment * Update recording sessions for tests that were changed in earlier commit. (#19) Co-authored-by: Personalizer Team <[email protected]> * Update api view file after model api change (#20) * Rename modelStream to modelBody (#21) * Update Microsoft.RL version * 13678440: Some cosmetic change to address comments from DotNet team (#22) * Update method names for Export/Import models as per suggestions. (#23) * Update method names for Export/Import models as per suggestions. * Updates after running codecheck.ps1 script Co-authored-by: Personalizer Team <[email protected]> Co-authored-by: Tejaswi Paruchuri <[email protected]> Co-authored-by: Tparuchuri <[email protected]> Co-authored-by: Personalizer Team <[email protected]> Co-authored-by: Sharath Malladi <[email protected]>
All SDK Contribution checklist:
This checklist is used to make sure that common guidelines for a pull request are followed.
Draft
mode if it is:General Guidelines and Best Practices
Testing Guidelines
SDK Generation Guidelines
*.csproj
andAssemblyInfo.cs
files have been updated with the new version of the SDK. Please double check nuget.org current release version.Additional management plane SDK specific contribution checklist:
Note: Only applies to
Microsoft.Azure.Management.[RP]
orAzure.ResourceManager.[RP]
Management plane SDK Troubleshooting
If this is very first SDK for a services and you are adding new service folders directly under /SDK, please add
new service
label and/or contact assigned reviewer.If the check fails at the
Verify Code Generation
step, please ensure:generate.ps1/cmd
to generate this PR instead of callingautorest
directly.Please pay attention to the @microsoft.csharp version output after running
generate.ps1
. If it is lower than current released version (2.3.82), please run it again as it should pull down the latest version.Note: We have recently updated the PSH module called by
generate.ps1
to emit additional data. This would help reduce/eliminate the Code Verification check error. Please run following command:Old outstanding PR cleanup
Please note:
If PRs (including draft) has been out for more than 60 days and there are no responses from our query or followups, they will be closed to maintain a concise list for our reviewers.