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

Add partitioned user cache #2881

Merged
merged 5 commits into from
Sep 30, 2021
Merged

Add partitioned user cache #2881

merged 5 commits into from
Sep 30, 2021

Conversation

pmaytak
Copy link
Contributor

@pmaytak pmaytak commented Sep 8, 2021

Fixes #2861.

Changes proposed in this request

  • Added InMemoryPartitionedUserTokenCacheAccessor and InMemoryPartitionedAppTokenCacheAccessor. (Basically the main change.) The app cache implements collections and methods only for access tokens and app metadata. The underlying collections are partitioned by a key which is returned from CacheKeyFactory.
  • The partition key is
    • App cache:
      • AT - client ID + tenant ID
      • App metadata - not partitioned.
    • User cache:
      • AT, RT: user assertion hash for OBO, home account ID, otherwise.
      • ID, Accounts: home account ID.
      • App metadata - not partitioned.
  • For Save, Get, Delete methods, the partition key is derived from the data in the passed in cache items or cache keys.
  • For GetAll methods, the partition key is provided by the caller; if null, all cache items are returned.
  • Updated any callers of the cache accessor methods to correctly call them. For ex, methods that call GetAll to provide the partition key when appropriate.
  • Updated AbstractPlatformProxy to return correct either app or user cache instance (which is called from TokenCache).
    • Moved the CreateTokenCacheAccessor method from specific proxy classes to the abstract base class.
  • Do not invoke ADAL legacy cache operations when external serialization is not configured.
  • Simplified ITokenCacheAccessor interface (removed some unused methods, updated method signatures).
  • Updated the serialization flag logic in TokenCacheInternal related to IsAppSubscribedToSerializationEvents and IsAppSubscribedToSerializationEvents.
  • Moved IsExpired logic into MsalAccessTokenCacheItem class.
  • Moved HasAccessOrRefreshTokens logic into the accessor classes.
  • Created new tests and updated the current ones to work correctly with new cache (details in the next section).
  • Additional minor changes like comments, fixing dev apps, etc.

Testing

Performance impact

  • Each table has results for one method.
  • Since current (old) cache is not partitioned, there are Partitions * TokensPerPartition number of items in the flat cache.
  • IsMultiTenant flag represents a scenario when tokens are requested for different tenants or just for one tenant.
    • If it's False, there are TokensPerPartition number of access tokens in each partition but only 1 refresh token, ID token, and account per partition.
    • If it's True, because of tenant profiles, this means there will be also be TokensPerPartition number of ID tokens and account cache items per partition. (So 3x number of cache items than above. The number of access tokens is still the same as above regardless of the flag.)
    • There's always 1 refresh token in each partition.
    • Certain rows have no data because either the test setup or test duration took too long.

Summary: The results show that partitioned cache performs better than flat cache (in some cases 1000x) and allocates less memory because only the data in the partition is filtered through instead of the whole cache.

BenchmarkDotNet=v0.13.1, OS=Windows 10.0.19043.1237 (21H1/May2021Update)
Intel Core i7-9850H CPU 2.60GHz, 1 CPU, 12 logical and 6 physical cores
.NET SDK=6.0.100-preview.7.21379.14
  Job-PerfTests : .NET Core 3.1.19 (CoreCLR 4.700.21.41101, CoreFX 4.700.21.41603), X86 RyuJIT
