Skip to content

Convert rollover lifecycle action to accept max size as a string and not long? #3775

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

Merged
merged 2 commits into from
May 29, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 79 additions & 3 deletions src/Nest/XPack/Ilm/Actions/RolloverAction.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using Newtonsoft.Json;

namespace Nest
Expand All @@ -23,9 +24,16 @@ public interface IRolloverLifecycleAction : ILifecycleAction
long? MaximumDocuments { get; set; }

/// <summary>
/// Max primary shard index storage size in bytes.
/// Max primary shard index storage size using byte notation (e.g. 40gb or 40000000000b).
/// </summary>
[JsonProperty("max_size")]
string MaximumSizeAsString { get; set; }

/// <summary>
/// Max primary shard index storage size in bytes.
/// </summary>
[JsonIgnore]
[Obsolete("Use MaximumSizeAsString property instead")]
long? MaximumSize { get; set; }
}

Expand All @@ -38,23 +46,91 @@ public class RolloverLifecycleAction : IRolloverLifecycleAction
public long? MaximumDocuments { get; set; }

/// <inheritdoc />
public long? MaximumSize { get; set; }
public string MaximumSizeAsString { get; set; }

/// <inheritdoc />
[Obsolete("Use MaximumSizeAsString property instead")]
public long? MaximumSize
{
get => BytesValueConverter.ToBytes(MaximumSizeAsString);
set
{
if (value == null)
{
MaximumSizeAsString = null;
return;
}
MaximumSizeAsString = value + "b";
}
}
}

public static class BytesValueConverter
{
public static long? ToBytes(string value)
{
if (string.IsNullOrEmpty(value))
{
return null;
}

if (value.EndsWith("pb")) return Convert.ToInt64(value.Substring(0, value.Length - 2)) * 1_125_899_906_842_624;
if (value.EndsWith("tb")) return Convert.ToInt64(value.Substring(0, value.Length - 2)) * 1_099_511_627_776;
if (value.EndsWith("gb")) return Convert.ToInt64(value.Substring(0, value.Length - 2)) * 1_073_741_824;
if (value.EndsWith("mb")) return Convert.ToInt64(value.Substring(0, value.Length - 2)) * 1_048_576;
if (value.EndsWith("kb")) return Convert.ToInt64(value.Substring(0, value.Length - 2)) * 1_024;

if (value.EndsWith("p")) return Convert.ToInt64(value.Substring(0, value.Length - 1)) * 1_125_899_906_842_624;
if (value.EndsWith("t")) return Convert.ToInt64(value.Substring(0, value.Length - 1)) * 1_099_511_627_776;
if (value.EndsWith("g")) return Convert.ToInt64(value.Substring(0, value.Length - 1)) * 1_073_741_824;
if (value.EndsWith("m")) return Convert.ToInt64(value.Substring(0, value.Length - 1)) * 1_048_576;
if (value.EndsWith("k")) return Convert.ToInt64(value.Substring(0, value.Length - 1)) * 1_024;

if (value.EndsWith("b")) return Convert.ToInt64(value.Substring(0, value.Length - 1));

// Assume bytes
return Convert.ToInt64(value);
}
}

