private async Task UnregisterManyBlock(List <GrainAddress> addresses) { var queryBuilder = new StringBuilder(); queryBuilder.Append(TableClient.CreateQueryFilter($"(PartitionKey eq {clusterId}) and (")); var first = true; foreach (var addr in addresses) { if (!first) { queryBuilder.Append(" or "); } else { first = false; } var rowKey = GrainDirectoryEntity.GrainIdToRowKey(addr.GrainId); var queryClause = TableClient.CreateQueryFilter($"((RowKey eq {rowKey}) and (ActivationId eq {addr.ActivationId.ToString()}))"); queryBuilder.Append(queryClause); } queryBuilder.Append(')'); var entities = await this.tableDataManager.ReadTableEntriesAndEtagsAsync(queryBuilder.ToString()); await this.tableDataManager.DeleteTableEntriesAsync(entities); }
public async Task <GrainAddress> Lookup(GrainId grainId) { var result = await this.tableDataManager.ReadSingleTableEntryAsync(this.clusterId, GrainDirectoryEntity.GrainIdToRowKey(grainId)); if (result.Entity is null) { return(null); } return(result.Item1.ToGrainAddress()); }
public async Task Unregister(GrainAddress address) { var result = await this.tableDataManager.ReadSingleTableEntryAsync(this.clusterId, GrainDirectoryEntity.GrainIdToRowKey(address.GrainId)); // No entry found if (result.Entity is null) { return; } // Check if the entry in storage match the one we were asked to delete var entity = result.Item1; if (entity.ActivationId == address.ActivationId.ToParsableString()) { await this.tableDataManager.DeleteTableEntryAsync(GrainDirectoryEntity.FromGrainAddress(this.clusterId, address), entity.ETag.ToString()); } }
private async Task UnregisterManyBlock(List <GrainAddress> addresses) { var pkFilter = TableQuery.GenerateFilterCondition(nameof(GrainDirectoryEntity.PartitionKey), QueryComparisons.Equal, this.clusterId); string rkFilter = TableQuery.CombineFilters( TableQuery.GenerateFilterCondition(nameof(GrainDirectoryEntity.RowKey), QueryComparisons.Equal, GrainDirectoryEntity.GrainIdToRowKey(addresses[0].GrainId)), TableOperators.And, TableQuery.GenerateFilterCondition(nameof(GrainDirectoryEntity.ActivationId), QueryComparisons.Equal, addresses[0].ActivationId) ); foreach (var addr in addresses.Skip(1)) { var tmp = TableQuery.CombineFilters( TableQuery.GenerateFilterCondition(nameof(GrainDirectoryEntity.RowKey), QueryComparisons.Equal, GrainDirectoryEntity.GrainIdToRowKey(addr.GrainId)), TableOperators.And, TableQuery.GenerateFilterCondition(nameof(GrainDirectoryEntity.ActivationId), QueryComparisons.Equal, addr.ActivationId) ); rkFilter = TableQuery.CombineFilters(rkFilter, TableOperators.Or, tmp); } var entities = await this.tableDataManager.ReadTableEntriesAndEtagsAsync(TableQuery.CombineFilters(pkFilter, TableOperators.And, rkFilter)); await this.tableDataManager.DeleteTableEntriesAsync(entities.Select(e => Tuple.Create(e.Item1, e.Item2)).ToList()); }