Method Tenants TokensPerTenant Mean Error StdDev Median Min Max Gen 0 Gen 1 Gen 2 Allocated
AcquireTokenForClient_Old 1 10000 4.062ms 0.3862ms 1.139ms 3.899ms 2.393ms 6.831ms - - - 1 MB
AcquireTokenForClient_New 1 10000 3,668.2μs 275.34μs 798.80μs 3,597.5μs 2,302.0μs 5,658.8μs - - - 1,079 KB
AcquireTokenForClient_Old 1 100000 54.42ms 1.061ms 0.940ms 54.03ms 53.52ms 56.77ms 1000.0000 1000.0000 - 9 MB
AcquireTokenForClient_New 1 100000 56.90ms 1.077ms 0.954ms 57.10ms 54.91ms 58.49ms 1000.0000 1000.0000 - 9 MB
AcquireTokenForClient_Old 100 10000 3.385ms 0.1073ms 0.3096ms 3.282ms 2.725ms 4.222ms - - - 1 MB
AcquireTokenForClient_New 100 10000 3,295.9μs 74.36μs 209.73μs 3,219.0μs 2,941.3μs 3,933.2μs - - - 1,079 KB
AcquireTokenForClient_Old 1000 1000 514.8μs 25.47μs 70.15μs 494.1μs 416.7μs 735.3μs - - - 107 KB
AcquireTokenForClient_New 1000 1000 568.9μs 45.05μs 126.3μs 515.0μs 442.1μs 911.7μs - - - 107 KB
AcquireTokenForClient_Old 10000 100 191.0μs 10.03μs 25.70μs 187.2μs 164.2μs 329.2μs - - - 30 KB
AcquireTokenForClient_New 10000 100 194.9μs 10.07μs 25.63μs 188.9μs 167.6μs 298.0μs - - - 30 KB
Method Partitions TokensPerPartition IsMultiTenant Mean Error StdDev Median Min Max Gen 0 Gen 1 Allocated
AcquireTokenSilent_Old 1 10000 False 4,503.1 μs 422.01 μs 1,237.68 μs 4,296.0 μs 2,389.30 μs 7,365.7 μs - - 1 MB
AcquireTokenSilent_New 1 10000 False 4,864.5 μs 446.56 μs 1,309.69 μs 4,867.4 μs 2,771.5 μs 8,436.6 μs - - 1 MB
AcquireTokenSilent_Old 1 10000 True 6,615.3 μs 277.81 μs 814.76 μs 6,544.6 μs 5,325.90 μs 8,882.9 μs - - 2 MB
AcquireTokenSilent_New 1 10000 True 7,116.7 μs 224.98 μs 656.27 μs 7,102.4 μs 5,838.9 μs 8,566.2 μs - - 2 MB
AcquireTokenSilent_Old 1 100000 False 61,699.4 μs 1,175.94 μs 1,042.44 μs 61,388.4 μs 60,316.60 μs 63,836.4 μs 1000.0000 1000.0000 10 MB
AcquireTokenSilent_New 1 100000 False 63,371.3 μs 1,035.63 μs 808.55 μs 63,405.1 μs 61,878.5 μs 64,515.5 μs 1000.0000 1000.0000 10 MB
AcquireTokenSilent_Old 1 100000 True 104,702.6 μs 2,057.68 μs 1,824.08 μs 104,626.6 μs 101,582.15 μs 107,434.4 μs 1000.0000 1000.0000 19 MB
AcquireTokenSilent_New 1 100000 True 108,210.0 μs 2,162.09 μs 2,313.41 μs 108,077.2 μs 105,021.4 μs 112,674.6 μs 1000.0000 1000.0000 19 MB
AcquireTokenSilent_Old 100 10000 False 349,247.0 μs 6,932.62 μs 14,161.51 μs 343,493.4 μs 320,051.50 μs 377,348.1 μs - - 26 MB
AcquireTokenSilent_New 100 10000 False 4,274.0 μs 106.68 μs 293.83 μs 4,184.1 μs 3,864.3 μs 5,194.6 μs - - 1 MB
AcquireTokenSilent_Old 100 10000 True NA NA NA NA NA NA - - -
AcquireTokenSilent_New 100 10000 True NA NA NA NA NA NA - - -
AcquireTokenSilent_Old 1000 1000 False 382,821.5 μs 7,625.69 μs 10,438.13 μs 385,766.3 μs 356,676.15 μs 398,386.3 μs - - 25 MB
AcquireTokenSilent_New 1000 1000 False 683.5 μs 45.60 μs 133.01 μs 631.6 μs 505.6 μs 1,067.6 μs - - 134 KB
AcquireTokenSilent_Old 1000 1000 True NA NA NA NA NA NA - - -
AcquireTokenSilent_New 1000 1000 True NA NA NA NA NA NA - - -
AcquireTokenSilent_Old 10000 100 False 421,165.8 μs 8,913.98 μs 26,283.08 μs 434,662.8 μs 347,163.75 μs 446,264.3 μs - - 26 MB
AcquireTokenSilent_New 10000 100 False 275.1 μs 24.06 μs 64.23 μs 244.4 μs 228.1 μs 509.1 μs - - 46 KB
AcquireTokenSilent_Old 10000 100 True NA NA NA NA NA NA - - -
AcquireTokenSilent_New 10000 100 True NA NA NA NA NA NA - - -
AcquireTokenSilent_Old 100000 1 False 98,130 μs 1,943 μs 3,503 μs 97,160 μs 92,190 μs 108,100 μs 1000.0000 1000.0000 12 MB
AcquireTokenSilent_New 100000 1 False 242.9 μs 28.62 μs 76.89 μs 212.1 μs 196.2 μs 488.2 μs - - 37 KB
AcquireTokenSilent_Old 100000 1 True NA NA NA NA NA - - - -
AcquireTokenSilent_New 100000 1 True 273.5 μs 37.81 μs 107.27 μs 215.8 μs 198.2 μs 567.5 μs - - 37 KB

