Używam wersji 4.3.0 bibliotek magazynu Windows Azure dla .NET. W moim ATS klasy repozytorium, mam kilka partii usuwać metod, które wyglądają tak:"Nieoczekiwany kod odpowiedzi dla operacji: 0" podczas wykonywania usuwania wsadowego tabeli Azure Table
public async Task DeleteAsync(IEnumerable<T> entities)
{
await ExecuteAsBatch(entities, (batch, entity) => batch.Delete(entity));
}
private async Task ExecuteAsBatch(IEnumerable<T> entities, Action<TableBatchOperation, T> batchAction)
{
var byPartition = entities.GroupBy(x => x.PartitionKey).ToList();
await byPartition.ForEachParallel(async group =>
{
// A maximum of 100 actions are allowed per batch job
var segments = group.ToList().ToSegmentedList(100);
await segments.ForEachParallel(async segment =>
{
var batch = new TableBatchOperation();
foreach (var entity in segment)
{
batchAction(batch, entity);
}
await Table.ExecuteBatchAsync(batch);
}, 10);
}, 10);
}
w innych miejscach w moim kodu, który DeleteAsync()
metoda działa poprawnie. Jednak w jednym konkretnym miejscu, otrzymuję komunikat o błędzie podczas wykonywania partii:
Unexpected Response Code for Operation: 0
Oto strona wezwanie:
private async Task MergeAtsOrganizationUserEvents(int organizationId, IEnumerable<CustomerUserEvent> fromEvents, CustomerUser to)
{
var toDelete = (await fromEvents.SelectParallel(async fromEvent =>
{
var pkey = AtsOrganizationUserEventByMinute.GetPartitionKey(organizationId, fromEvent.OccurredOn);
var rkey = AtsOrganizationUserEventByMinute.GetRowKey(fromEvent.OccurredOn, fromEvent.CustomerUserEventId);
return await Ats.OrganizationUserEventByMinute.FindByPartitionRowAsync(pkey, rkey);
})).Where(x => x != null).ToList();
var toInsert = toDelete
.Select(x => AtsOrganizationUserEventByMinute.FromBase(x.OrganizationId, x.OccurredOn, x.CookieId,
to.CustomerUserId, x))
.ToList();
try
{
await Ats.OrganizationUserEventByMinute.UpsertAsync(toInsert);
await Ats.OrganizationUserEventByMinute.DeleteAsync(toDelete);
}
catch (Exception ex)
{
_logger.Error("Unable to merge {0} AtsOrganizationEvents for org {1}, to customer user {2}: {3}",
toInsert.Count, organizationId, to.CustomerUserId, ex.CompleteMessage());
throw;
}
}
Sposób UpsertAsync()
powyżej powiedzie, ale DeleteAsync()
zawiedzie. Zauważ, że nie usuwa dokładnie tych samych obiektów, które zostały pobrane z tabeli, więc nie mogę sobie wyobrazić, jak może to mieć coś wspólnego ze zniekształconymi obiektami lub czymkolwiek w tym rodzaju.
Oto przykład jednego z obiektów „toDelete” (w formacie JSON):
{
"CookieId":null,
"CustomerUserId":185766,
"CustomerUserEventId":3568687,
"OrganizationId":4190,
"EventName":"event1",
"SessionId":null,
"OccurredOn":"2014-10-20T18:17:09.9971379Z",
"UrlId":null,
"Url":null,
"ReferrerUrlId":null,
"ReferrerUrl":null,
"IsSynthetic":false,
"IpAddress":null,
"PartitionKey":"4190.2014.10.20",
"RowKey":"18.17.3568687",
"Timestamp":"2014-10-20T18:17:11.237+00:00",
"ETag":"W/\\" datetime'2014-10-20T18%3A17%3A11.237Z'\\""
}
komunikaty o błędach Azure Storage są notorycznie i spektakularnie nieprzydatny i Googling powrócił nic o partii usuwa niepowodzeniem z tym konkretnym błąd.
Nie powiedzie się to zarówno podczas korzystania z lokalnego oprogramowania do programowania, jak i podczas produkcji.
Jakieś myśli?
Witam, Ken, czy mógłbybyś podzielić się swoimi znakami .ForEachParallel() i .ToSegmentedList(), to jest coś, co wygląda na bardzo przydatne. Dzięki. –
Pewnie. Zobacz https://gist.github.com/smithkl42/ca5b98e909952eddef1e3a076c0dd91d i https://gist.github.com/smithkl42/36ca70a63fe1a3bbf2d03a4d0bbe46c2. –