Beispiel #1
0
    int WiredTigerUtil::verifyTable(OperationContext* txn, const std::string& uri,
                                    std::vector<std::string>* errors) {

        class MyEventHandlers : public WT_EVENT_HANDLER {
        public:
            MyEventHandlers(std::vector<std::string>* errors)
                : WT_EVENT_HANDLER(defaultEventHandlers())
                , _errors(errors)
                , _defaultErrorHandler(handle_error)
            {
                handle_error = onError;
            }

        private:
            static int onError(WT_EVENT_HANDLER* handler, WT_SESSION* session, int error,
                               const char* message) {
                try {
                    MyEventHandlers* self = static_cast<MyEventHandlers*>(handler);
                    self->_errors->push_back(message);
                    return self->_defaultErrorHandler(handler, session, error, message);
                }
                catch (...) {
                    std::terminate();
                }
            }

            typedef int(*ErrorHandler)(WT_EVENT_HANDLER*, WT_SESSION*, int, const char*);

            std::vector<std::string>* const _errors;
            const ErrorHandler _defaultErrorHandler;
        } eventHandler(errors);

        // Try to close as much as possible to avoid EBUSY errors.
        WiredTigerRecoveryUnit::get(txn)->getSession(txn)->closeAllCursors();
        WiredTigerSessionCache* sessionCache = WiredTigerRecoveryUnit::get(txn)->getSessionCache();
        sessionCache->closeAll();

        // Open a new session with custom error handlers.
        WT_CONNECTION* conn = WiredTigerRecoveryUnit::get(txn)->getSessionCache()->conn();
        WT_SESSION* session;
        invariantWTOK(conn->open_session(conn, errors ? &eventHandler : NULL, NULL, &session));
        ON_BLOCK_EXIT(session->close, session, "");

        // Do the verify. Weird parens prevent treating "verify" as a macro.
        return (session->verify)(session, uri.c_str(), NULL);
    }
Beispiel #2
0
int WiredTigerUtil::verifyTable(OperationContext* txn,
                                const std::string& uri,
                                std::vector<std::string>* errors) {
    ErrorAccumulator eventHandler(errors);

    // Try to close as much as possible to avoid EBUSY errors.
    WiredTigerRecoveryUnit::get(txn)->getSession(txn)->closeAllCursors();
    WiredTigerSessionCache* sessionCache = WiredTigerRecoveryUnit::get(txn)->getSessionCache();
    sessionCache->closeAll();

    // Open a new session with custom error handlers.
    WT_CONNECTION* conn = WiredTigerRecoveryUnit::get(txn)->getSessionCache()->conn();
    WT_SESSION* session;
    invariantWTOK(conn->open_session(conn, &eventHandler, NULL, &session));
    ON_BLOCK_EXIT(session->close, session, "");

    // Do the verify. Weird parens prevent treating "verify" as a macro.
    return (session->verify)(session, uri.c_str(), NULL);
}