image
image

Method Partitions TokensPerPartition IsMultiTenant Mean Error StdDev Median Min Max Gen 0 Gen 1 Allocated
GetAccountAsync_Old 1 10000 False 251.1 μs 58.87 μs 171.74 μs 165.1 μs 101.60 μs 701.7 μs - - 8 KB
GetAccountAsync_New 1 10000 False 188.1 μs 44.10 μs 124.37 μs 133.70 μs 85.20 μs 569.4 μs - - 7 KB
GetAccountAsync_Old 1 10000 True 7,523.5 μs 219.18 μs 639.37 μs 7,500.6 μs 6,300.05 μs 8,997.9 μs - - 2 MB
GetAccountAsync_New 1 10000 True 8,097.9 μs 215.21 μs 624.36 μs 8,097.30 μs 6,833.60 μs 9,999.7 μs - - 2 MB
GetAccountAsync_Old 1 100000 False 120.1 μs 13.33 μs 35.13 μs 109.5 μs 99.90 μs 248.7 μs - - 8 KB
GetAccountAsync_New 1 100000 False 102.8 μs 2.88 μs 7.58 μs 101.45 μs 91.05 μs 127.8 μs - - 7 KB
GetAccountAsync_Old 1 100000 True 120,510.0 μs 2,393.27 μs 2,238.67 μs 119,891.9 μs 117,434.60 μs 124,043.5 μs 2000.0000 2000.0000 25 MB
GetAccountAsync_New 1 100000 True 130,073.8 μs 1,489.90 μs 1,320.76 μs 129,632.60 μs 128,037.25 μs 132,578.6 μs 2000.0000 2000.0000 25 MB
GetAccountAsync_Old 100 10000 False 2,197.8 μs 56.21 μs 162.19 μs 2,178.9 μs 1,943.50 μs 2,632.1 μs - - 1 MB
GetAccountAsync_New 100 10000 False 104.1 μs 3.37 μs 8.63 μs 100.95 μs 95.65 μs 147.2 μs - - 7 KB
GetAccountAsync_Old 100 10000 True NA NA NA NA NA NA - - -
GetAccountAsync_New 100 10000 True NA NA NA NA NA NA - - -
GetAccountAsync_Old 1000 1000 False 184,943.6 μs 2,256.77 μs 2,110.99 μs 184,545.0 μs 182,005.40 μs 188,544.9 μs 16000.0000 1000.0000 86 MB
GetAccountAsync_New 1000 1000 False 116.1 μs 13.07 μs 35.33 μs 102.10 μs 91.10 μs 224.1 μs - - 7 KB
GetAccountAsync_Old 1000 1000 True NA NA NA NA NA NA - - -
GetAccountAsync_New 1000 1000 True NA NA NA NA NA NA - - -
GetAccountAsync_Old 10000 100 False 28,679,415.8 μs 462,608.12 μs 475,064.48 μs 28,493,149.1 μs 28,254,695.35 μs 29,861,163.1 μs 1895000.0000 45000.0000 9.9 GB
GetAccountAsync_New 10000 100 False 126.1 μs 20.59 μs 57.39 μs 98.50 μs 90.80 μs 294.5 μs - - 7 KB
GetAccountAsync_Old 10000 100 True NA NA NA NA NA NA - - -
GetAccountAsync_New 10000 100 True NA NA NA NA NA NA - - -
GetAccountAsync_Old 100000 1 False NA NA NA NA NA - - -
GetAccountAsync_New 100000 1 False 109.9 μs 11.58 μs 30.71 μs 97.90 μs 91.90 μs 233.9 μs - - 7 KB
GetAccountAsync_Old 100000 1 True NA NA NA NA NA - - -
GetAccountAsync_New 100000 1 True 134.3 μs 21.63 μs 61.72 μs 102.20 μs 94.20 μs 313.0 μs - - 7 KB

