本文整理汇总了C#中GrainId.GetUniformHashCode方法的典型用法代码示例。如果您正苦于以下问题:C# GrainId.GetUniformHashCode方法的具体用法?C# GrainId.GetUniformHashCode怎么用?C# GrainId.GetUniformHashCode使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类GrainId
的用法示例。
在下文中一共展示了GrainId.GetUniformHashCode方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ActivationPrecedenceFunc
/// <summary>
/// Precedence function to resolve races among clusters that are trying to create an activation for a particular grain.
/// </summary>
/// <param name="grain">The GrainID under consideration.</param>
/// <param name="clusterLeft"></param>
/// <param name="clusterRight"></param>
/// <returns>
/// The function returns "true" if clusterLeft has precedence over clusterRight.
/// </returns>
internal static bool ActivationPrecedenceFunc(GrainId grain, string clusterLeft, string clusterRight)
{
// Make sure that we're not calling this function with default cluster identifiers.
if (clusterLeft == null || clusterRight == null)
{
throw new OrleansException("ActivationPrecedenceFunction must be called with valid cluster identifiers.");
}
// use string comparison for cluster precedence, with polarity based on uniform grain hash
if (grain.GetUniformHashCode() % 2 == 0)
return string.Compare(clusterLeft, clusterRight, StringComparison.Ordinal) < 0;
else
return string.Compare(clusterRight, clusterLeft, StringComparison.Ordinal) < 0;
}
示例2: DeleteGrain
public Task DeleteGrain(GrainId grain)
{
SiloAddress silo = CalculateTargetSilo(grain);
if (silo == null)
{
// We don't know about any other silos, and we're stopping, so throw
throw new InvalidOperationException("Grain directory is stopping");
}
if (log.IsVerbose) log.Verbose("Silo {0} tries to lookup for {1}-->{2} ({3}-->{4})", MyAddress, grain, silo, grain.GetUniformHashCode(), silo.GetConsistentHashCode());
if (silo.Equals(MyAddress))
{
// remove from our partition
DirectoryPartition.RemoveGrain(grain);
return TaskDone.Done;
}
// remove from the cache
DirectoryCache.Remove(grain);
// send request to the owner
return GetDirectoryReference(silo).DeleteGrain(grain, NUM_RETRIES);
}
示例3: FullLookup
public async Task<List<ActivationAddress>> FullLookup(GrainId grain)
{
fullLookups.Increment();
SiloAddress silo = CalculateTargetSilo(grain, false);
// No need to check that silo != null since we're passing excludeThisSiloIfStopping = false
if (log.IsVerbose) log.Verbose("Silo {0} fully lookups for {1}-->{2} ({3}-->{4})", MyAddress, grain, silo, grain.GetUniformHashCode(), silo.GetConsistentHashCode());
// We assyme that getting here means the grain was not found locally (i.e., in TryFullLookup()).
// We still check if we own the grain locally to avoid races between the time TryFullLookup() and FullLookup() were called.
if (silo.Equals(MyAddress))
{
LocalDirectoryLookups.Increment();
var localResult = DirectoryPartition.LookUpGrain(grain);
if (localResult == null)
{
// it can happen that we cannot find the grain in our partition if there were
// some recent changes in the membership
if (log.IsVerbose2) log.Verbose2("FullLookup mine {0}=none", grain);
return new List<ActivationAddress>();
}
var a = localResult.Item1.Select(t => ActivationAddress.GetAddress(t.Item1, grain, t.Item2)).Where(addr => IsValidSilo(addr.Silo)).ToList();
if (log.IsVerbose2) log.Verbose2("FullLookup mine {0}={1}", grain, a.ToStrings());
LocalDirectorySuccesses.Increment();
return a;
}
// Just a optimization. Why sending a message to someone we know is not valid.
if (!IsValidSilo(silo))
{
throw new OrleansException(String.Format("Current directory at {0} is not stable to perform the lookup for grain {1} (it maps to {2}, which is not a valid silo). Retry later.", MyAddress, grain, silo));
}
RemoteLookupsSent.Increment();
Tuple<List<Tuple<SiloAddress, ActivationId>>, int> result = await GetDirectoryReference(silo).LookUp(grain, NUM_RETRIES);
// update the cache
List<Tuple<SiloAddress, ActivationId>> entries = result.Item1.Where(t => IsValidSilo(t.Item1)).ToList();
List<ActivationAddress> addresses = entries.Select(t => ActivationAddress.GetAddress(t.Item1, grain, t.Item2)).ToList();
if (log.IsVerbose2) log.Verbose2("FullLookup remote {0}={1}", grain, addresses.ToStrings());
if (entries.Count > 0)
DirectoryCache.AddOrUpdate(grain, entries, result.Item2);
return addresses;
}
示例4: LocalLookup
public bool LocalLookup(GrainId grain, out List<ActivationAddress> addresses)
{
localLookups.Increment();
SiloAddress silo = CalculateTargetSilo(grain, false);
// No need to check that silo != null since we're passing excludeThisSiloIfStopping = false
if (log.IsVerbose) log.Verbose("Silo {0} tries to lookup for {1}-->{2} ({3}-->{4})", MyAddress, grain, silo, grain.GetUniformHashCode(), silo.GetConsistentHashCode());
// check if we own the grain
if (silo.Equals(MyAddress))
{
LocalDirectoryLookups.Increment();
addresses = GetLocalDirectoryData(grain);
if (addresses == null)
{
// it can happen that we cannot find the grain in our partition if there were
// some recent changes in the membership
if (log.IsVerbose2) log.Verbose2("LocalLookup mine {0}=null", grain);
return false;
}
if (log.IsVerbose2) log.Verbose2("LocalLookup mine {0}={1}", grain, addresses.ToStrings());
LocalDirectorySuccesses.Increment();
localSuccesses.Increment();
return true;
}
// handle cache
cacheLookups.Increment();
addresses = GetLocalCacheData(grain);
if (addresses == null)
{
if (log.IsVerbose2) log.Verbose2("TryFullLookup else {0}=null", grain);
return false;
}
if (log.IsVerbose2) log.Verbose2("LocalLookup cache {0}={1}", grain, addresses.ToStrings());
cacheSuccesses.Increment();
localSuccesses.Increment();
return true;
}
示例5: CalculateTargetSilo
/// <summary>
/// Finds the silo that owns the directory information for the given grain ID.
/// This routine will always return a non-null silo address unless the excludeThisSiloIfStopping parameter is true,
/// this is the only silo known, and this silo is stopping.
/// </summary>
/// <param name="grain"></param>
/// <param name="excludeThisSiloIfStopping"></param>
/// <returns></returns>
public SiloAddress CalculateTargetSilo(GrainId grain, bool excludeThisSiloIfStopping = true)
{
// give a special treatment for special grains
if (grain.IsSystemTarget)
{
if (log.IsVerbose2) log.Verbose2("Silo {0} looked for a system target {1}, returned {2}", MyAddress, grain, MyAddress);
// every silo owns its system targets
return MyAddress;
}
if (Constants.SystemMembershipTableId.Equals(grain))
{
if (Seed == null)
{
string grainName;
if (!Constants.TryGetSystemGrainName(grain, out grainName))
grainName = "MembershipTableGrain";
var errorMsg = grainName + " cannot run without Seed node - please check your silo configuration file and make sure it specifies a SeedNode element. " +
" Alternatively, you may want to use AzureTable for LivenessType.";
throw new ArgumentException(errorMsg, "grain = " + grain);
}
// Directory info for the membership table grain has to be located on the primary (seed) node, for bootstrapping
if (log.IsVerbose2) log.Verbose2("Silo {0} looked for a special grain {1}, returned {2}", MyAddress, grain, Seed);
return Seed;
}
SiloAddress siloAddress;
int hash = unchecked((int)grain.GetUniformHashCode());
lock (membershipCache)
{
if (membershipRingList.Count == 0)
{
// If the membership ring is empty, then we're the owner by default unless we're stopping.
return excludeThisSiloIfStopping && !Running ? null : MyAddress;
}
// excludeMySelf from being a TargetSilo if we're not running and the excludeThisSIloIfStopping flag is true. see the comment in the Stop method.
bool excludeMySelf = !Running && excludeThisSiloIfStopping;
// need to implement a binary search, but for now simply traverse the list of silos sorted by their hashes
siloAddress = membershipRingList.FindLast(siloAddr => (siloAddr.GetConsistentHashCode() <= hash) &&
(!siloAddr.Equals(MyAddress) || !excludeMySelf));
if (siloAddress == null)
{
// If not found in the traversal, last silo will do (we are on a ring).
// We checked above to make sure that the list isn't empty, so this should always be safe.
siloAddress = membershipRingList[membershipRingList.Count - 1];
// Make sure it's not us...
if (siloAddress.Equals(MyAddress) && excludeMySelf)
{
siloAddress = membershipRingList.Count > 1 ? membershipRingList[membershipRingList.Count - 2] : null;
}
}
}
if (log.IsVerbose2) log.Verbose2("Silo {0} calculated directory partition owner silo {1} for grain {2}: {3} --> {4}", MyAddress, siloAddress, grain, hash, siloAddress.GetConsistentHashCode());
return siloAddress;
}