Skip to content

Commit

Permalink
Replace ActivationAddress by GrainAddress (#7372)
Browse files Browse the repository at this point in the history
* Move GrainAddress and use proper types instead of string

* Remove ActivationAddress usage

* Remove ActivationAddress completely
  • Loading branch information
benjaminpetit committed Dec 13, 2021
1 parent 244eaac commit 43cce69
Show file tree
Hide file tree
Showing 60 changed files with 420 additions and 479 deletions.
Expand Up @@ -22,8 +22,7 @@ public class AzureTableGrainDirectory : IGrainDirectory, ILifecycleParticipant<I
private class GrainDirectoryEntity : ITableEntity
{
public string SiloAddress { get; set; }

public string ActivationId { get; set; }
public string ActivationId { get; set; }
public string PartitionKey { get; set; }
public string RowKey { get; set; }
public DateTimeOffset? Timestamp { get; set; }
Expand All @@ -34,8 +33,8 @@ public GrainAddress ToGrainAddress()
return new GrainAddress
{
GrainId = RowKeyToGrainId(this.RowKey),
SiloAddress = Orleans.Runtime.SiloAddress.FromParsableString(this.SiloAddress),
ActivationId = this.ActivationId,
SiloAddress = Runtime.SiloAddress.FromParsableString(this.SiloAddress),
ActivationId = Runtime.ActivationId.FromParsableString(this.ActivationId),
};
}

Expand All @@ -46,7 +45,7 @@ public static GrainDirectoryEntity FromGrainAddress(string clusterId, GrainAddre
PartitionKey = clusterId,
RowKey = GrainIdToRowKey(address.GrainId),
SiloAddress = address.SiloAddress.ToParsableString(),
ActivationId = address.ActivationId,
ActivationId = address.ActivationId.ToParsableString(),
};
}

Expand Down Expand Up @@ -98,7 +97,7 @@ public async Task Unregister(GrainAddress address)

// Check if the entry in storage match the one we were asked to delete
var entity = result.Item1;
if (entity.ActivationId == address.ActivationId)
if (entity.ActivationId == address.ActivationId.ToParsableString())
await this.tableDataManager.DeleteTableEntryAsync(GrainDirectoryEntity.FromGrainAddress(this.clusterId, address), entity.ETag.ToString());
}

Expand Down Expand Up @@ -142,7 +141,7 @@ private async Task UnregisterManyBlock(List<GrainAddress> addresses)
}

var rowKey = GrainDirectoryEntity.GrainIdToRowKey(addr.GrainId);
var queryClause = TableClient.CreateQueryFilter($"((RowKey eq {rowKey}) and (ActivationId eq {addr.ActivationId}))");
var queryClause = TableClient.CreateQueryFilter($"((RowKey eq {rowKey}) and (ActivationId eq {addr.ActivationId.ToString()}))");
queryBuilder.Append(queryClause);
}

Expand Down
2 changes: 1 addition & 1 deletion src/Orleans.Core.Abstractions/Activation/IGrainContext.cs
Expand Up @@ -33,7 +33,7 @@ public interface IGrainContext : ITargetHolder, IEquatable<IGrainContext>
/// <summary>
/// Gets the activation address.
/// </summary>
ActivationAddress Address { get; }
GrainAddress Address { get; }

/// <summary>Gets the <see cref="IServiceProvider"/> that provides access to the grain activation's service container.</summary>
IServiceProvider ActivationServices { get; }
Expand Down
47 changes: 0 additions & 47 deletions src/Orleans.Core.Abstractions/GrainDirectory/IGrainDirectory.cs
Expand Up @@ -39,51 +39,4 @@ public interface IGrainDirectory
/// <param name="siloAddresses">The silos to be removed from the directory</param>
Task UnregisterSilos(List<SiloAddress> siloAddresses);
}

