Удаленные документы Couchbase снова появляются в базе данных

#couchbase #couchbase-lite #couchbase-sync-gateway

#couchbase #couchbase-lite #couchbase-sync-gateway

Вопрос:

Мы столкнулись с проблемой, когда удаленные документы снова появляются на нашем сервере Couchbase.

У нас есть сценарий, в котором документы создаются на CBL. Эти документы синхронизируются с сервером. Пользователь понимает, что была допущена ошибка, и помечает документ как некорректный. Затем администратор сервера может просмотреть все помеченные документы и удалить их с сервера. Шлюз синхронизации настроен только на синхронизацию этих типов документов, т.Е. После внесения изменений в эти документы на сервере изменения не синхронизируются обратно в CBL.

Вот процесс того, что происходит:

  1. Документ создается на CBL с TTL 15 дней и синхронизируется с синхронизацией
  2. Документ обновляется в CBL и синхронизируется с sync gateway.
  3. Документ удаляется из корзины сервера Couchbase с помощью запроса DELETE N1QL.
  4. После удаления документа из корзины он снова добавляется случайным образом в течение нескольких дней.
  5. Только документы, которые все еще находятся на устройствах, т. Е. Не Старше TTL 15 дней, добавляются обратно в корзину.

Мы попытались увеличить интервал очистки метаданных более чем до 15 дней, но это не решило проблему.

У кого-нибудь есть какие-либо предложения или, возможно, вы знаете, в чем может быть проблема?

  • Couchbase Server Community Edition 6.5.1 сборка 6299
  • Шлюз синхронизации 2.7.3
  • Couchbase Lite Android 2.8.1

Заранее спасибо!

PS: Вот наша конфигурация шлюза синхронизации с функцией синхронизации:

     "log": [
        "*"
    ],
    "adminInterface": "0.0.0.0:4985",
    "interface": "0.0.0.0:4984",
    "databases": {
        "prod": {
            "server": "http://localhost:8091",
            "bucket": "prod_bukcet",
            "username": "sync_gateway",
            "password": "XXX",
            "enable_shared_bucket_access": true,
            "import_docs": "continuous",
            "use_views": true,
            "users": {
                "user_X": {
                    "password": "XXX",
                    "admin_channels": ["*"],
                    "disabled": false
                }
            },
            "sync":`
                function sync(doc, oldDoc) {
                    /* sanity check */
                    // check if document was removed from server or via SDK
                    // In this case, just return
                    if (isRemoved()) {
                        return;
                    }
                    //Only sync down documents that are created on the server
                    if (doc.deviceDoc == true) {
                        channel("server");
                    } else {
                        if (doc.siteId) {
                            channel(doc.siteId);
                        } else {
                            channel("devices");
                        }
                    }
                    // This is when document is removed via SDK or directly on server
                    function isRemoved() {
                        return (isDelete() amp;amp; oldDoc == null);
                    }
                    function isDelete() {
                        return (doc._deleted == true);
                    }
                }`,
        }
    }
}
 

Ответ №1:

В режиме общего доступа к корзине (enable_shared_bucket_access:true) удаление N1QL для документа создает надгробную плиту. Надгробия всегда синхронизируются. Настройка интервала очистки метаданных на сервере определяет период, по истечении которого надгробие очищается на сервере. Поэтому обычно устанавливается значение, соответствующее максимальному окну раздела клиента, то есть для обеспечения того, чтобы все отключенные клиенты имели возможность получить удаленный документ. Таким образом, установка значения> 15 дней просто означает, что надгробная плита будет удалена через 15 дней, и поэтому надгробные документы тем временем будут синхронизированы с клиентами.

В вашем случае, если вы не хотите, чтобы документы синхронизировались с клиентами, потому что время жизни документа управляется независимо на стороне CBL с помощью ExpirationDate(), затем удалите документ вместо удаления его на сервере.

Комментарии:

1. Спасибо за объяснение! Но я думаю, что вы, возможно, неправильно поняли мою проблему. Я обновил свой вопрос, чтобы предоставить дополнительный контекст. Я не могу немедленно удалить документ с устройства, поскольку обновления документа необходимо синхронизировать с сервером.