StatusCode: InvalidPartition при создании коллекции, затем записи, чтении, окончательном удалении коллекции.Бывает во второй раз сделать эту последовательность - PullRequest
0 голосов
/ 14 июня 2019

У меня есть сервер REST API, который запускает некоторые операции с моей базой данных NoSQL Cosmos

Мой сценарий имеет такой шаблон: 1. создать коллекцию 2. записать 20 документов в новую коллекцию 3. запросить коллекцию (ипроверить запрос) 4. удалить коллекцию

Я загружаю свой REST-сервер и выполняю вызовы API, чтобы выполнить 4 шага выше.Все отлично работает с первого раза.Когда работает тот же сервер, при попытке выполнить вышеописанные 4 шага во второй раз я получаю эту ошибку при выполнении запроса (шаг 3):

com.microsoft.azure.documentdb.DocumentClientException: Message: {"Errors": ["Запрошенный ресурс больше не доступен на сервере."]} ActivityId: ba46f15a-3615-4764-adea-419c17d26c8e, запрос URI: / apps / 91dbada6-1498-4f1b-b8ae-047db532568d / services / 66113bcb-793b-4d5b-ab9d-6ad5738cda30 / partitions / 0c2487d2-a50c-4ea5-9859-b61335b06c25 / replicas / 132049092719729780s / 201TNT: 201: 09: 0T: запрос на добавление: 0: 0: 0: 201E: запрос: время: 50: 0: запрос на добавление: 20: 0: запрос:-06-14T18: 50: 41.0726964Z, Количество предпринятых регионов: 1 ResponseTime: 2019-06-14T18: 50: 41.0726964Z, StoreResult: StorePhysicalAddress: rntbd: //cdb-ms-prod-eastus1-fd28.documents.azure.com: 16711 / apps / 91dbada6-1498-4f1b-b8ae-047db532568d / services / 66113bcb-793b-4d5b-ab9d-6ad5738cda30 / partitions / 0c2487d2-a50c-4ea5-9859-b61335805 207/177/297/29/17/29/29/29/17/21/29/29/29/29/17/29/29/17/17/21/29/87/29/87GlobalCommittedLsn: 24, PartitionKeyRangeId:, IsValid: True, StatusCode: 410, SubStatusCode: 1000, RequestCharge: 0, ItemLSN: -1, SessionToken: -1 # 21, UsingLocalLSN: True, TransportException: null, ResourceType: Document, OperationType: Query, SDK: Microsoft.Azure.Documents.Common / 2.4.0.0, StatusCode: InvalidPartition

'' *

public void createDocumentCollectionIfNotExists(String databaseName, String collectionName) throws Exception {
    String databaseLink = String.format("/dbs/%s", databaseName);
    String collectionLink = String.format("/dbs/%s/colls/%s", databaseName, collectionName);

    try {
        this.client.readCollection(collectionLink, null);
        System.out.println(String.format("Found %s", collectionName));
    } catch (DocumentClientException de) {
        if (de.getStatusCode() == 404) {
            DocumentCollection collectionInfo = new DocumentCollection();
            collectionInfo.setId(collectionName);

            RequestOptions requestOptions = new RequestOptions();
            requestOptions.setOfferThroughput(400);

            this.client.createCollection(databaseLink, collectionInfo, requestOptions);
        } else {
            throw de;
        }
    }
}

'' '

public String queryCollection(String databaseName, String collectionName) {
    FeedOptions queryOptions = new FeedOptions();
    queryOptions.setEnableCrossPartitionQuery(true);
    queryOptions.setMaxDegreeOfParallelism(-1);

    String collectionLink = String.format("/dbs/%s/colls/%s", databaseName, collectionName);
    System.out.println(collectionLink);

    Iterable<Document> queryResults = client.queryDocuments(
            collectionLink,
            String.format(baseQuery, collectionName),
            queryOptions).getQueryIterable();

    return buildJsonList(queryResults);
}

'' '

public int createDocument(String databaseName, String collectionName, EventDocument document) throws DocumentClientException {
    System.out.println("trying to write to database");
    String collectionLink = String.format("/dbs/%s/colls/%s", databaseName, collectionName);

    ResourceResponse<Document> response = client.createDocument(collectionLink, document, new RequestOptions(), false);

    return response.getStatusCode();
}

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Это похоже на проблему с кешем.В SDK имеется внутренний кэш для разрешения адресов, который обновляется по мере выполнения операций.

