Skip to content

Commit 27a89b6

Browse files
committed
refactor(binary): обновление ключей конфигурации лимита памяти для двоичных данных
1 parent 2b1e0e6 commit 27a89b6

6 files changed

Lines changed: 122 additions & 10 deletions

File tree

src/OneScript.BinaryData/BinaryDataConfigurationDefaults.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace OneScript.BinaryData
1313
public static class BinaryDataConfigurationDefaults
1414
{
1515
/// <summary>
16-
/// Лимит по умолчанию (50 МБ), если в конфигурации не задан ключ binaryData.inMemoryMaxBytes.
16+
/// Лимит по умолчанию (50 МБ), если в конфигурации не задан ключ binaryData.inMemoryMaxSize.
1717
/// </summary>
1818
public const int InMemoryMaxBytes = 1024 * 1024 * 50;
1919
}

src/OneScript.BinaryData/BinaryDataMemoryLimitConfiguration.cs

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,77 @@ namespace OneScript.BinaryData
1515
/// </summary>
1616
public static class BinaryDataMemoryLimitConfiguration
1717
{
18-
public const string InMemoryMaxBytesConfigKey = "binaryData.inMemoryMaxBytes";
18+
public const string InMemoryMaxSizeConfigKey = "binaryData.inMemoryMaxSize";
1919

2020
/// <summary>
2121
/// Возвращает лимит в байтах из строки конфигурации; при ошибке — <see cref="BinaryDataConfigurationDefaults.InMemoryMaxBytes"/> и сообщение через <paramref name="logWarning"/>.
22+
/// Допускается целое число байт или значение с суффиксом k, m, g (512k, 50m, 1g).
2223
/// </summary>
2324
public static int ResolveFromConfigString(string rawValue, Action<string> logWarning)
2425
{
2526
if (string.IsNullOrWhiteSpace(rawValue))
2627
return BinaryDataConfigurationDefaults.InMemoryMaxBytes;
2728

28-
if (!int.TryParse(rawValue.Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out var bytes))
29+
if (!TryParseByteSize(rawValue.Trim(), out var bytes))
2930
{
30-
logWarning?.Invoke($"Invalid value for {InMemoryMaxBytesConfigKey}: {rawValue}");
31+
logWarning?.Invoke($"Invalid value for {InMemoryMaxSizeConfigKey}: {rawValue}");
3132
return BinaryDataConfigurationDefaults.InMemoryMaxBytes;
3233
}
3334

3435
if (bytes <= 0 || bytes == int.MaxValue)
3536
{
36-
logWarning?.Invoke($"Value for {InMemoryMaxBytesConfigKey} must be between 1 and {int.MaxValue - 1}: {bytes}");
37+
logWarning?.Invoke($"Value for {InMemoryMaxSizeConfigKey} must be between 1 and {int.MaxValue - 1}: {bytes}");
3738
return BinaryDataConfigurationDefaults.InMemoryMaxBytes;
3839
}
3940

4041
return bytes;
4142
}
43+
44+
private static bool TryParseByteSize(string value, out int bytes)
45+
{
46+
bytes = 0;
47+
48+
if (value.Length == 0)
49+
return false;
50+
51+
var suffix = value[value.Length - 1];
52+
long multiplier = 1;
53+
var numberPart = value;
54+
55+
switch (suffix)
56+
{
57+
case 'k':
58+
case 'K':
59+
multiplier = 1024L;
60+
numberPart = value.Substring(0, value.Length - 1).TrimEnd();
61+
break;
62+
case 'm':
63+
case 'M':
64+
multiplier = 1024L * 1024L;
65+
numberPart = value.Substring(0, value.Length - 1).TrimEnd();
66+
break;
67+
case 'g':
68+
case 'G':
69+
multiplier = 1024L * 1024L * 1024L;
70+
numberPart = value.Substring(0, value.Length - 1).TrimEnd();
71+
break;
72+
}
73+
74+
if (numberPart.Length == 0)
75+
return false;
76+
77+
if (!long.TryParse(numberPart, NumberStyles.Integer, CultureInfo.InvariantCulture, out var number))
78+
return false;
79+
80+
if (number <= 0)
81+
return false;
82+
83+
var result = number * multiplier;
84+
if (result <= 0 || result >= int.MaxValue)
85+
return false;
86+
87+
bytes = (int)result;
88+
return true;
89+
}
4290
}
4391
}