image
image

Method Partitions TokensPerPartition IsMultiTenant Mean Error StdDev Median Min Max Gen 0 Gen 1 Allocated
GetAccountsAsync_Old 1 10000 False 195.9 μs 41.82 μs 118.63 μs 144.9 μs 97.10 μs 554.1 μs - - 8 KB
GetAccountsAsync_New 1 10000 False 174.6 μs 35.24 μs 99.39 μs 135.40 μs 93.35 μs 462.4 μs - - 7 KB
GetAccountsAsync_Old 1 10000 True 7,513.9 μs 194.03 μs 569.07 μs 7,515.6 μs 6,464.30 μs 8,639.8 μs - - 2 MB
GetAccountsAsync_New 1 10000 True 8,069.8 μs 196.56 μs 570.24 μs 8,060.90 μs 6,737.10 μs 9,418.0 μs - - 2 MB
GetAccountsAsync_Old 1 100000 False 112.6 μs 3.57 μs 9.29 μs 110.1 μs 97.70 μs 153.1 μs - - 8 KB
GetAccountsAsync_New 1 100000 False 109.1 μs 6.15 μs 15.98 μs 103.90 μs 93.70 μs 198.6 μs - - 7 KB
GetAccountsAsync_Old 1 100000 True 117,742.4 μs 2,329.37 μs 1,945.13 μs 117,765.9 μs 115,466.05 μs 122,689.1 μs 2000.0000 2000.0000 25 MB
GetAccountsAsync_New 1 100000 True 129,455.9 μs 2,541.07 μs 2,495.67 μs 129,096.20 μs 125,403.05 μs 133,779.1 μs 2000.0000 2000.0000 25 MB
GetAccountsAsync_Old 100 10000 False 2,071.3 μs 46.92 μs 134.62 μs 1,989.0 μs 1,944.55 μs 2,441.9 μs - - 1 MB
GetAccountsAsync_New 100 10000 False 729.6 μs 43.69 μs 126.04 μs 681.70 μs 613.20 μs 1,156.1 μs - - 206 KB
GetAccountsAsync_Old 100 10000 True NA NA NA NA NA NA - - -
GetAccountsAsync_New 100 10000 True NA NA NA NA NA NA - - -
GetAccountsAsync_Old 1000 1000 False 194,731.5 μs 3,684.24 μs 4,242.77 μs 194,049.1 μs 187,383.05 μs 204,931.0 μs 16000.0000 16000.0000 86 MB
GetAccountsAsync_New 1000 1000 False 21,609.1 μs 265.18 μs 235.08 μs 21,659.75 μs 21,307.20 μs 22,108.1 μs - - 2 MB
GetAccountsAsync_Old 1000 1000 True NA NA NA NA NA NA - - -
GetAccountsAsync_New 1000 1000 True NA NA NA NA NA NA - - -
GetAccountsAsync_Old 10000 100 False 28,583,479.2 μs 130,065.19 μs 108,610.33 μs 28,600,185.3 μs 28,336,194.20 μs 28,743,800.4 μs 1895000.0000 19000.0000 9.9 GB
GetAccountsAsync_New 10000 100 False 3,055,220.3 μs 44,967.57 μs 39,862.58 μs 3,061,717.10 μs 2,956,197.65 μs 3,099,438.5 μs 3000.0000 1000.0000 20 MB
GetAccountsAsync_Old 10000 100 True NA NA NA NA NA NA - - -
GetAccountsAsync_New 10000 100 True NA NA NA NA NA NA - - -

