Ошибка массовой загрузки Couchbase с помощью upsert () (.NET SDK 2.0)

Я столкнулся с ошибкой при вставке массовых данных с помощью функции upsert и не могу понять, как ее исправить. Кто-нибудь знает, что здесь не так? По сути, программа берет данные из базы данных SQL-сервера и загружает их в корзину Couchbase на инстансе Amazon. Сначала он начинает загружаться, но примерно через 10 или около того он вылетает.

Моя ошибка заключается в следующем: Коллекция была изменена; операция перечисления может не выполняться. Вот снимки экрана с ошибкой (извините, ошибка реплицируется только на другом моем экземпляре сервера Amazon, а не локально): http://imgur.com/a/ZJB0c

Вот функция, которая вызывает метод upsert. Это вызывается несколько раз, так как я получаю только части данных за раз, поскольку таблица SQL очень велика.

 private void receiptItemInsert(double i, int k) {
        const int BATCH_SIZE = 10000;
        APSSEntities entity = new APSSEntities();
        var data = entity.ReceiptItems.OrderBy(x => x.ID).Skip((int)i * BATCH_SIZE).Take(BATCH_SIZE);
        var joinedData = from d in data
                            join s in entity.Stocks
                            on new { stkId = (Guid)d.StockID } equals new { stkId = s.ID } into ps
                            from s in ps.DefaultIfEmpty()
                            select new { d, s };
        var stuff = joinedData.ToList();
        var dict = new Dictionary<string, dynamic>();

        foreach (var ri in stuff)
        {
            Stock stock = new Stock();
            var ritem = new CouchModel.ReceiptItem(ri.d, k, ri.s);
            string key = "receipt_item:" + k.ToString() + ":" + ri.d.ID.ToString();
            dict.Add(key, ritem);
        }
        entity.Dispose();
        using (var cluster = new Cluster(config))
        {
            //open buckets here
            using (var bucket = cluster.OpenBucket("myhoney"))
            {
                bucket.Upsert(dict); #CRASHES HERE
            }
        }
    }

person acac99    schedule 10.06.2015    source источник


Ответы (1)


как обсуждалось на форумах Couchbase, это вероятно ошибка в SDK.

При инициализации внутренней карты кластера couchbase SDK создаст List конечных точек. Если два + потока (как в случае массового обновления) запускают этот код одновременно, можно увидеть, что экземпляр List заполняется другим (поскольку блокировка вводится сразу после вызова List.Any(), что может привести к сбою если список модифицируется).

person Simon Baslé    schedule 10.06.2015