/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright 2023 Red Hat */ #ifndef UDS_INDEX_SESSION_H #define UDS_INDEX_SESSION_H #include #include #include "thread-utils.h" #include "config.h" #include "indexer.h" /* * The index session mediates all interactions with a UDS index. Once the index session is created, * it can be used to open, close, suspend, or recreate an index. It implements the majority of the * functions in the top-level UDS API. * * If any deduplication request fails due to an internal error, the index is marked disabled. It * will not accept any further requests and can only be closed. Closing the index will clear the * disabled flag, and the index can then be reopened and recovered using the same index session. */ struct __aligned(L1_CACHE_BYTES) session_stats { /* Post requests that found an entry */ u64 posts_found; /* Post requests found in the open chapter */ u64 posts_found_open_chapter; /* Post requests found in the dense index */ u64 posts_found_dense; /* Post requests found in the sparse index */ u64 posts_found_sparse; /* Post requests that did not find an entry */ u64 posts_not_found; /* Update requests that found an entry */ u64 updates_found; /* Update requests that did not find an entry */ u64 updates_not_found; /* Delete requests that found an entry */ u64 deletions_found; /* Delete requests that did not find an entry */ u64 deletions_not_found; /* Query requests that found an entry */ u64 queries_found; /* Query requests that did not find an entry */ u64 queries_not_found; /* Total number of requests */ u64 requests; }; enum index_suspend_status { /* An index load has started but the index is not ready for use. */ INDEX_OPENING = 0, /* The index is able to handle requests. */ INDEX_READY, /* The index is attempting to suspend a rebuild. */ INDEX_SUSPENDING, /* An index rebuild has been suspended. */ INDEX_SUSPENDED, /* An index rebuild is being stopped in order to shut down. */ INDEX_FREEING, }; struct index_load_context { struct mutex mutex; struct cond_var cond; enum index_suspend_status status; }; struct uds_index_session { unsigned int state; struct uds_index *index; struct uds_request_queue *callback_queue; struct uds_parameters parameters; struct index_load_context load_context; struct mutex request_mutex; struct cond_var request_cond; int request_count; struct session_stats stats; }; #endif /* UDS_INDEX_SESSION_H */