image
image

Method Partitions TokensPerPartition IsMultiTenant Mean Error StdDev Median Min Max Gen 0 Allocated
RemoveAccountAsync_Old 1 10000 False 8,620.8 μs 199.21 μs 568.35 μs 8,612.1 μs 7,469.25 μs 9,820.5 μs 1000.0000 - 9 MB
RemoveAccountAsync_New 1 10000 False 9,209.53 μs 179.619 μs 482.536 μs 9,229.75 μs 8,035.80 μs 10,201.0 μs 1000.0000 - 9 MB
RemoveAccountAsync_Old 1 10000 True 25,795.4 μs 512.97 μs 911.80 μs 25,679.1 μs 24,220.70 μs 27,943.4 μs 4000.0000 - 22 MB
RemoveAccountAsync_New 1 10000 True 29,428.26 μs 583.021 μs 1,150.827 μs 29,327.30 μs 27,246.25 μs 32,325.0 μs 4000.0000 - 22 MB
RemoveAccountAsync_Old 1 100000 False 111,152.4 μs 1,732.01 μs 1,535.38 μs 111,356.8 μs 108,430.90 μs 113,839.5 μs 16000.0000 - 89 MB
RemoveAccountAsync_New 1 100000 False 116,977.64 μs 1,837.720 μs 1,534.579 μs 117,532.40 μs 114,188.50 μs 119,582.0 μs 16000.0000 - 89 MB
RemoveAccountAsync_Old 1 100000 True 308,459.8 μs 5,971.10 μs 5,293.22 μs 309,085.6 μs 298,292.90 μs 318,073.5 μs 41000.0000 41000.0000 224 MB
RemoveAccountAsync_New 1 100000 True 344,452.15 μs 6,857.738 μs 10,472.490 μs 344,358.00 μs 325,351.00 μs 365,052.9 μs 41000.0000 - 224 MB
RemoveAccountAsync_Old 100 10000 False 352,816.3 μs 8,958.74 μs 26,415.06 μs 362,890.8 μs 278,358.30 μs 389,468.1 μs 1000.0000 1000.0000 25 MB
RemoveAccountAsync_New 100 10000 False 22,824.25 μs 1,180.243 μs 3,479.974 μs 22,932.35 μs 13,634.55 μs 29,694.3 μs 1000.0000 - 9 MB
RemoveAccountAsync_Old 100 10000 True NA NA NA NA NA NA - - -
RemoveAccountAsync_New 100 10000 True NA NA NA NA NA NA - - -
RemoveAccountAsync_Old 1000 1000 False 307,899.1 μs 6,140.76 μs 7,310.13 μs 310,585.5 μs 286,210.80 μs 317,466.7 μs - - 17 MB
RemoveAccountAsync_New 1000 1000 False 880.63 μs 41.703 μs 121.648 μs 818.85 μs 766.30 μs 1,239.9 μs - - 895 KB
RemoveAccountAsync_Old 1000 1000 True NA NA NA NA NA NA - - -
RemoveAccountAsync_New 1000 1000 True NA NA NA NA NA NA - - -
RemoveAccountAsync_Old 10000 100 False 296,941.8 μs 5,639.44 μs 5,275.14 μs 298,192.7 μs 281,065.00 μs 303,375.7 μs - - 17 MB
RemoveAccountAsync_New 10000 100 False 198.69 μs 20.351 μs 57.067 μs 185.45 μs 128.65 μs 336.1 μs - - 96 KB
RemoveAccountAsync_Old 10000 100 True NA NA NA NA NA NA - - -
RemoveAccountAsync_New 10000 100 True NA NA NA NA NA NA - -
RemoveAccountAsync_Old 100000 1 False 109,790 μs 2,184 μs 4,701 μs 110,280 μs 97,340 μs 117,800 μs - - 6 MB
RemoveAccountAsync_New 100000 1 False 96.11 μs 3.237 μs 8.584 μs 94.60 μs 84.85 μs 129.2 μs - - 7 KB
RemoveAccountAsync_Old 100000 1 True NA NA NA NA NA - - -
RemoveAccountAsync_New 100000 1 True 91.89 μs 2.392 μs 6.088 μs 91.35 μs 80.70 μs 107.8 μs - - 7 KB