В более старых версиях могла возникнуть проблема, если используемая коллекция была воссоздана с тем же именем из внешнего источника (если удаление выполняется SDK, это не проблема).Вы упомянули в комментариях, что вы на 2.1.3, но последний, по мнению Maven, это 2.4.0 .

Если обновление не вариант, повторная попытка этого исключения должнасделайте трюк, поскольку кеши адресов должны обновляться после появления первой ошибки.

0 голосов
/ 17 июня 2019

Попробуйте воспроизвести проблему, но она не удалась, пожалуйста, посмотрите мой тестовый код:

public class Test {

    static private String YOUR_COSMOS_DB_ENDPOINT = "https://***.documents.azure.com:443/";
    static private String YOUR_COSMOS_DB_MASTER_KEY = "***";

    static DocumentClient client = new DocumentClient(
            YOUR_COSMOS_DB_ENDPOINT,
            YOUR_COSMOS_DB_MASTER_KEY,
            new ConnectionPolicy(),
            ConsistencyLevel.Session);

    public static void main(String[] args) throws Exception {

        createDocumentCollectionIfNotExists("db", "test");

        for (int i = 1; i <= 10; i++) {
            Document document = new Document();
            document.set("id", i + "");
            createDocument("db", "test", document);
        }
        queryCollection("db", "test");

        deleteCollection("db", "test");

    }

    public static void createDocumentCollectionIfNotExists(String databaseName, String collectionName) throws Exception {
        String databaseLink = String.format("/dbs/%s", databaseName);
        String collectionLink = String.format("/dbs/%s/colls/%s", databaseName, collectionName);

        try {
            client.readCollection(collectionLink, null);
            System.out.println(String.format("Found %s", collectionName));
        } catch (DocumentClientException de) {
            if (de.getStatusCode() == 404) {
                DocumentCollection collectionInfo = new DocumentCollection();
                collectionInfo.setId(collectionName);

                RequestOptions requestOptions = new RequestOptions();
                requestOptions.setOfferThroughput(400);

                client.createCollection(databaseLink, collectionInfo, requestOptions);
            } else {
                throw de;
            }
        }
    }

    public static void queryCollection(String databaseName, String collectionName) {
        FeedOptions queryOptions = new FeedOptions();
        queryOptions.setEnableCrossPartitionQuery(true);
        queryOptions.setMaxDegreeOfParallelism(-1);

        String collectionLink = String.format("/dbs/%s/colls/%s", databaseName, collectionName);
        System.out.println(collectionLink);

        Iterable<Document> queryResults = client.queryDocuments(
                collectionLink,
                String.format("select * from c", collectionName),
                queryOptions).getQueryIterable();
        for (Document doc : queryResults) {
            System.out.println(doc.getId());
        }
    }


    public static int createDocument(String databaseName, String collectionName, Document document) throws DocumentClientException {
        System.out.println("trying to write to database ,id: " + document.get("id"));
        String collectionLink = String.format("/dbs/%s/colls/%s", databaseName, collectionName);

        ResourceResponse<Document> response = client.createDocument(collectionLink, document, new RequestOptions(), false);

        return response.getStatusCode();
    }


    public static void deleteCollection(String databaseName, String collectionName) throws DocumentClientException {
        FeedOptions queryOptions = new FeedOptions();
        queryOptions.setEnableCrossPartitionQuery(true);
        queryOptions.setMaxDegreeOfParallelism(-1);

        String collectionLink = String.format("/dbs/%s/colls/%s", databaseName, collectionName);
        System.out.println(collectionLink);

        client.deleteCollection(collectionLink, null);

        System.out.println("delete......collection....");
    }
}

Моя версия SDK:

 <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-documentdb</artifactId>
        <version>2.4.0</version>
 </dependency>

Выход:

enter image description here

Ошибка:

"Ошибки": ["Запрашиваемый ресурс больше не доступен на сервер. "]}

потому что коллекция, которую вы хотите запросить, не существует. Если вы выполните последовательно, у вас не будет этой проблемы. Если у вас есть параллельные потребности, просто добавьте блок try-catch или некоторый логический код, чтобы отследить это исключение (например, оценить коллекцию, если она существует).

...