src/OneScript.StandardLibrary/EngineBuilderExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ namespace OneScript.StandardLibrary
1616
public static class EngineBuilderExtensions
1717
{
1818
/// <summary>
19-
/// Регистрирует лимит памяти для «ДвоичныеДанные» из конфигурации движка (ключ <see cref="BinaryDataMemoryLimitConfiguration.InMemoryMaxBytesConfigKey"/>).
19+
/// Регистрирует лимит памяти для «ДвоичныеДанные» из конфигурации движка (ключ <see cref="BinaryDataMemoryLimitConfiguration.InMemoryMaxSizeConfigKey"/>).
2020
/// Вызывайте после <c>SetDefaultOptions</c> из <c>ScriptEngine.Hosting.EngineBuilderExtensions</c>.
2121
/// </summary>
2222
public static IEngineBuilder RegisterBinaryDataMemoryLimitFromConfig(this IEngineBuilder builder)
2323
{
2424
builder.Services.RegisterSingleton<IBinaryDataMemoryLimit>(sp =>
2525
{
2626
var cfg = sp.Resolve<KeyValueConfig>();
27-
var raw = cfg[BinaryDataMemoryLimitConfiguration.InMemoryMaxBytesConfigKey];
27+
var raw = cfg[BinaryDataMemoryLimitConfiguration.InMemoryMaxSizeConfigKey];
2828
var bytes = BinaryDataMemoryLimitConfiguration.ResolveFromConfigString(raw, SystemLogger.Write);
2929
return new BinaryDataMemoryLimit(bytes);
3030
});

src/ScriptEngine.HostedScript/oscript.cfg

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ lib.system = ../lib
2121

2222
#systemlanguage = ru
2323

24-
# Порог в байтах: пока размер двоичных данных в памяти не превышает это значение, данные держатся в RAM;
25-
# при большем размере используется временный файл. По умолчанию 52428800 (50 МБ).
26-
#binaryData.inMemoryMaxBytes=52428800
24+
# Порог: пока размер двоичных данных в памяти не превышает это значение, данные держатся в RAM;
25+
# при большем размере используется временный файл. По умолчанию 50m (52428800 байт).
26+
# Значение — целое число байт или с суффиксом k, m, g (512k, 50m, 1g).
27+
#binaryData.inMemoryMaxSize=50m
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*----------------------------------------------------------
2+
This Source Code Form is subject to the terms of the
3+
Mozilla Public License, v.2.0. If a copy of the MPL
4+
was not distributed with this file, You can obtain one
5+
at http://mozilla.org/MPL/2.0/.
6+
----------------------------------------------------------*/
7+
8+
using System.Collections.Generic;
9+
using FluentAssertions;
10+
using OneScript.BinaryData;
11+
using Xunit;
12+
13+
namespace OneScript.StandardLibrary.Tests
14+
{
15+
public class BinaryDataMemoryLimitConfigurationTests
16+
{
17+
[Theory]
18+
[InlineData("52428800", 52428800)]
19+
[InlineData("512k", 512 * 1024)]
20+
[InlineData("512K", 512 * 1024)]
21+
[InlineData("50m", 50 * 1024 * 1024)]
22+
[InlineData("50M", 50 * 1024 * 1024)]
23+
[InlineData("1g", 1024 * 1024 * 1024)]
24+
[InlineData("1G", 1024 * 1024 * 1024)]
25+
public void ResolvesByteSizeWithOptionalSuffix(string rawValue, int expectedBytes)
26+
{
27+
var warnings = new List<string>();
28+
29+
var bytes = BinaryDataMemoryLimitConfiguration.ResolveFromConfigString(rawValue, warnings.Add);
30+
31+
bytes.Should().Be(expectedBytes);
32+
warnings.Should().BeEmpty();
33+
}
34+
35+
[Theory]
36+
[InlineData(null)]
37+
[InlineData("")]
38+
[InlineData(" ")]
39+
public void UsesDefaultWhenValueIsMissing(string rawValue)
40+
{
41+
var bytes = BinaryDataMemoryLimitConfiguration.ResolveFromConfigString(rawValue, _ => { });
42+
43+
bytes.Should().Be(BinaryDataConfigurationDefaults.InMemoryMaxBytes);
44+
}
45+
46+
[Theory]
47+
[InlineData("512x")]
48+
[InlineData("m512")]
49+
[InlineData("0")]
50+
[InlineData("-1")]
51+
[InlineData("2g")]
52+
public void UsesDefaultForInvalidValue(string rawValue)
53+
{
54+
var warnings = new List<string>();
55+
56+
var bytes = BinaryDataMemoryLimitConfiguration.ResolveFromConfigString(rawValue, warnings.Add);
57+
58+
bytes.Should().Be(BinaryDataConfigurationDefaults.InMemoryMaxBytes);
59+
warnings.Should().NotBeEmpty();
60+
}
61+
}
62+
}

src/Tests/OneScript.StandardLibrary.Tests/OneScript.StandardLibrary.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
</ItemGroup>
2424

2525
<ItemGroup>
26+
<ProjectReference Include="..\..\OneScript.BinaryData\OneScript.BinaryData.csproj" />
2627
<ProjectReference Include="..\..\OneScript.StandardLibrary\OneScript.StandardLibrary.csproj" />
2728
</ItemGroup>
2829

0 commit comments

Comments
 (0)