image
image

Method Partitions TokensPerPartition IsMultiTenant Mean Error StdDev Median Min Max Gen 0 Gen 1 Allocated
AcquireTokenOBO_Old 1 10000 False 5.971 ms 0.4562 ms 1.3450 ms 6.094 ms 3.540 ms 8.540 ms - - 1 MB
AcquireTokenOBO_New 1 10000 False 5,629.0 μs 376.16 μs 1,109.12 μs 5,628.1 μs 3,778.2 μs 8,405.0 μs - - 1 MB
AcquireTokenOBO_Old 1 10000 True 8.900 ms 0.3148 ms 0.9184 ms 8.866 ms 7.214 ms 11.385 ms - - 2 MB
AcquireTokenOBO_New 1 10000 True 8,857.7 μs 276.45 μs 775.21 μs 8,669.6 μs 7,507.1 μs 10,813.0 μs - - 2 MB
AcquireTokenOBO_Old 1 100000 False 76.822 ms 0.8551 ms 0.7999 ms 76.681 ms 75.743 ms 78.620 ms 1000.0000 1000.0000 10 MB
AcquireTokenOBO_New 1 100000 False 75,258.9 μs 1,483.49 μs 1,708.39 μs 74,647.9 μs 73,439.4 μs 78,983.1 μs 1000.0000 - 10 MB
AcquireTokenOBO_Old 1 100000 True 140.104 ms 2.6776 ms 3.4816 ms 139.427 ms 135.014 ms 149.352 ms 1000.0000 1000.0000 20 MB
AcquireTokenOBO_New 1 100000 True 127,715.8 μs 2,351.89 μs 1,963.94 μs 128,075.9 μs 123,861.9 μs 131,032.6 μs 1000.0000 1000.0000 20 MB
AcquireTokenOBO_Old 100 10000 False 339.180 ms 6.7663 ms 6.6454 ms 339.696 ms 330.837 ms 355.247 ms - - 17 MB
AcquireTokenOBO_New 100 10000 False 5,386.6 μs 177.74 μs 507.09 μs 5,191.2 μs 4,594.5 μs 6,843.9 μs - - 1 MB
AcquireTokenOBO_Old 100 10000 True NA NA NA NA NA NA - - -
AcquireTokenOBO_New 100 10000 True NA NA NA NA NA NA - - -
AcquireTokenOBO_Old 1000 1000 False 333.007 ms 6.3328 ms 5.6139 ms 334.473 ms 326.644 ms 345.837 ms - - 16 MB
AcquireTokenOBO_New 1000 1000 False 780.3 μs 56.92 μs 164.22 μs 713.8 μs 591.4 μs 1,189.0 μs - - 139 KB
AcquireTokenOBO_Old 1000 1000 True NA NA NA NA NA NA - - -
AcquireTokenOBO_New 1000 1000 True NA NA NA NA NA NA - - -
AcquireTokenOBO_Old 10000 100 False 340.016 ms 3.9663 ms 3.5160 ms 341.384 ms 333.081 ms 343.470 ms - - 17 MB
AcquireTokenOBO_New 10000 100 False 354.1 μs 38.67 μs 111.56 μs 301.6 μs 260.0 μs 647.7 μs - - 52 KB
AcquireTokenOBO_Old 10000 100 True NA NA NA NA NA NA - - -
AcquireTokenOBO_New 10000 100 True NA NA NA NA NA NA - - -
AcquireTokenOBO_Old 100000 1 False 101.5 ms 2.02 ms 5.10 ms 102.4 ms 87.51 ms 114.1 ms 1000.0000 - 11 MB
AcquireTokenOBO_New 100000 1 False 249.6 μs 9.61 μs 24.99 μs 238.2 μs 222.8 μs 324.6 μs - - 43 KB
AcquireTokenOBO_Old 100000 1 True 106.1 ms 2.10 ms 2.95 ms 105.8 ms 100.17 ms 113.2 ms 1000.0000 1000.0000 11 MB
AcquireTokenOBO_New 100000 1 True 303.7 μs 36.06 μs 98.71 μs 257.7 μs 233.4 μs 596.8 μs - - 43 KB