public class RolloverLifecycleActionDescriptor
: DescriptorBase<RolloverLifecycleActionDescriptor, IRolloverLifecycleAction>, IRolloverLifecycleAction
{
private string _maximumSizeAsString;

/// <inheritdoc cref="IRolloverLifecycleAction.MaximumAge" />
Time IRolloverLifecycleAction.MaximumAge { get; set; }

/// <inheritdoc cref="IRolloverLifecycleAction.MaximumDocuments" />
long? IRolloverLifecycleAction.MaximumDocuments { get; set; }

/// <inheritdoc cref="IRolloverLifecycleAction.MaximumSizeAsString" />
string IRolloverLifecycleAction.MaximumSizeAsString { get => _maximumSizeAsString; set => _maximumSizeAsString = value; }

/// <inheritdoc cref="IRolloverLifecycleAction.MaximumSize" />
long? IRolloverLifecycleAction.MaximumSize { get; set; }
[Obsolete("Use MaximumSizeAsString property instead")]
long? IRolloverLifecycleAction.MaximumSize
{
get => BytesValueConverter.ToBytes(_maximumSizeAsString);
set
{
if (value == null)
{
_maximumSizeAsString = null;
return;
}
_maximumSizeAsString = value + "b";
}
}

/// <inheritdoc cref="IRolloverLifecycleAction.MaximumSizeAsString" />
public RolloverLifecycleActionDescriptor MaximumSizeAsString(string maximumSizeAsString) => Assign(maximumSizeAsString, (a, v) => a.MaximumSizeAsString = maximumSizeAsString);

/// <inheritdoc cref="IRolloverLifecycleAction.MaximumSize" />
[Obsolete("Use MaximumSizeAsString property instead")]
#pragma warning disable 618
public RolloverLifecycleActionDescriptor MaximumSize(long? maximumSize) => Assign(maximumSize, (a, v) => a.MaximumSize = maximumSize);
#pragma warning restore 618

/// <inheritdoc cref="IRolloverLifecycleAction.MaximumAge" />
public RolloverLifecycleActionDescriptor MaximumAge(Time maximumAge) => Assign(maximumAge, (a, v) => a.MaximumAge = maximumAge);
Expand Down
66 changes: 66 additions & 0 deletions src/Tests/Tests/XPack/Ilm/BytesValueConverterTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
using Elastic.Xunit.XunitPlumbing;
using FluentAssertions;
using Nest;

namespace Tests.XPack.Ilm
{
public class BytesValueConverterTests
{
[U] public void Test()
{
BytesValueConverter.ToBytes("1").Should().Be(1L);
BytesValueConverter.ToBytes("1b").Should().Be(1L);

BytesValueConverter.ToBytes("1kb").Should().Be(1024);
BytesValueConverter.ToBytes("1k").Should().Be(1024);

BytesValueConverter.ToBytes("1mb").Should().Be(1024 * 1024);
BytesValueConverter.ToBytes("1m").Should().Be(1024 * 1024);

BytesValueConverter.ToBytes("1gb").Should().Be(1024 * 1024 * 1024);
BytesValueConverter.ToBytes("1g").Should().Be(1024 * 1024 * 1024);

BytesValueConverter.ToBytes("1tb").Should().Be(1024L * 1024 * 1024 * 1024);
BytesValueConverter.ToBytes("1t").Should().Be(1024L * 1024 * 1024 * 1024);

BytesValueConverter.ToBytes("1pb").Should().Be(1024L * 1024 * 1024 * 1024 * 1024);
BytesValueConverter.ToBytes("1p").Should().Be(1024L * 1024 * 1024 * 1024 * 1024);
}

[U] public void RolloverLifecycleActionTest()
{
#pragma warning disable 618
var rolloverLifecycleAction = new RolloverLifecycleAction();

rolloverLifecycleAction.MaximumSize = 1;
rolloverLifecycleAction.MaximumSizeAsString.Should().Be("1b");
rolloverLifecycleAction.MaximumSize.Should().Be(1);

rolloverLifecycleAction = new RolloverLifecycleAction();
rolloverLifecycleAction.MaximumSize = 1024;
rolloverLifecycleAction.MaximumSizeAsString.Should().Be("1024b");
rolloverLifecycleAction.MaximumSize.Should().Be(1024);

rolloverLifecycleAction = new RolloverLifecycleAction();
rolloverLifecycleAction.MaximumSizeAsString = "1gb";
rolloverLifecycleAction.MaximumSize.Should().Be(1024 * 1024 * 1024);
#pragma warning restore 618
}

[U] public void RolloverLifecycleActionDescriptorTest()
{
#pragma warning disable 618
var rolloverLifecycleActionDescriptor = new RolloverLifecycleActionDescriptor();
rolloverLifecycleActionDescriptor.MaximumSize(1);
((IRolloverLifecycleAction)rolloverLifecycleActionDescriptor).MaximumSize.Should().Be(1);
((IRolloverLifecycleAction)rolloverLifecycleActionDescriptor).MaximumSizeAsString.Should().Be("1b");

rolloverLifecycleActionDescriptor = new RolloverLifecycleActionDescriptor();
rolloverLifecycleActionDescriptor.MaximumSizeAsString("1gb");
((IRolloverLifecycleAction)rolloverLifecycleActionDescriptor).MaximumSize.Should().Be(1024 * 1024 * 1024);
((IRolloverLifecycleAction)rolloverLifecycleActionDescriptor).MaximumSizeAsString.Should().Be("1gb");
#pragma warning restore 618
}
}

}
17 changes: 17 additions & 0 deletions src/Tests/Tests/XPack/Ilm/IlmApiTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,18 @@ public IlmApiTests(XPackCluster cluster, EndpointUsage usage) : base(new Coordin
}
}
},
Hot = new Phase
{
MinimumAge = "1d",
Actions = new LifecycleActions
{
new RolloverLifecycleAction
{
MaximumDocuments = 1_000_000,
MaximumSizeAsString = "40gb"
}
}
},
Delete = new Phase
{
MinimumAge = "30d",
Expand All @@ -92,6 +104,11 @@ public IlmApiTests(XPackCluster cluster, EndpointUsage usage) : base(new Coordin
(v, d) => d
.Policy(p => p.Phases(a => a.Warm(w => w.MinimumAge("10d")
.Actions(ac => ac.ForceMerge(f => f.MaximumNumberOfSegments(1))))
.Hot(h => h.MinimumAge("1d")
.Actions(ac => ac.Rollover(r => r.MaximumDocuments(1_000_000)
#pragma warning disable 612, 618
.MaximumSize(40_000_000_000))))
#pragma warning restore 612, 618
.Delete(w => w.MinimumAge("30d")
.Actions(ac => ac.Delete(f => f)))))
,
Expand Down