# Swap Indexes API
# 1. Summary
The swap indexes API allows to atomically deploy several new versions of indexes without any downtime for the search clients.
# 2. Motivation
It's critical to deploy a new version of an index without any downtimes to the search clients. This capability improves the development experience by allowing Meilisearch to better fit into their workflow.
# 3. Functional Specification
# 3.1. 0 downtime deployment workflow
A 0 downtime deployment looks like this:
- Search clients search on
indexA. - The developer builds a new index
indexBrepresenting the new index version to deploy to the search clients. - When
indexBis built and ready to be deployed, the developer sends an indexes swap request to Meilisearch forindexAandindexB. indexBdocuments, settings and tasks are swapped withindexA.- Search clients search on the updated
indexAwithout experiencing any downtime.
# 3.2. Deploying Multiple New Indexes Versions
The swap API supports multiple swap operations in an atomic fashion.
This means that for a search experience built using multiple indexes, Meilisearch is able to deploy all changes at once and thus clients will access the new version of all indexes at once without any downtime.
There is no need to deploy each new version of indexes one by one.
# 3.3. Enqueued Tasks After A Swap Operation Creation
Tasks enqueued after an indexSwap task creation date do not have their indexUid modified when the indexSwap will succeed. That is, if they are enqueued on indexA, they will run on the new version of indexA.
# 3.4. API Endpoints Definition
# 3.4.1. POST - /swap-indexes
Send one or many indexes swap operation at once.
# 3.4.1.1. Payload definition
The payload body expects an array of JSON objects representing swap operations.
[
{
"indexes": ["indexA", "indexA_new"]
},
{
"indexes": ["indexB", "indexB_new"]
}
]
π‘ In the given example, two swap operations will occur at the same time and atomically.
indexA data will be swapped with indexA_new data while indexB data will be swapped with indexB_new data.
Sending
[]is considered valid. No swap transactions will be performed.
# Swap Object Definition
| Field | Type | Required |
|---|---|---|
| indexes | Array of string representing indexUids | True |
# 3.4.1.1.1. indexes
- Type: Array of string
- Required: True
Determines which two indexes should exchange their data for their given swap object.
# 3.4.1.2. Response Definition
When the request is in a successful state, Meilisearch returns the HTTP code 202 Accepted. The response's content is the summarized representation of the received asynchronous task.
{
"taskUid": 1,
"indexUid": null,
"status": "enqueued",
"type": "indexSwap",
"enqueuedAt": "2021-08-12T10:00:00.000000Z"
}
An
indexSwaptask is considered a global task; thusindexUidis null.
See Summarized task Object for 202 Accepted.
# 3.4.1.3. Errors
# 3.4.1.3.1. Synchronous Errors
- π΄ If the instance is secured by a master key, accessing this route without the
Authorizationheader returns a missing_authorization_header error. - π΄ If the instance is secured by a master key, accessing this route with a key that does not have permissions (missing
indexes.swapaction or having a value for theindexesfield of a swap operation not being defined in the API Keyindexesarray) (i.e. other than the master key) returns anΒ invalid_api_keyΒ error. - π΄ Omitting Content-Type header returns a missing_content_type error.
- π΄ Sending an empty Content-Type returns an invalid_content_type error.
- π΄ Sending a different Content-Type than
application/jsonreturns an invalid_content_type error. - π΄ Sending an empty payload returns a missing_payload error.
- π΄ Sending an invalid JSON payload returns a malformed_payload error.
- π΄ Omitting the
indexesarray in a swap payload returns a missing_swap_indexes error. - π΄ Sending an
indexesarray containing an invalid index uid format returns an invalid_swap_indexes error. - π΄ Sending an
indexesarray not containing exactly 2 indexUids for a swap operation object returns a invalid_swap_indexes error. - π΄ Sending an indexUid more than once in the request payload returns a invalid_swap_duplicate_index_found error.
# 3.4.1.3.2. Asynchronous Errors
- π΄ Sending indexUids that do not exist within the
indexesfield of a swap operation returns an index_not_found error.
# 4. Technical Details
# 4.1. Swapping Data
When indexes are swapped their data is exchanged. It concerns:
- The documents
- The settings
- The tasks history
- An index swap between index_a and index_b will also replace every mention of index_a by index_b (and vice-versa) in the task history. Enqueued tasks are left unmodified.
# 5. Future Possibilities
- Introduce a way to delete one of the swapped indexes when the swap operation occurs.
β Configuration file Multi search api β