diff --git a/eng/Version.Details.props b/eng/Version.Details.props index 0852ee929424..0adbf769d943 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -7,95 +7,98 @@ This file should be imported by eng/Versions.props - 10.0.0-rc.1.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-beta.25377.103 - 10.0.0-beta.25377.103 - 10.0.0-beta.25377.103 - 10.0.0-beta.25377.103 - 10.0.0-beta.25377.103 - 10.0.0-beta.25377.103 - 10.0.0-beta.25377.103 - 10.0.0-rc.1.25377.103 - 10.0.0-rc.1.25377.103 - 10.0.0-rc.1.25377.103 - 10.0.0-rc.1.25377.103 - 10.0.0-rc.1.25377.103 - 10.0.0-rc.1.25377.103 - 10.0.0-rc.1.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 3.2.0-preview.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 - 10.0.0-preview.7.25377.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-beta.25409.103 + 10.0.0-beta.25409.103 + 10.0.0-beta.25409.103 + 10.0.0-beta.25409.103 + 10.0.0-beta.25409.103 + 10.0.0-beta.25409.103 + 10.0.0-beta.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 3.2.0-preview.25409.103 + 7.0.0-preview.1.603 + 7.0.0-preview.1.603 + 7.0.0-preview.1.603 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 + 10.0.0-rc.1.25409.103 4.13.0-3.24613.7 4.13.0-3.24613.7 @@ -116,10 +119,6 @@ This file should be imported by eng/Versions.props 17.12.36 17.12.36 17.12.36 - - 6.2.4 - 6.2.4 - 6.2.4 @@ -185,6 +184,9 @@ This file should be imported by eng/Versions.props $(MicrosoftNETCoreBrowserDebugHostTransportPackageVersion) $(MicrosoftNETCorePlatformsPackageVersion) $(MicrosoftWebXdtPackageVersion) + $(NuGetFrameworksPackageVersion) + $(NuGetPackagingPackageVersion) + $(NuGetVersioningPackageVersion) $(SystemCollectionsImmutablePackageVersion) $(SystemCompositionPackageVersion) $(SystemConfigurationConfigurationManagerPackageVersion) @@ -233,9 +235,5 @@ This file should be imported by eng/Versions.props $(MicrosoftBuildFrameworkPackageVersion) $(MicrosoftBuildTasksCorePackageVersion) $(MicrosoftBuildUtilitiesCorePackageVersion) - - $(NuGetFrameworksPackageVersion) - $(NuGetPackagingPackageVersion) - $(NuGetVersioningPackageVersion) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index b4b82aa78905..9196dfc49244 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -8,333 +8,333 @@ See https://github.com/dotnet/arcade/blob/master/Documentation/Darc.md for instructions on using darc. --> - + - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c @@ -358,37 +358,37 @@ - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c - + https://github.com/dotnet/dotnet - 6a953e76162f3f079405f80e28664fa51b136740 + e9f665e52848a3615736c099e5631af531b66a5c https://github.com/dotnet/extensions @@ -440,17 +440,17 @@ https://github.com/dotnet/msbuild d1cce8d7cc03c23a4f1bad8e9240714fd9d199a3 - - https://github.com/nuget/nuget.client - 8fef55f5a55a3b4f2c96cd1a9b5ddc51d4b927f8 + + https://github.com/dotnet/dotnet + e9f665e52848a3615736c099e5631af531b66a5c - - https://github.com/nuget/nuget.client - 8fef55f5a55a3b4f2c96cd1a9b5ddc51d4b927f8 + + https://github.com/dotnet/dotnet + e9f665e52848a3615736c099e5631af531b66a5c - - https://github.com/nuget/nuget.client - 8fef55f5a55a3b4f2c96cd1a9b5ddc51d4b927f8 + + https://github.com/dotnet/dotnet + e9f665e52848a3615736c099e5631af531b66a5c diff --git a/eng/common/core-templates/job/onelocbuild.yml b/eng/common/core-templates/job/onelocbuild.yml index 8034815f4213..8bf7d23355bc 100644 --- a/eng/common/core-templates/job/onelocbuild.yml +++ b/eng/common/core-templates/job/onelocbuild.yml @@ -4,7 +4,7 @@ parameters: # Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool pool: '' - + CeapexPat: $(dn-bot-ceapex-package-r) # PAT for the loc AzDO instance https://dev.azure.com/ceapex GithubPat: $(BotAccount-dotnet-bot-repo-PAT) @@ -27,7 +27,7 @@ parameters: is1ESPipeline: '' jobs: - job: OneLocBuild${{ parameters.JobNameSuffix }} - + dependsOn: ${{ parameters.dependsOn }} displayName: OneLocBuild${{ parameters.JobNameSuffix }} @@ -99,22 +99,20 @@ jobs: mirrorBranch: ${{ parameters.MirrorBranch }} condition: ${{ parameters.condition }} - - template: /eng/common/core-templates/steps/publish-build-artifacts.yml - parameters: - is1ESPipeline: ${{ parameters.is1ESPipeline }} - args: - displayName: Publish Localization Files - pathToPublish: '$(Build.ArtifactStagingDirectory)/loc' - publishLocation: Container - artifactName: Loc - condition: ${{ parameters.condition }} + # Copy the locProject.json to the root of the Loc directory, then publish a pipeline artifact + - task: CopyFiles@2 + displayName: Copy LocProject.json + inputs: + SourceFolder: '$(Build.SourcesDirectory)/eng/Localize/' + Contents: 'LocProject.json' + TargetFolder: '$(Build.ArtifactStagingDirectory)/loc' + condition: ${{ parameters.condition }} - - template: /eng/common/core-templates/steps/publish-build-artifacts.yml + - template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml parameters: is1ESPipeline: ${{ parameters.is1ESPipeline }} args: - displayName: Publish LocProject.json - pathToPublish: '$(Build.SourcesDirectory)/eng/Localize/' - publishLocation: Container - artifactName: Loc + targetPath: '$(Build.ArtifactStagingDirectory)/loc' + artifactName: 'Loc' + displayName: 'Publish Localization Files' condition: ${{ parameters.condition }} diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 996a5f9c8725..d4cfd9ccd806 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -257,7 +257,20 @@ function Retry($downloadBlock, $maxRetries = 5) { function GetDotNetInstallScript([string] $dotnetRoot) { $installScript = Join-Path $dotnetRoot 'dotnet-install.ps1' + $shouldDownload = $false + if (!(Test-Path $installScript)) { + $shouldDownload = $true + } else { + # Check if the script is older than 30 days + $fileAge = (Get-Date) - (Get-Item $installScript).LastWriteTime + if ($fileAge.Days -gt 30) { + Write-Host "Existing install script is too old, re-downloading..." + $shouldDownload = $true + } + } + + if ($shouldDownload) { Create-Directory $dotnetRoot $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit $uri = "https://builds.dotnet.microsoft.com/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.ps1" diff --git a/eng/common/tools.sh b/eng/common/tools.sh index 3def02a638d2..c1841c9dfd0f 100755 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -300,8 +300,29 @@ function GetDotNetInstallScript { local root=$1 local install_script="$root/dotnet-install.sh" local install_script_url="https://builds.dotnet.microsoft.com/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.sh" + local timestamp_file="$root/.dotnet-install.timestamp" + local should_download=false if [[ ! -a "$install_script" ]]; then + should_download=true + elif [[ -f "$timestamp_file" ]]; then + # Check if the script is older than 30 days using timestamp file + local download_time=$(cat "$timestamp_file" 2>/dev/null || echo "0") + local current_time=$(date +%s) + local age_seconds=$((current_time - download_time)) + + # 30 days = 30 * 24 * 60 * 60 = 2592000 seconds + if [[ $age_seconds -gt 2592000 ]]; then + echo "Existing install script is too old, re-downloading..." + should_download=true + fi + else + # No timestamp file exists, assume script is old and re-download + echo "No timestamp found for existing install script, re-downloading..." + should_download=true + fi + + if [[ "$should_download" == true ]]; then mkdir -p "$root" echo "Downloading '$install_script_url'" @@ -328,6 +349,9 @@ function GetDotNetInstallScript { ExitWithExitCode $exit_code } fi + + # Create timestamp file to track download time in seconds from epoch + date +%s > "$timestamp_file" fi # return value _GetDotNetInstallScript="$install_script" diff --git a/eng/targets/CSharp.Common.targets b/eng/targets/CSharp.Common.targets index 6b6a41ca4a64..471a470911ee 100644 --- a/eng/targets/CSharp.Common.targets +++ b/eng/targets/CSharp.Common.targets @@ -94,7 +94,12 @@ <_Parameter2>$(RepositoryUrl)/tree/$(SourceRevisionId) - + + <_Parameter1>OriginalRepoCommitHash + <_Parameter2>$(RepoOriginalSourceRevisionId) + + + <_Parameter1>Serviceable <_Parameter2>True diff --git a/eng/targets/Wix.Common.targets b/eng/targets/Wix.Common.targets index 72cec114582b..e159100ea531 100644 --- a/eng/targets/Wix.Common.targets +++ b/eng/targets/Wix.Common.targets @@ -22,7 +22,7 @@ <_GeneratedPackageVersion>$(PackageVersion) <_GeneratedPackageVersion - Condition="! $(PackageVersion.Contains('$(_PreReleaseLabel)'))">$(PackageVersion)-$(_PreReleaseLabel)$(_BuildNumberLabels) + Condition="! $(PackageVersion.Contains('$(_BuildNumberLabels)'))">$(VersionPrefix)-$(_PreReleaseLabel)$(_BuildNumberLabels) $(OutputNamePrefix)$(_GeneratedPackageVersion)$(OutputNameSuffix) diff --git a/global.json b/global.json index 19f5826c86f4..7139f0292ab4 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,9 @@ { "sdk": { - "version": "10.0.100-preview.7.25322.101" + "version": "10.0.100-preview.7.25372.107" }, "tools": { - "dotnet": "10.0.100-preview.7.25322.101", + "dotnet": "10.0.100-preview.7.25372.107", "runtimes": { "dotnet/x86": [ "$(MicrosoftInternalRuntimeAspNetCoreTransportVersion)" @@ -27,9 +27,9 @@ "jdk": "latest" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25377.103", - "Microsoft.DotNet.Helix.Sdk": "10.0.0-beta.25377.103", - "Microsoft.DotNet.SharedFramework.Sdk": "10.0.0-beta.25377.103", + "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25409.103", + "Microsoft.DotNet.Helix.Sdk": "10.0.0-beta.25409.103", + "Microsoft.DotNet.SharedFramework.Sdk": "10.0.0-beta.25409.103", "Microsoft.Build.NoTargets": "3.7.0", "Microsoft.Build.Traversal": "3.4.0" } diff --git a/src/Components/WebAssembly/testassets/CustomBasePathApp/CustomBasePathApp.csproj b/src/Components/WebAssembly/testassets/CustomBasePathApp/CustomBasePathApp.csproj index 64512155abe0..227013061d9a 100644 --- a/src/Components/WebAssembly/testassets/CustomBasePathApp/CustomBasePathApp.csproj +++ b/src/Components/WebAssembly/testassets/CustomBasePathApp/CustomBasePathApp.csproj @@ -2,6 +2,7 @@ $(DefaultNetCoreTargetFramework) + false /app diff --git a/src/Components/WebAssembly/testassets/HostedInAspNet.Client/HostedInAspNet.Client.csproj b/src/Components/WebAssembly/testassets/HostedInAspNet.Client/HostedInAspNet.Client.csproj index c43a347a6150..382d39138d8c 100644 --- a/src/Components/WebAssembly/testassets/HostedInAspNet.Client/HostedInAspNet.Client.csproj +++ b/src/Components/WebAssembly/testassets/HostedInAspNet.Client/HostedInAspNet.Client.csproj @@ -2,6 +2,7 @@ $(DefaultNetCoreTargetFramework) + false diff --git a/src/Components/test/testassets/Components.WasmMinimal/Components.WasmMinimal.csproj b/src/Components/test/testassets/Components.WasmMinimal/Components.WasmMinimal.csproj index deabcd7fccae..5cd17cfac619 100644 --- a/src/Components/test/testassets/Components.WasmMinimal/Components.WasmMinimal.csproj +++ b/src/Components/test/testassets/Components.WasmMinimal/Components.WasmMinimal.csproj @@ -6,6 +6,7 @@ enable WasmMinimal true + false diff --git a/src/Components/test/testassets/GlobalizationWasmApp/wwwroot/index.html b/src/Components/test/testassets/GlobalizationWasmApp/wwwroot/index.html index a9345d1495c5..7201ad0e358b 100644 --- a/src/Components/test/testassets/GlobalizationWasmApp/wwwroot/index.html +++ b/src/Components/test/testassets/GlobalizationWasmApp/wwwroot/index.html @@ -1,5 +1,6 @@ + diff --git a/src/Servers/Connections.Abstractions/src/IMemoryPoolFactory.cs b/src/Servers/Connections.Abstractions/src/IMemoryPoolFactory.cs index 1cfa7e7f9215..16ffcee42687 100644 --- a/src/Servers/Connections.Abstractions/src/IMemoryPoolFactory.cs +++ b/src/Servers/Connections.Abstractions/src/IMemoryPoolFactory.cs @@ -13,7 +13,6 @@ public interface IMemoryPoolFactory /// /// Creates a new instance of a memory pool. /// - /// Options for configuring the memory pool. /// A new memory pool instance. - MemoryPool Create(MemoryPoolOptions? options = null); + MemoryPool Create(); } diff --git a/src/Servers/Connections.Abstractions/src/MemoryPoolOptions.cs b/src/Servers/Connections.Abstractions/src/MemoryPoolOptions.cs deleted file mode 100644 index 7d966729a6d1..000000000000 --- a/src/Servers/Connections.Abstractions/src/MemoryPoolOptions.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -namespace Microsoft.AspNetCore.Connections; - -/// -/// Options for configuring a memory pool. -/// -public class MemoryPoolOptions -{ - /// - /// Gets or sets the owner of the memory pool. This is used for logging and diagnostics purposes. - /// - public string? Owner { get; set; } -} diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI/net10.0/PublicAPI.Unshipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI/net10.0/PublicAPI.Unshipped.txt index 4e96c215b0ab..dec7f8f71c13 100644 --- a/src/Servers/Connections.Abstractions/src/PublicAPI/net10.0/PublicAPI.Unshipped.txt +++ b/src/Servers/Connections.Abstractions/src/PublicAPI/net10.0/PublicAPI.Unshipped.txt @@ -1,7 +1,3 @@ #nullable enable Microsoft.AspNetCore.Connections.IMemoryPoolFactory -Microsoft.AspNetCore.Connections.IMemoryPoolFactory.Create(Microsoft.AspNetCore.Connections.MemoryPoolOptions? options = null) -> System.Buffers.MemoryPool! -Microsoft.AspNetCore.Connections.MemoryPoolOptions -Microsoft.AspNetCore.Connections.MemoryPoolOptions.MemoryPoolOptions() -> void -Microsoft.AspNetCore.Connections.MemoryPoolOptions.Owner.get -> string? -Microsoft.AspNetCore.Connections.MemoryPoolOptions.Owner.set -> void +Microsoft.AspNetCore.Connections.IMemoryPoolFactory.Create() -> System.Buffers.MemoryPool! diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI/net462/PublicAPI.Unshipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI/net462/PublicAPI.Unshipped.txt index 4e96c215b0ab..dec7f8f71c13 100644 --- a/src/Servers/Connections.Abstractions/src/PublicAPI/net462/PublicAPI.Unshipped.txt +++ b/src/Servers/Connections.Abstractions/src/PublicAPI/net462/PublicAPI.Unshipped.txt @@ -1,7 +1,3 @@ #nullable enable Microsoft.AspNetCore.Connections.IMemoryPoolFactory -Microsoft.AspNetCore.Connections.IMemoryPoolFactory.Create(Microsoft.AspNetCore.Connections.MemoryPoolOptions? options = null) -> System.Buffers.MemoryPool! -Microsoft.AspNetCore.Connections.MemoryPoolOptions -Microsoft.AspNetCore.Connections.MemoryPoolOptions.MemoryPoolOptions() -> void -Microsoft.AspNetCore.Connections.MemoryPoolOptions.Owner.get -> string? -Microsoft.AspNetCore.Connections.MemoryPoolOptions.Owner.set -> void +Microsoft.AspNetCore.Connections.IMemoryPoolFactory.Create() -> System.Buffers.MemoryPool! diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index 4e96c215b0ab..dec7f8f71c13 100644 --- a/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,7 +1,3 @@ #nullable enable Microsoft.AspNetCore.Connections.IMemoryPoolFactory -Microsoft.AspNetCore.Connections.IMemoryPoolFactory.Create(Microsoft.AspNetCore.Connections.MemoryPoolOptions? options = null) -> System.Buffers.MemoryPool! -Microsoft.AspNetCore.Connections.MemoryPoolOptions -Microsoft.AspNetCore.Connections.MemoryPoolOptions.MemoryPoolOptions() -> void -Microsoft.AspNetCore.Connections.MemoryPoolOptions.Owner.get -> string? -Microsoft.AspNetCore.Connections.MemoryPoolOptions.Owner.set -> void +Microsoft.AspNetCore.Connections.IMemoryPoolFactory.Create() -> System.Buffers.MemoryPool! diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt index 4e96c215b0ab..dec7f8f71c13 100644 --- a/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt @@ -1,7 +1,3 @@ #nullable enable Microsoft.AspNetCore.Connections.IMemoryPoolFactory -Microsoft.AspNetCore.Connections.IMemoryPoolFactory.Create(Microsoft.AspNetCore.Connections.MemoryPoolOptions? options = null) -> System.Buffers.MemoryPool! -Microsoft.AspNetCore.Connections.MemoryPoolOptions -Microsoft.AspNetCore.Connections.MemoryPoolOptions.MemoryPoolOptions() -> void -Microsoft.AspNetCore.Connections.MemoryPoolOptions.Owner.get -> string? -Microsoft.AspNetCore.Connections.MemoryPoolOptions.Owner.set -> void +Microsoft.AspNetCore.Connections.IMemoryPoolFactory.Create() -> System.Buffers.MemoryPool! diff --git a/src/Servers/HttpSys/src/HttpSysListener.cs b/src/Servers/HttpSys/src/HttpSysListener.cs index 2aa28395b78e..ee9d9c081d6d 100644 --- a/src/Servers/HttpSys/src/HttpSysListener.cs +++ b/src/Servers/HttpSys/src/HttpSysListener.cs @@ -55,7 +55,7 @@ public HttpSysListener(HttpSysOptions options, IMemoryPoolFactory memoryPo throw new PlatformNotSupportedException(); } - MemoryPool = memoryPoolFactory.Create(new MemoryPoolOptions { Owner = "httpsys" }); + MemoryPool = memoryPoolFactory.Create(); Options = options; diff --git a/src/Servers/IIS/IIS/src/Core/IISHttpServer.cs b/src/Servers/IIS/IIS/src/Core/IISHttpServer.cs index d0309104680f..df0484310b0e 100644 --- a/src/Servers/IIS/IIS/src/Core/IISHttpServer.cs +++ b/src/Servers/IIS/IIS/src/Core/IISHttpServer.cs @@ -66,7 +66,7 @@ public IISHttpServer( ILogger logger ) { - _memoryPool = memoryPoolFactory.Create(new MemoryPoolOptions { Owner = "iis" }); + _memoryPool = memoryPoolFactory.Create(); _nativeApplication = nativeApplication; _applicationLifetime = applicationLifetime; _logger = logger; diff --git a/src/Servers/IIS/IIS/src/WebHostBuilderIISExtensions.cs b/src/Servers/IIS/IIS/src/WebHostBuilderIISExtensions.cs index 44c1094a8a01..b151931e0ae6 100644 --- a/src/Servers/IIS/IIS/src/WebHostBuilderIISExtensions.cs +++ b/src/Servers/IIS/IIS/src/WebHostBuilderIISExtensions.cs @@ -57,7 +57,6 @@ public static IWebHostBuilder UseIIS(this IWebHostBuilder hostBuilder) ); services.TryAddSingleton, DefaultMemoryPoolFactory>(); - services.TryAddSingleton(); }); } diff --git a/src/Servers/Kestrel/Core/src/Internal/PinnedBlockMemoryPoolFactory.cs b/src/Servers/Kestrel/Core/src/Internal/PinnedBlockMemoryPoolFactory.cs index 777c7aa611df..45870ab6c23f 100644 --- a/src/Servers/Kestrel/Core/src/Internal/PinnedBlockMemoryPoolFactory.cs +++ b/src/Servers/Kestrel/Core/src/Internal/PinnedBlockMemoryPoolFactory.cs @@ -3,6 +3,7 @@ using System.Buffers; using System.Collections.Concurrent; +using System.Diagnostics.Metrics; using Microsoft.AspNetCore.Connections; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure; using Microsoft.Extensions.Logging; @@ -11,22 +12,22 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal; internal sealed class PinnedBlockMemoryPoolFactory : IMemoryPoolFactory, IHeartbeatHandler { - private readonly MemoryPoolMetrics _metrics; + private readonly IMeterFactory _meterFactory; private readonly ILogger? _logger; private readonly TimeProvider _timeProvider; // micro-optimization: Using nuint as the value type to avoid GC write barriers; could replace with ConcurrentHashSet if that becomes available private readonly ConcurrentDictionary _pools = new(); - public PinnedBlockMemoryPoolFactory(MemoryPoolMetrics metrics, TimeProvider? timeProvider = null, ILogger? logger = null) + public PinnedBlockMemoryPoolFactory(IMeterFactory meterFactory, TimeProvider? timeProvider = null, ILogger? logger = null) { _timeProvider = timeProvider ?? TimeProvider.System; - _metrics = metrics; + _meterFactory = meterFactory; _logger = logger; } - public MemoryPool Create(MemoryPoolOptions? options = null) + public MemoryPool Create() { - var pool = new PinnedBlockMemoryPool(options?.Owner, _metrics, _logger); + var pool = new PinnedBlockMemoryPool(_meterFactory, _logger); _pools.TryAdd(pool, nuint.Zero); diff --git a/src/Servers/Kestrel/Core/test/PinnedBlockMemoryPoolFactoryTests.cs b/src/Servers/Kestrel/Core/test/PinnedBlockMemoryPoolFactoryTests.cs index 7ca077aeff26..4d23015459eb 100644 --- a/src/Servers/Kestrel/Core/test/PinnedBlockMemoryPoolFactoryTests.cs +++ b/src/Servers/Kestrel/Core/test/PinnedBlockMemoryPoolFactoryTests.cs @@ -4,7 +4,6 @@ using System.Buffers; using System.Collections.Concurrent; using System.Reflection; -using Microsoft.AspNetCore.Connections; using Microsoft.AspNetCore.InternalTesting; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal; using Microsoft.Extensions.Time.Testing; @@ -16,26 +15,16 @@ public class PinnedBlockMemoryPoolFactoryTests [Fact] public void CreatePool() { - var factory = CreateMemoryPoolFactory(); + var factory = new PinnedBlockMemoryPoolFactory(new TestMeterFactory()); var pool = factory.Create(); Assert.NotNull(pool); Assert.IsType(pool); - Assert.Null(Assert.IsType(pool).Owner); - } - - [Fact] - public void CreatePoolWithOwner() - { - var factory = CreateMemoryPoolFactory(); - var pool = factory.Create(new MemoryPoolOptions { Owner = "test" }); - Assert.NotNull(pool); - Assert.Equal("test", Assert.IsType(pool).Owner); } [Fact] public void CreateMultiplePools() { - var factory = CreateMemoryPoolFactory(); + var factory = new PinnedBlockMemoryPoolFactory(new TestMeterFactory()); var pool1 = factory.Create(); var pool2 = factory.Create(); @@ -47,7 +36,7 @@ public void CreateMultiplePools() [Fact] public void DisposePoolRemovesFromFactory() { - var factory = CreateMemoryPoolFactory(); + var factory = new PinnedBlockMemoryPoolFactory(new TestMeterFactory()); var pool = factory.Create(); Assert.NotNull(pool); @@ -64,7 +53,7 @@ public void DisposePoolRemovesFromFactory() public async Task FactoryHeartbeatWorks() { var timeProvider = new FakeTimeProvider(DateTimeOffset.UtcNow.AddDays(1)); - var factory = CreateMemoryPoolFactory(timeProvider); + var factory = new PinnedBlockMemoryPoolFactory(new TestMeterFactory(), timeProvider); // Use 2 pools to make sure they all get triggered by the heartbeat var pool = Assert.IsType(factory.Create()); @@ -121,11 +110,4 @@ static async Task VerifyPoolEviction(PinnedBlockMemoryPool pool, int previousCou Assert.InRange(pool.BlockCount(), previousCount - (previousCount / 10), previousCount - (previousCount / 30)); } } - - private static PinnedBlockMemoryPoolFactory CreateMemoryPoolFactory(TimeProvider timeProvider = null) - { - return new PinnedBlockMemoryPoolFactory( - new MemoryPoolMetrics(new TestMeterFactory()), - timeProvider: timeProvider); - } } diff --git a/src/Servers/Kestrel/Core/test/PinnedBlockMemoryPoolTests.cs b/src/Servers/Kestrel/Core/test/PinnedBlockMemoryPoolTests.cs index 4a610563471d..1f8d0edebe39 100644 --- a/src/Servers/Kestrel/Core/test/PinnedBlockMemoryPoolTests.cs +++ b/src/Servers/Kestrel/Core/test/PinnedBlockMemoryPoolTests.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Buffers; -using System.Diagnostics.Metrics; using Microsoft.AspNetCore; using Microsoft.AspNetCore.InternalTesting; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal; @@ -229,24 +228,19 @@ public async Task EvictionsAreScheduled() } [Fact] - public void PooledMemoryMetricTracksPooledMemory() + public void CurrentMemoryMetricTracksPooledMemory() { var testMeterFactory = new TestMeterFactory(); - using var currentMemoryMetric = new MetricCollector(testMeterFactory, "Microsoft.AspNetCore.MemoryPool", MemoryPoolMetrics.PooledMemoryName); + using var currentMemoryMetric = new MetricCollector(testMeterFactory, "Microsoft.AspNetCore.MemoryPool", "aspnetcore.memory_pool.current_memory"); - var pool = CreateMemoryPool(owner: "test", meterFactory: testMeterFactory); + var pool = new PinnedBlockMemoryPool(testMeterFactory); Assert.Empty(currentMemoryMetric.GetMeasurementSnapshot()); var mem = pool.Rent(); mem.Dispose(); - Assert.Collection(currentMemoryMetric.GetMeasurementSnapshot(), - m => - { - Assert.Equal(PinnedBlockMemoryPool.BlockSize, m.Value); - Assert.Equal("test", (string)m.Tags["aspnetcore.memory_pool.owner"]); - }); + Assert.Collection(currentMemoryMetric.GetMeasurementSnapshot(), m => Assert.Equal(PinnedBlockMemoryPool.BlockSize, m.Value)); mem = pool.Rent(); @@ -273,27 +267,15 @@ public void PooledMemoryMetricTracksPooledMemory() public void TotalAllocatedMetricTracksAllocatedMemory() { var testMeterFactory = new TestMeterFactory(); - using var totalMemoryMetric = new MetricCollector(testMeterFactory, "Microsoft.AspNetCore.MemoryPool", MemoryPoolMetrics.AllocatedMemoryName); + using var totalMemoryMetric = new MetricCollector(testMeterFactory, "Microsoft.AspNetCore.MemoryPool", "aspnetcore.memory_pool.total_allocated"); - var pool = CreateMemoryPool(owner: "test", meterFactory: testMeterFactory); + var pool = new PinnedBlockMemoryPool(testMeterFactory); Assert.Empty(totalMemoryMetric.GetMeasurementSnapshot()); var mem1 = pool.Rent(); var mem2 = pool.Rent(); - Assert.Collection(totalMemoryMetric.GetMeasurementSnapshot(), - m => - { - Assert.Equal(PinnedBlockMemoryPool.BlockSize, m.Value); - Assert.Equal("test", (string)m.Tags["aspnetcore.memory_pool.owner"]); - }, - m => - { - Assert.Equal(PinnedBlockMemoryPool.BlockSize, m.Value); - Assert.Equal("test", (string)m.Tags["aspnetcore.memory_pool.owner"]); - }); - // Each Rent that allocates a new block should increment total memory by block size Assert.Equal(2 * PinnedBlockMemoryPool.BlockSize, totalMemoryMetric.GetMeasurementSnapshot().EvaluateAsCounter()); @@ -308,9 +290,9 @@ public void TotalAllocatedMetricTracksAllocatedMemory() public void TotalRentedMetricTracksRentOperations() { var testMeterFactory = new TestMeterFactory(); - using var rentMetric = new MetricCollector(testMeterFactory, "Microsoft.AspNetCore.MemoryPool", MemoryPoolMetrics.RentedMemoryName); + using var rentMetric = new MetricCollector(testMeterFactory, "Microsoft.AspNetCore.MemoryPool", "aspnetcore.memory_pool.total_rented"); - var pool = CreateMemoryPool(owner: "test", meterFactory: testMeterFactory); + var pool = new PinnedBlockMemoryPool(testMeterFactory); Assert.Empty(rentMetric.GetMeasurementSnapshot()); @@ -319,16 +301,8 @@ public void TotalRentedMetricTracksRentOperations() // Each Rent should record the size of the block rented Assert.Collection(rentMetric.GetMeasurementSnapshot(), - m => - { - Assert.Equal(PinnedBlockMemoryPool.BlockSize, m.Value); - Assert.Equal("test", (string)m.Tags["aspnetcore.memory_pool.owner"]); - }, - m => - { - Assert.Equal(PinnedBlockMemoryPool.BlockSize, m.Value); - Assert.Equal("test", (string)m.Tags["aspnetcore.memory_pool.owner"]); - }); + m => Assert.Equal(PinnedBlockMemoryPool.BlockSize, m.Value), + m => Assert.Equal(PinnedBlockMemoryPool.BlockSize, m.Value)); mem1.Dispose(); mem2.Dispose(); @@ -341,9 +315,9 @@ public void TotalRentedMetricTracksRentOperations() public void EvictedMemoryMetricTracksEvictedMemory() { var testMeterFactory = new TestMeterFactory(); - using var evictMetric = new MetricCollector(testMeterFactory, "Microsoft.AspNetCore.MemoryPool", MemoryPoolMetrics.EvictedMemoryName); + using var evictMetric = new MetricCollector(testMeterFactory, "Microsoft.AspNetCore.MemoryPool", "aspnetcore.memory_pool.evicted_memory"); - var pool = CreateMemoryPool(owner: "test", meterFactory: testMeterFactory); + var pool = new PinnedBlockMemoryPool(testMeterFactory); // Fill the pool with some blocks var blocks = new List>(); @@ -370,7 +344,6 @@ public void EvictedMemoryMetricTracksEvictedMemory() foreach (var measurement in evictMetric.GetMeasurementSnapshot()) { Assert.Equal(PinnedBlockMemoryPool.BlockSize, measurement.Value); - Assert.Equal("test", (string)measurement.Tags["aspnetcore.memory_pool.owner"]); } } @@ -379,10 +352,10 @@ public void EvictedMemoryMetricTracksEvictedMemory() public void MetricsAreAggregatedAcrossPoolsWithSameMeterFactory() { var testMeterFactory = new TestMeterFactory(); - using var rentMetric = new MetricCollector(testMeterFactory, "Microsoft.AspNetCore.MemoryPool", MemoryPoolMetrics.RentedMemoryName); + using var rentMetric = new MetricCollector(testMeterFactory, "Microsoft.AspNetCore.MemoryPool", "aspnetcore.memory_pool.total_rented"); - var pool1 = CreateMemoryPool(owner: "test", meterFactory: testMeterFactory); - var pool2 = CreateMemoryPool(owner: "test", meterFactory: testMeterFactory); + var pool1 = new PinnedBlockMemoryPool(testMeterFactory); + var pool2 = new PinnedBlockMemoryPool(testMeterFactory); var mem1 = pool1.Rent(); var mem2 = pool2.Rent(); @@ -402,38 +375,4 @@ public void MetricsAreAggregatedAcrossPoolsWithSameMeterFactory() mem3.Dispose(); mem4.Dispose(); } - - [Fact] - public void MetricsWithDifferentOwners() - { - var testMeterFactory = new TestMeterFactory(); - using var rentMetric = new MetricCollector(testMeterFactory, "Microsoft.AspNetCore.MemoryPool", MemoryPoolMetrics.RentedMemoryName); - - var pool1 = CreateMemoryPool(owner: "test1", meterFactory: testMeterFactory); - var pool2 = CreateMemoryPool(owner: "test2", meterFactory: testMeterFactory); - - var mem1 = pool1.Rent(); - var mem2 = pool2.Rent(); - - // Both pools should contribute to the same metric stream but with different owners - Assert.Collection(rentMetric.GetMeasurementSnapshot(), - m => - { - Assert.Equal(PinnedBlockMemoryPool.BlockSize, m.Value); - Assert.Equal("test1", (string)m.Tags["aspnetcore.memory_pool.owner"]); - }, - m => - { - Assert.Equal(PinnedBlockMemoryPool.BlockSize, m.Value); - Assert.Equal("test2", (string)m.Tags["aspnetcore.memory_pool.owner"]); - }); - - mem1.Dispose(); - mem2.Dispose(); - } - - private static PinnedBlockMemoryPool CreateMemoryPool(string owner, TestMeterFactory meterFactory) - { - return new PinnedBlockMemoryPool(owner: owner, metrics: new MemoryPoolMetrics(meterFactory)); - } } diff --git a/src/Servers/Kestrel/Kestrel/src/WebHostBuilderKestrelExtensions.cs b/src/Servers/Kestrel/Kestrel/src/WebHostBuilderKestrelExtensions.cs index 47a2962d005b..0869ba8169b8 100644 --- a/src/Servers/Kestrel/Kestrel/src/WebHostBuilderKestrelExtensions.cs +++ b/src/Servers/Kestrel/Kestrel/src/WebHostBuilderKestrelExtensions.cs @@ -87,7 +87,6 @@ public static IWebHostBuilder UseKestrelCore(this IWebHostBuilder hostBuilder) services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); services.TryAddEnumerable(ServiceDescriptor.Singleton(sp => sp.GetRequiredService())); services.AddSingleton>(sp => sp.GetRequiredService()); }); diff --git a/src/Servers/Kestrel/Transport.NamedPipes/src/Internal/NamedPipeConnectionListener.cs b/src/Servers/Kestrel/Transport.NamedPipes/src/Internal/NamedPipeConnectionListener.cs index f5d8c21ae6fb..39465a4f3219 100644 --- a/src/Servers/Kestrel/Transport.NamedPipes/src/Internal/NamedPipeConnectionListener.cs +++ b/src/Servers/Kestrel/Transport.NamedPipes/src/Internal/NamedPipeConnectionListener.cs @@ -40,7 +40,7 @@ public NamedPipeConnectionListener( _log = loggerFactory.CreateLogger("Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes"); _endpoint = endpoint; _options = options; - _memoryPool = options.MemoryPoolFactory.Create(new MemoryPoolOptions { Owner = "kestrel" }); + _memoryPool = options.MemoryPoolFactory.Create(); _listeningToken = _listeningTokenSource.Token; // Have to create the pool here (instead of DI) because the pool is specific to an endpoint. _poolPolicy = new NamedPipeServerStreamPoolPolicy(endpoint, options); diff --git a/src/Servers/Kestrel/Transport.NamedPipes/src/WebHostBuilderNamedPipeExtensions.cs b/src/Servers/Kestrel/Transport.NamedPipes/src/WebHostBuilderNamedPipeExtensions.cs index e9d22d044b24..3b64cc2c4f7e 100644 --- a/src/Servers/Kestrel/Transport.NamedPipes/src/WebHostBuilderNamedPipeExtensions.cs +++ b/src/Servers/Kestrel/Transport.NamedPipes/src/WebHostBuilderNamedPipeExtensions.cs @@ -35,7 +35,6 @@ public static IWebHostBuilder UseNamedPipes(this IWebHostBuilder hostBuilder) services.AddSingleton(); services.TryAddSingleton, DefaultMemoryPoolFactory>(); - services.TryAddSingleton(); services.AddOptions().Configure((NamedPipeTransportOptions options, IMemoryPoolFactory factory) => { // Set the IMemoryPoolFactory from DI on NamedPipeTransportOptions. Usually this should be the PinnedBlockMemoryPoolFactory from UseKestrelCore. diff --git a/src/Servers/Kestrel/Transport.Sockets/src/Client/SocketConnectionFactory.cs b/src/Servers/Kestrel/Transport.Sockets/src/Client/SocketConnectionFactory.cs index 39b7523a7c7c..ef6f2c771579 100644 --- a/src/Servers/Kestrel/Transport.Sockets/src/Client/SocketConnectionFactory.cs +++ b/src/Servers/Kestrel/Transport.Sockets/src/Client/SocketConnectionFactory.cs @@ -27,7 +27,7 @@ public SocketConnectionFactory(IOptions options, ILogger ArgumentNullException.ThrowIfNull(loggerFactory); _options = options.Value; - _memoryPool = options.Value.MemoryPoolFactory.Create(SocketConnectionFactoryOptions.MemoryPoolOptions); + _memoryPool = options.Value.MemoryPoolFactory.Create(); _trace = loggerFactory.CreateLogger("Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Client"); var maxReadBufferSize = _options.MaxReadBufferSize ?? 0; diff --git a/src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionContextFactory.cs b/src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionContextFactory.cs index e2bc50ef499e..86d2ec2a2d22 100644 --- a/src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionContextFactory.cs +++ b/src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionContextFactory.cs @@ -47,7 +47,7 @@ public SocketConnectionContextFactory(SocketConnectionFactoryOptions options, IL for (var i = 0; i < _settingsCount; i++) { - var memoryPool = _options.MemoryPoolFactory.Create(SocketConnectionFactoryOptions.MemoryPoolOptions); + var memoryPool = _options.MemoryPoolFactory.Create(); var transportScheduler = options.UnsafePreferInlineScheduling ? PipeScheduler.Inline : new IOQueue(); _settings[i] = new QueueSettings() @@ -62,11 +62,11 @@ public SocketConnectionContextFactory(SocketConnectionFactoryOptions options, IL } else { - var memoryPool = _options.MemoryPoolFactory.Create(SocketConnectionFactoryOptions.MemoryPoolOptions); + var memoryPool = _options.MemoryPoolFactory.Create(); var transportScheduler = options.UnsafePreferInlineScheduling ? PipeScheduler.Inline : PipeScheduler.ThreadPool; - _settings = - [ + _settings = new QueueSettings[] + { new QueueSettings() { Scheduler = transportScheduler, @@ -75,7 +75,7 @@ public SocketConnectionContextFactory(SocketConnectionFactoryOptions options, IL SocketSenderPool = new SocketSenderPool(PipeScheduler.Inline), MemoryPool = memoryPool, } - ]; + }; _settingsCount = 1; } } diff --git a/src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionFactoryOptions.cs b/src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionFactoryOptions.cs index 8290c5602f6c..e77950c87c8e 100644 --- a/src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionFactoryOptions.cs +++ b/src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionFactoryOptions.cs @@ -69,5 +69,4 @@ internal SocketConnectionFactoryOptions(SocketTransportOptions transportOptions) public bool UnsafePreferInlineScheduling { get; set; } internal IMemoryPoolFactory MemoryPoolFactory { get; set; } = DefaultSimpleMemoryPoolFactory.Instance; - internal static readonly MemoryPoolOptions MemoryPoolOptions = new MemoryPoolOptions { Owner = "kestrel" }; } diff --git a/src/Servers/Kestrel/shared/DefaultSimpleMemoryPoolFactory.cs b/src/Servers/Kestrel/shared/DefaultSimpleMemoryPoolFactory.cs index 9c36cd0cf8fc..d3c4f94c333c 100644 --- a/src/Servers/Kestrel/shared/DefaultSimpleMemoryPoolFactory.cs +++ b/src/Servers/Kestrel/shared/DefaultSimpleMemoryPoolFactory.cs @@ -10,7 +10,7 @@ internal sealed class DefaultSimpleMemoryPoolFactory : IMemoryPoolFactory { public static DefaultSimpleMemoryPoolFactory Instance { get; } = new DefaultSimpleMemoryPoolFactory(); - public MemoryPool Create(MemoryPoolOptions? options = null) + public MemoryPool Create() { return MemoryPool.Shared; } diff --git a/src/Servers/Kestrel/shared/test/TestServiceContext.cs b/src/Servers/Kestrel/shared/test/TestServiceContext.cs index 30b7135d939b..2987d52f5461 100644 --- a/src/Servers/Kestrel/shared/test/TestServiceContext.cs +++ b/src/Servers/Kestrel/shared/test/TestServiceContext.cs @@ -87,6 +87,6 @@ public WrappingMemoryPoolFactory(Func> memoryPoolFactory) _memoryPoolFactory = memoryPoolFactory; } - public MemoryPool Create(MemoryPoolOptions options = null) => _memoryPoolFactory(); + public MemoryPool Create() => _memoryPoolFactory(); } } diff --git a/src/Servers/Kestrel/shared/test/TransportTestHelpers/DiagnosticMemoryPoolFactory.cs b/src/Servers/Kestrel/shared/test/TransportTestHelpers/DiagnosticMemoryPoolFactory.cs index ebaeec3f3074..91a266249cd1 100644 --- a/src/Servers/Kestrel/shared/test/TransportTestHelpers/DiagnosticMemoryPoolFactory.cs +++ b/src/Servers/Kestrel/shared/test/TransportTestHelpers/DiagnosticMemoryPoolFactory.cs @@ -25,11 +25,11 @@ public DiagnosticMemoryPoolFactory(bool allowLateReturn = false, bool rentTracki _pools = new List(); } - public MemoryPool Create(MemoryPoolOptions options = null) + public MemoryPool Create() { lock (_pools) { - var pool = new DiagnosticMemoryPool(new PinnedBlockMemoryPool(options?.Owner), _allowLateReturn, _rentTracking); + var pool = new DiagnosticMemoryPool(new PinnedBlockMemoryPool(), _allowLateReturn, _rentTracking); _pools.Add(pool); return pool; } diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/TestTransport/TestServer.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/TestTransport/TestServer.cs index 5270e2a551b2..e6d4f2edef29 100644 --- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/TestTransport/TestServer.cs +++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/TestTransport/TestServer.cs @@ -70,7 +70,7 @@ public TestServer(RequestDelegate app, TestServiceContext context, Action, IAsyncDisposable { - private readonly MemoryPoolMetrics? _metrics; + private readonly IMeterFactory? _meterFactory; private readonly ConcurrentDictionary _pools = new(); private readonly PeriodicTimer _timer; private readonly Task _timerTask; private readonly ILogger? _logger; - public DefaultMemoryPoolFactory(MemoryPoolMetrics? metrics = null, ILogger? logger = null) + public DefaultMemoryPoolFactory(IMeterFactory? meterFactory = null, ILogger? logger = null) { - _metrics = metrics; + _meterFactory = meterFactory; _logger = logger; _timer = new PeriodicTimer(PinnedBlockMemoryPool.DefaultEvictionDelay); _timerTask = Task.Run(async () => @@ -44,9 +44,9 @@ public DefaultMemoryPoolFactory(MemoryPoolMetrics? metrics = null, ILogger Create(MemoryPoolOptions? options = null) + public MemoryPool Create() { - var pool = new PinnedBlockMemoryPool(options?.Owner, _metrics, _logger); + var pool = new PinnedBlockMemoryPool(_meterFactory, _logger); _pools.TryAdd(pool, true); diff --git a/src/Shared/Buffers.MemoryPool/MemoryPoolFactory.cs b/src/Shared/Buffers.MemoryPool/MemoryPoolFactory.cs index 204f9b789818..24679e1be23d 100644 --- a/src/Shared/Buffers.MemoryPool/MemoryPoolFactory.cs +++ b/src/Shared/Buffers.MemoryPool/MemoryPoolFactory.cs @@ -10,17 +10,17 @@ namespace Microsoft.AspNetCore; internal static class TestMemoryPoolFactory { - public static MemoryPool Create(string? owner = null, IMeterFactory? meterFactory = null) + public static MemoryPool Create(IMeterFactory? meterFactory = null) { #if DEBUG - return new DiagnosticMemoryPool(CreatePinnedBlockMemoryPool(owner, meterFactory)); + return new DiagnosticMemoryPool(CreatePinnedBlockMemoryPool(meterFactory)); #else - return CreatePinnedBlockMemoryPool(owner, meterFactory); + return CreatePinnedBlockMemoryPool(meterFactory); #endif } - public static MemoryPool CreatePinnedBlockMemoryPool(string? owner = null, IMeterFactory? meterFactory = null) + public static MemoryPool CreatePinnedBlockMemoryPool(IMeterFactory? meterFactory = null) { - return new PinnedBlockMemoryPool(owner: owner, metrics: meterFactory != null ? new MemoryPoolMetrics(meterFactory) : null); + return new PinnedBlockMemoryPool(meterFactory); } } diff --git a/src/Shared/Buffers.MemoryPool/MemoryPoolMetrics.cs b/src/Shared/Buffers.MemoryPool/MemoryPoolMetrics.cs deleted file mode 100644 index a8d085390fcd..000000000000 --- a/src/Shared/Buffers.MemoryPool/MemoryPoolMetrics.cs +++ /dev/null @@ -1,122 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Diagnostics; -using System.Diagnostics.Metrics; - -#nullable enable - -namespace Microsoft.AspNetCore; - -internal sealed class MemoryPoolMetrics -{ - public const string MeterName = "Microsoft.AspNetCore.MemoryPool"; - - public const string PooledMemoryName = "aspnetcore.memory_pool.pooled"; - public const string AllocatedMemoryName = "aspnetcore.memory_pool.allocated"; - public const string EvictedMemoryName = "aspnetcore.memory_pool.evicted"; - public const string RentedMemoryName = "aspnetcore.memory_pool.rented"; - - private readonly Meter _meter; - private readonly UpDownCounter _pooledMemoryCounter; - private readonly Counter _allocatedMemoryCounter; - private readonly Counter _evictedMemoryCounter; - private readonly Counter _rentedMemoryCounter; - - public MemoryPoolMetrics(IMeterFactory meterFactory) - { - _meter = meterFactory.Create(MeterName); - - _pooledMemoryCounter = _meter.CreateUpDownCounter( - PooledMemoryName, - unit: "By", - description: "Number of bytes currently pooled and available for reuse."); - - _allocatedMemoryCounter = _meter.CreateCounter( - AllocatedMemoryName, - unit: "By", - description: "Total number of bytes allocated by the memory pool. Allocation occurs when a memory rental request exceeds the available pooled memory."); - - _evictedMemoryCounter = _meter.CreateCounter( - EvictedMemoryName, - unit: "By", - description: "Total number of bytes evicted from the memory pool. Eviction occurs when idle pooled memory is reclaimed. Evicted memory is available for garbage collection."); - - _rentedMemoryCounter = _meter.CreateCounter( - RentedMemoryName, - unit: "By", - description: "Total number of bytes rented from the memory pool."); - } - - public void UpdatePooledMemory(int bytes, string? owner) - { - if (_pooledMemoryCounter.Enabled) - { - UpdatePooledMemoryCore(bytes, owner); - } - } - - private void UpdatePooledMemoryCore(int bytes, string? owner) - { - var tags = new TagList(); - AddOwner(ref tags, owner); - - _pooledMemoryCounter.Add(bytes, tags); - } - - public void AddAllocatedMemory(int bytes, string? owner) - { - if (_allocatedMemoryCounter.Enabled) - { - AddAllocatedMemoryCore(bytes, owner); - } - } - - private void AddAllocatedMemoryCore(int bytes, string? owner) - { - var tags = new TagList(); - AddOwner(ref tags, owner); - - _allocatedMemoryCounter.Add(bytes, tags); - } - - public void AddEvictedMemory(int bytes, string? owner) - { - if (_evictedMemoryCounter.Enabled) - { - AddEvictedMemoryCore(bytes, owner); - } - } - - private void AddEvictedMemoryCore(int bytes, string? owner) - { - var tags = new TagList(); - AddOwner(ref tags, owner); - - _evictedMemoryCounter.Add(bytes, tags); - } - - public void AddRentedMemory(int bytes, string? owner) - { - if (_rentedMemoryCounter.Enabled) - { - AddRentedMemoryCore(bytes, owner); - } - } - - private void AddRentedMemoryCore(int bytes, string? owner) - { - var tags = new TagList(); - AddOwner(ref tags, owner); - - _rentedMemoryCounter.Add(bytes, tags); - } - - private static void AddOwner(ref TagList tags, string? owner) - { - if (!string.IsNullOrEmpty(owner)) - { - tags.Add("aspnetcore.memory_pool.owner", owner); - } - } -} diff --git a/src/Shared/Buffers.MemoryPool/PinnedBlockMemoryPool.cs b/src/Shared/Buffers.MemoryPool/PinnedBlockMemoryPool.cs index c50f2b6adcd4..4e6be0f91052 100644 --- a/src/Shared/Buffers.MemoryPool/PinnedBlockMemoryPool.cs +++ b/src/Shared/Buffers.MemoryPool/PinnedBlockMemoryPool.cs @@ -26,17 +26,17 @@ internal sealed class PinnedBlockMemoryPool : MemoryPool, IThreadPoolWorkI // This can be tuned later if needed. public static readonly TimeSpan DefaultEvictionDelay = TimeSpan.FromSeconds(10); - /// - /// The size of a block. 4096 is chosen because most operating systems use 4k pages. - /// - public static int BlockSize => _blockSize; - /// /// Max allocation block size for pooled blocks, /// larger values can be leased but they will be disposed after use rather than returned to the pool. /// public override int MaxBufferSize { get; } = _blockSize; + /// + /// The size of a block. 4096 is chosen because most operating systems use 4k pages. + /// + public static int BlockSize => _blockSize; + /// /// Thread-safe collection of blocks which are currently in the pool. A slab will pre-allocate all of the block tracking objects /// and add them to this collection. When memory is requested it is taken from here first, and when it is returned it is re-added. @@ -48,32 +48,29 @@ internal sealed class PinnedBlockMemoryPool : MemoryPool, IThreadPoolWorkI /// private bool _isDisposed; // To detect redundant calls - private readonly string? _owner; - private readonly MemoryPoolMetrics? _metrics; + private readonly PinnedBlockMemoryPoolMetrics? _metrics; private readonly ILogger? _logger; + private long _currentMemory; + private long _evictedMemory; private DateTimeOffset _nextEviction = DateTime.UtcNow.Add(DefaultEvictionDelay); - private ulong _rentCount; - private ulong _returnCount; + private uint _rentCount; + private uint _returnCount; private readonly object _disposeSync = new object(); private Action? _onPoolDisposed; private object? _onPoolDisposedState; - // Internal for tests. - internal string? Owner => _owner; - /// /// This default value passed in to Rent to use the default value for the pool. /// private const int AnySize = -1; - public PinnedBlockMemoryPool(string? owner = null, MemoryPoolMetrics? metrics = null, ILogger? logger = null) + public PinnedBlockMemoryPool(IMeterFactory? meterFactory = null, ILogger? logger = null) { - _metrics = metrics; - _owner = owner; + _metrics = meterFactory is null ? null : new PinnedBlockMemoryPoolMetrics(meterFactory); _logger = logger; } @@ -102,15 +99,16 @@ public override IMemoryOwner Rent(int size = AnySize) if (_blocks.TryDequeue(out var block)) { - _metrics?.UpdatePooledMemory(-block.Memory.Length, _owner); - _metrics?.AddRentedMemory(block.Memory.Length, _owner); + _metrics?.UpdateCurrentMemory(-block.Memory.Length); + _metrics?.Rent(block.Memory.Length); + Interlocked.Add(ref _currentMemory, -block.Memory.Length); // block successfully taken from the stack - return it return block; } - _metrics?.AddAllocatedMemory(BlockSize, _owner); - _metrics?.AddRentedMemory(BlockSize, _owner); + _metrics?.IncrementTotalMemory(BlockSize); + _metrics?.Rent(BlockSize); // We already counted this Rent call above, but since we're now allocating (need more blocks) // that means the pool is 'very' active and we probably shouldn't evict blocks, so we count again @@ -131,16 +129,17 @@ public override IMemoryOwner Rent(int size = AnySize) internal void Return(MemoryPoolBlock block) { #if BLOCK_LEASE_TRACKING - Debug.Assert(block.Pool == this, "Returned block was not leased from this pool"); - Debug.Assert(block.IsLeased, $"Block being returned to pool twice: {block.Leaser}{Environment.NewLine}"); - block.IsLeased = false; + Debug.Assert(block.Pool == this, "Returned block was not leased from this pool"); + Debug.Assert(block.IsLeased, $"Block being returned to pool twice: {block.Leaser}{Environment.NewLine}"); + block.IsLeased = false; #endif Interlocked.Increment(ref _returnCount); if (!_isDisposed) { - _metrics?.UpdatePooledMemory(block.Memory.Length, _owner); + _metrics?.UpdateCurrentMemory(block.Memory.Length); + Interlocked.Add(ref _currentMemory, block.Memory.Length); _blocks.Enqueue(block); } @@ -179,8 +178,8 @@ void IThreadPoolWorkItem.Execute() /// internal void PerformEviction() { - var currentCount = (ulong)_blocks.Count; - var burstAmount = 0ul; + var currentCount = (uint)_blocks.Count; + var burstAmount = 0u; var rentCount = _rentCount; var returnCount = _returnCount; @@ -214,8 +213,10 @@ internal void PerformEviction() // Remove from queue and let GC clean the memory up while (burstAmount > 0 && _blocks.TryDequeue(out var block)) { - _metrics?.UpdatePooledMemory(-block.Memory.Length, _owner); - _metrics?.AddEvictedMemory(block.Memory.Length, _owner); + _metrics?.UpdateCurrentMemory(-block.Memory.Length); + _metrics?.EvictBlock(block.Memory.Length); + Interlocked.Add(ref _currentMemory, -block.Memory.Length); + Interlocked.Add(ref _evictedMemory, block.Memory.Length); burstAmount--; } diff --git a/src/Shared/Buffers.MemoryPool/PinnedBlockMemoryPoolMetrics.cs b/src/Shared/Buffers.MemoryPool/PinnedBlockMemoryPoolMetrics.cs new file mode 100644 index 000000000000..0211f2bc610c --- /dev/null +++ b/src/Shared/Buffers.MemoryPool/PinnedBlockMemoryPoolMetrics.cs @@ -0,0 +1,64 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.Metrics; + +#nullable enable + +namespace Microsoft.AspNetCore; + +internal sealed class PinnedBlockMemoryPoolMetrics +{ + public const string MeterName = "Microsoft.AspNetCore.MemoryPool"; + + private readonly Meter _meter; + private readonly UpDownCounter _currentMemory; + private readonly Counter _totalAllocatedMemory; + private readonly Counter _evictedMemory; + private readonly Counter _totalRented; + + public PinnedBlockMemoryPoolMetrics(IMeterFactory meterFactory) + { + _meter = meterFactory.Create(MeterName); + + _currentMemory = _meter.CreateUpDownCounter( + "aspnetcore.memory_pool.current_memory", + unit: "By", + description: "Number of bytes that are currently pooled by the pool."); + + _totalAllocatedMemory = _meter.CreateCounter( + "aspnetcore.memory_pool.total_allocated", + unit: "By", + description: "Total number of allocations made by the pool."); + + _evictedMemory = _meter.CreateCounter( + "aspnetcore.memory_pool.evicted_memory", + unit: "By", + description: "Total number of bytes that have been evicted."); + + _totalRented = _meter.CreateCounter( + "aspnetcore.memory_pool.total_rented", + unit: "By", + description: "Total number of rented bytes from the pool."); + } + + public void UpdateCurrentMemory(int bytes) + { + _currentMemory.Add(bytes); + } + + public void IncrementTotalMemory(int bytes) + { + _totalAllocatedMemory.Add(bytes); + } + + public void EvictBlock(int bytes) + { + _evictedMemory.Add(bytes); + } + + public void Rent(int bytes) + { + _totalRented.Add(bytes); + } +}