image
image

@pmaytak pmaytak changed the title Add user cache partitioned accessor Add partitioned user cache, refactor partitioned app cache Sep 10, 2021
@pmaytak pmaytak changed the title Add partitioned user cache, refactor partitioned app cache Add partitioned user cache Sep 10, 2021
@bgavrilMS
Copy link
Member

In terms of functional testing, we need to enforce that:

GetAll*(partition=null) is not called unless external cache serialization is used OR if GetAccounts() is used.

Maybe we should inject a test accessor that throws exceptions?

@bgavrilMS
Copy link
Member

Since we still do ADAL legacy cache operations, which are not partitioned, this will introduce a penalty and won't really work with the static cache idea. So I'm doing a bit of refactoring there.

@bgavrilMS
Copy link
Member

bgavrilMS commented Sep 10, 2021

In GetAccountsAsync, the partition key can never be the OBO key. It can only be the home account id. Otherwise you'll always load 0 account objects. I think this is how you implemented it today, but the code needs to be more explicit / add some comments etc.

Generally GetAccountsAsync should continue to work, even if it goes cross partition.

@pmaytak
Copy link
Contributor Author

pmaytak commented Sep 11, 2021

In GetAccountsAsync, the partition key can never be the OBO key. It can only be the home account id. Otherwise you'll always load 0 account objects. I think this is how you implemented it today, but the code needs to be more explicit / add some comments etc.

Generally GetAccountsAsync should continue to work, even if it goes cross partition.

I removed the partition key in GetAccountsAsync since it returns accounts for the whole app. For RemoveAccountInternal the partition key is always home account ID of the passed-in account.

@pmaytak pmaytak marked this pull request as ready for review September 11, 2021 01:45
Copy link
Contributor

@jmprieur jmprieur left a comment

Choose a reason for hiding this comment

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

Thanks @pmaytak and @bgavrilMS
I've left a few questions where I didn't understand.

@pmaytak
Copy link
Contributor Author

pmaytak commented Sep 21, 2021

Added performance test results in the description.

Copy link
Member

@trwalke trwalke left a comment

Choose a reason for hiding this comment

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

Minor comments but otherwise looks good, I agree with comments made by others

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