@ r3plica,
Это была старая проблема, которая была исправлена в версии 1.1.2 или более поздней версии BulkExecutor.
Я попытался воспроизвести вашу проблему, используя Github Repo для запуска метода BulkImportAsync из BulkExecutor, который отлично работал для меня.
Я использовал приведенный ниже метод для CreatePartitionCollection-
static internal async Task CreatePartitionedCollectionAsync(DocumentClient client, string databaseName,
string collectionName, int collectionThroughput)
{
PartitionKeyDefinition partitionKey = new PartitionKeyDefinition
{
Paths = new Collection { ConfigurationManager.AppSettings["CollectionPartitionKey"] }
};
DocumentCollection collection = new DocumentCollection { Id = collectionName, PartitionKey = partitionKey };
try
{
collection = await client.CreateDocumentCollectionAsync(
UriFactory.CreateDatabaseUri(databaseName),
collection,
new RequestOptions { OfferThroughput = collectionThroughput });
}
catch (Exception e)
{
throw e;
}
return collection;
}
А затем в методе Main использовали BulkImport, как показано ниже: -
// Подготовка к массовому импорту.
// Создание документов с простым ключом разделения здесь. строка partitionKeyProperty = dataCollection.PartitionKey.Paths [0] .Replace ("/", "");
long numberOfDocumentsToGenerate = long.Parse(ConfigurationManager.AppSettings["NumberOfDocumentsToImport"]);
int numberOfBatches = int.Parse(ConfigurationManager.AppSettings["NumberOfBatches"]);
long numberOfDocumentsPerBatch = (long)Math.Floor(((double)numberOfDocumentsToGenerate) / numberOfBatches);
// Set retry options high for initialization (default values).
client.ConnectionPolicy.RetryOptions.MaxRetryWaitTimeInSeconds = 30;
client.ConnectionPolicy.RetryOptions.MaxRetryAttemptsOnThrottledRequests = 9;
IBulkExecutor bulkExecutor = new BulkExecutor(client, dataCollection);
await bulkExecutor.InitializeAsync();
// Set retries to 0 to pass control to bulk executor.
client.ConnectionPolicy.RetryOptions.MaxRetryWaitTimeInSeconds = 0;
client.ConnectionPolicy.RetryOptions.MaxRetryAttemptsOnThrottledRequests = 0;
BulkImportResponse bulkImportResponse = null;
long totalNumberOfDocumentsInserted = 0;
double totalRequestUnitsConsumed = 0;
double totalTimeTakenSec = 0;
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var tasks = new List ();
tasks.Add(Task.Run(async () =>
{
Trace.TraceInformation(String.Format("Executing bulk import for batch {0}", i));
do
{
try
{
bulkImportResponse = await bulkExecutor.BulkImportAsync(
documents: documentsToImportInBatch,
enableUpsert: true,
disableAutomaticIdGeneration: true,
maxConcurrencyPerPartitionKeyRange: null,
maxInMemorySortingBatchSize: null,
cancellationToken: token);
}
catch (DocumentClientException de)
{
Trace.TraceError("Document client exception: {0}", de);
break;
}
catch (Exception e)
{
Trace.TraceError("Exception: {0}", e);
break;
}
} while (bulkImportResponse.NumberOfDocumentsImported < documentsToImportInBatch.Count);
totalNumberOfDocumentsInserted += bulkImportResponse.NumberOfDocumentsImported;
totalRequestUnitsConsumed += bulkImportResponse.TotalRequestUnitsConsumed;
totalTimeTakenSec += bulkImportResponse.TotalTimeTaken.TotalSeconds;
},
token));
Позвольте мне знать, если вам нужно больше деталей.
Спасибо все. Это был мой отказ, извините для беспокойства Вас. Существует ответвление к 'интервалу 3' от другого места. Вот почему флаги несовместимы с инструкциями перед 'интервал 3'. Я был смущен, всегда имея edx == 0x80000 в этой точке.Еще раз извините.
Можно легко исследовать интервал 3 обработчика, чтобы видеть, возвращается ли он с a iret
(т.е. вытолкайте назад флаги вызывающих сторон), или если это возвращается с retf 2
(т.е. сохраните флаги от обработчика).
Согласно ссылке системы команд Intel, ZF всегда устанавливается согласно результату. Мог что-то в интервале 3 обработчика управлять этим?
Править: После дальнейшего рытья через руководства (благодарят Бога за Intel, отсылающий бесплатные экземпляры!), мои единственные идеи состоят в том, что это - или интервал 3 обработчика, устанавливающие его так или иначе или процессор, только смотрящий на дуплекс вместо edx при установке флагов. Оба кажутся маловероятными, но последний кажется абсолютно неправдоподобным. В каком режиме Вы работаете? (Реальный, защищенный, нереальный, долго?)
Это мог быть Ваш отладчик, делает что-то специальное, такое как синхронизация memeroy и регистров. При выполнении его без отладчика, это перестало работать, Вы говорите?