/// <summary>
/// Represents an entry in a <see cref="IGrainDirectory"/>
/// </summary>
public class GrainAddress
{
/// <summary>
/// Identifier of the Grain
/// </summary>
public GrainId GrainId { get; set; }

/// <summary>
/// Id of the specific Grain activation
/// </summary>
public string ActivationId { get; set; }

/// <summary>
/// Address of the silo where the grain activation lives
/// </summary>
public SiloAddress SiloAddress { get; set; }

/// <summary>
/// MembershipVersion at the time of registration
/// </summary>
public MembershipVersion MembershipVersion { get; set; } = MembershipVersion.MinValue;

public override bool Equals(object obj)
{
return obj is GrainAddress address &&
this.Matches(address) &&
this.MembershipVersion == address.MembershipVersion;
}

/// <summary>
/// Two grain addresses match if they are equal ignoring their <see cref="MembershipVersion"/> value.
/// </summary>
/// <param name="address"> The other GrainAddress to compare this one with.</param>
/// <returns> Returns <c>true</c> if the two GrainAddress are considered to match</returns>
public bool Matches(GrainAddress address)
{
return this.SiloAddress == address.SiloAddress &&
this.GrainId == address.GrainId &&
this.ActivationId == address.ActivationId;
}

public override int GetHashCode() => HashCode.Combine(this.SiloAddress, this.GrainId, this.ActivationId);
}
}
60 changes: 0 additions & 60 deletions src/Orleans.Core.Abstractions/IDs/ActivationAddress.cs

This file was deleted.

4 changes: 4 additions & 0 deletions src/Orleans.Core.Abstractions/IDs/ActivationId.cs
Expand Up @@ -43,6 +43,10 @@ public static ActivationId GetDeterministic(GrainId grain)

public string ToFullString() => ToString();

public string ToParsableString() => ToFullString();

public static ActivationId FromParsableString(string activationId) => GetActivationId(Guid.Parse(activationId.Remove(0, 1)));

public static bool operator ==(ActivationId left, ActivationId right) => left.Equals(right);

public static bool operator !=(ActivationId left, ActivationId right) => !(left == right);
Expand Down
89 changes: 89 additions & 0 deletions src/Orleans.Core.Abstractions/IDs/GrainAddress.cs
@@ -0,0 +1,89 @@
using System;
using Orleans.GrainDirectory;
using Orleans.Runtime;

namespace Orleans.Runtime
{
/// <summary>
/// Represents an entry in a <see cref="IGrainDirectory"/>
/// </summary>
[GenerateSerializer]
public class GrainAddress
{
/// <summary>
/// Identifier of the Grain
/// </summary>
[Id(0)]
public GrainId GrainId { get; set; }

/// <summary>
/// Id of the specific Grain activation
/// </summary>
[Id(1)]
public ActivationId ActivationId { get; set; }

/// <summary>
/// Address of the silo where the grain activation lives
/// </summary>
[Id(2)]
public SiloAddress SiloAddress { get; set; }

/// <summary>
/// MembershipVersion at the time of registration
/// </summary>
[Id(3)]
public MembershipVersion MembershipVersion { get; set; } = MembershipVersion.MinValue;

public bool IsComplete => !GrainId.IsDefault && !ActivationId.IsDefault && SiloAddress != null;

public override bool Equals(object obj)
{
return obj is GrainAddress address &&
this.Matches(address) &&
this.MembershipVersion == address.MembershipVersion;
}

/// <summary>
/// Two grain addresses match if they are equal ignoring their <see cref="MembershipVersion"/> value.
/// </summary>
/// <param name="address"> The other GrainAddress to compare this one with.</param>
/// <returns> Returns <c>true</c> if the two GrainAddress are considered to match</returns>
public bool Matches(GrainAddress address)
{
return this.SiloAddress == address.SiloAddress &&
this.GrainId == address.GrainId &&
this.ActivationId == address.ActivationId;
}

public override int GetHashCode() => HashCode.Combine(this.SiloAddress, this.GrainId, this.ActivationId);

public string ToFullString()
{
return
String.Format(
"[GrainAddress: {0}, Full GrainId: {1}, Full ActivationId: {2}]",
this.ToString(), // 0
this.GrainId.ToString(), // 1
this.ActivationId.ToFullString()); // 2
}

internal static GrainAddress NewActivationAddress(SiloAddress silo, GrainId grain)
{
var activation = ActivationId.NewId();
return GetAddress(silo, grain, activation);
}

internal static GrainAddress GetAddress(SiloAddress silo, GrainId grain, ActivationId activation)
{
// Silo part is not mandatory
if (grain.IsDefault) throw new ArgumentNullException("grain");

return new GrainAddress
{
GrainId = grain,
ActivationId = activation,
SiloAddress = silo,
};
}
}
}
8 changes: 4 additions & 4 deletions src/Orleans.Core/GrainDirectory/IDhtGrainDirectory.cs
Expand Up @@ -21,7 +21,7 @@ interface IDhtGrainDirectory
/// <param name="address">The address of the new activation.</param>
/// <param name="hopCount">Counts recursion depth across silos</param>
/// <returns>The registered address and the version associated with this directory mapping.</returns>
Task<AddressAndTag> RegisterAsync(ActivationAddress address, int hopCount = 0);
Task<AddressAndTag> RegisterAsync(GrainAddress address, int hopCount = 0);

/// <summary>
/// Removes the record for an existing activation from the directory service.
Expand All @@ -32,7 +32,7 @@ interface IDhtGrainDirectory
/// <param name="hopCount">Counts recursion depth across silos</param>
/// <param name="cause">The reason for unregistration</param>
/// <returns>An acknowledgement that the unregistration has completed.</returns>
Task UnregisterAsync(ActivationAddress address, UnregistrationCause cause, int hopCount = 0);
Task UnregisterAsync(GrainAddress address, UnregistrationCause cause, int hopCount = 0);

/// <summary>
/// Unregister a batch of addresses at once
Expand All @@ -42,7 +42,7 @@ interface IDhtGrainDirectory
/// <param name="hopCount">Counts recursion depth across silos</param>
/// <param name="cause">The reason for unregistration</param>
/// <returns>An acknowledgement that the unregistration has completed.</returns>
Task UnregisterManyAsync(List<ActivationAddress> addresses, UnregistrationCause cause, int hopCount = 0);
Task UnregisterManyAsync(List<GrainAddress> addresses, UnregistrationCause cause, int hopCount = 0);

/// <summary>
/// Removes all directory information about a grain.
Expand Down Expand Up @@ -70,7 +70,7 @@ interface IDhtGrainDirectory
internal struct AddressAndTag
{
[Id(1)]
public ActivationAddress Address;
public GrainAddress Address;

[Id(2)]
public int VersionTag;
Expand Down
12 changes: 6 additions & 6 deletions src/Orleans.Core/GrainDirectory/IGrainLocator.cs
Expand Up @@ -8,18 +8,18 @@ namespace Orleans.GrainDirectory
/// </summary>
public interface IGrainLocator
{
Task<ActivationAddress> Register(ActivationAddress address);
Task<GrainAddress> Register(GrainAddress address);

Task Unregister(ActivationAddress address, UnregistrationCause cause);
Task Unregister(GrainAddress address, UnregistrationCause cause);

ValueTask<ActivationAddress> Lookup(GrainId grainId);
ValueTask<GrainAddress> Lookup(GrainId grainId);

void CachePlacementDecision(ActivationAddress address);
void CachePlacementDecision(GrainAddress address);

void InvalidateCache(GrainId grainId);

void InvalidateCache(ActivationAddress address);
void InvalidateCache(GrainAddress address);

bool TryLookupInCache(GrainId grainId, out ActivationAddress address);
bool TryLookupInCache(GrainId grainId, out GrainAddress address);
}
}

0 comments on commit 43cce69

Please sign in to comment.