fix(influxdb3): Enterprise: update options in CLI reference:

Add options new in Beta
Remove old options, add see references, add anchors for backward compat.
Fix link checker test to not fail when no links exist in the article
pull/5913/head
Jason Stirnaman 2025-03-18 15:36:07 -05:00
parent 1ac88a68db
commit db093f626c
2 changed files with 184 additions and 132 deletions

View File

@ -54,6 +54,7 @@ influxdb3 serve
- [object-store](#object-store)
- [data-dir](#data-dir)
- [node-id](#node-id)
- [cluster-id](#cluster-id)
- [mode](#mode)
- [license-email](#license-email)
- [query-file-limit](#query-file-limit)
@ -112,7 +113,6 @@ influxdb3 serve
- [Memory](#memory)
- [ram-pool-data-bytes](#ram-pool-data-bytes)
- [exec-mem-pool-bytes](#exec-mem-pool-bytes)
- [buffer-mem-limit-mb](#buffer-mem-limit-mb)
- [force-snapshot-mem-threshold](#force-snapshot-mem-threshold)
- [Write-Ahead Log (WAL)](#write-ahead-log-wal)
- [wal-flush-interval](#wal-flush-interval)
@ -123,9 +123,6 @@ influxdb3 serve
- [read-from-node-ids](#read-from-node-ids)
- [replication-interval](#replication-interval)
- [Compaction](#compaction)
- [compactor-id](#compactor-id)
- [compact-from-node-ids](#compact-from-node-ids)
- [run-compactions](#run-compactions)
- [compaction-row-limit](#compaction-row-limit)
- [compaction-max-num-files-per-plan](#compaction-max-num-files-per-plan)
- [compaction-gen2-duration](#compaction-gen2-duration)
@ -133,7 +130,7 @@ influxdb3 serve
- [gen1-duration](#gen1-duration)
- [Caching](#caching)
- [preemptive-cache-age](#preemptive-cache-age)
- [parquet-mem-cache-size-mb](#parquet-mem-cache-size-mb)
- [parquet-mem-cache-size](#parquet-mem-cache-size)
- [parquet-mem-cache-prune-percentage](#parquet-mem-cache-prune-percentage)
- [parquet-mem-cache-prune-interval](#parquet-mem-cache-prune-interval)
- [disable-parquet-mem-cache](#disable-parquet-mem-cache)
@ -153,6 +150,7 @@ influxdb3 serve
- [bucket](#bucket)
- [data-dir](#data-dir)
- [node-id](#node-id)
- [cluster-id](#cluster-id)
- [mode](#mode)
- [license-email](#license-email)
- [query-file-limit](#query-file-limit)
@ -162,12 +160,12 @@ influxdb3 serve
Specifies which object storage to use to store Parquet files.
This option supports the following values:
- `memory` _(default)_
- `memory-throttled`
- `file`
- `s3`
- `google`
- `azure`
- `memory` _(default)_: Effectively no object persistence
- `memory-throttled`: Like `memory` but with latency and throughput that somewhat resembles a cloud object store
- `file`: Stores objects in the local filesystem (must also set `--data-dir`)
- `s3`: Amazon S3 (must also set `--bucket`, `--aws-access-key-id`, `--aws-secret-access-key`, and possibly `--aws-default-region`)
- `google`: Google Cloud Storage (must also set `--bucket` and `--google-service-account`)
- `azure`: Microsoft Azure blob storage (must also set `--bucket`, `--azure-storage-account`, and `--azure-storage-access-key`)
| influxdb3 serve option | Environment variable |
| :--------------------- | :----------------------- |
@ -197,17 +195,30 @@ configuration--for example, the same bucket.
---
#### cluster-id
Specifies the cluster identifier that prefixes the object store path for the Enterprise Catalog.
This value must be different than the [`--node-id`](#node-id) value.
| influxdb3 serve option | Environment variable |
| :--------------------- | :--------------------------------- |
| `--cluster-id` | `INFLUXDB3_ENTERPRISE_CLUSTER_ID` |
---
#### mode
Sets the mode to start the server in.
This option supports the following values:
- `read`
- `read_write` _(default)_
- `compactor`
- `all` _(default)_
- `ingest`
- `query`
- `compact`
- `process`
**Default:** `read_write`
**Default:** `all`
| influxdb3 serve option | Environment variable |
| :--------------------- | :-------------------------- |
@ -844,9 +855,10 @@ Specifies the size of the RAM cache used to store data, in bytes.
#### exec-mem-pool-bytes
Specifies the size of the memory pool used during query execution, in bytes.
Specifies the size of memory pool used during query execution.
Can be given as absolute value in bytes or as a percentage of the total available memory (for example: `10%`).
**Default:** `8589934592`
**Default:** `20%`
| influxdb3 serve option | Environment variable |
| :---------------------- | :------------------------------ |
@ -854,26 +866,14 @@ Specifies the size of the memory pool used during query execution, in bytes.
---
#### buffer-mem-limit-mb
Specifies the size limit of the buffered data in MB. If this limit is exceeded,
the server forces a snapshot.
**Default:** `5000`
| influxdb3 serve option | Environment variable |
| :---------------------- | :------------------------------ |
| `--buffer-mem-limit-mb` | `INFLUXDB3_BUFFER_MEM_LIMIT_MB` |
---
#### force-snapshot-mem-threshold
<span id="buffer-mem-limit-mb" />
Specifies the threshold for the internal memory buffer. Supports either a
percentage (portion of available memory)of or absolute value
(total bytes)--for example: `70%` or `100000`.
percentage (portion of available memory) or absolute value in MB
(total bytes)--for example: `70%` or `1000 MB`.
**Default:** `70%`
**Default:** `50%`
| influxdb3 serve option | Environment variable |
| :------------------------------- | :--------------------------------------- |
@ -972,47 +972,31 @@ Defines the interval at which each replica specified in the
### Compaction
- [compactor-id](#compactor-id)
- [compact-from-node-ids](#compact-from-node-ids)
- [run-compactions](#run-compactions)
- [compaction-row-limit](#compaction-row-limit)
- [compaction-max-num-files-per-plan](#compaction-max-num-files-per-plan)
- [compaction-gen2-duration](#compaction-gen2-duration)
- [compaction-multipliers](#compaction-multipliers)
- [compaction-cleanup-wait](#compaction-cleanup-wait)
- [gen1-duration](#gen1-duration)
#### compactor-id
Specifies the prefix in the object store where all compacted data is written.
Provide this option only if this server should handle compaction for its own
write buffer and any replicas it manages.
| influxdb3 serve option | Environment variable |
| :--------------------- | :---------------------------------- |
| `--compactor-id` | `INFLUXDB3_ENTERPRISE_COMPACTOR_ID` |
> [!Important]
> This option has been superseded by using `--mode compact`. See the [mode](#mode) section for details.
---
#### compact-from-node-ids
Defines a comma-separated list of writer identifier prefixes from which data is
compacted.
| influxdb3 serve option | Environment variable |
| :-------------------------- | :--------------------------------------------- |
| `--compact-from-node-ids` | `INFLUXDB3_ENTERPRISE_COMPACT_FROM_WRITER_IDS` |
> [!Important]
> This option has been superseded by using `--mode compact`. See the [mode](#mode) section for details.
---
#### run-compactions
Indicates that the server should run compactions. Only a single server should
run compactions for a given `compactor-id`. This option is only applicable if a
`compactor-id` is set.
| influxdb3 serve option | Environment variable |
| :--------------------- | :------------------------------------- |
| `--run-compactions` | `INFLUXDB3_ENTERPRISE_RUN_COMPACTIONS` |
> [!Important]
> This option has been superseded by using `--mode compact`. See the [mode](#mode) section for details.
---
@ -1070,6 +1054,19 @@ compaction levels. The first element specifies the duration of the first level
---
#### compaction-cleanup-wait
Specifies the amount of time that the compactor waits after finishing a compaction run
to delete files marked as needing deletion during that compaction run.
**Default:** `10m`
| influxdb3 serve option | Environment variable |
| :-------------------------- | :--------------------------------------------- |
| `--compaction-cleanup-wait` | `INFLUXDB3_ENTERPRISE_COMPACTION_CLEANUP_WAIT` |
---
#### gen1-duration
Specifies the duration that Parquet files are arranged into. Data timestamps
@ -1088,7 +1085,7 @@ compactor can merge into larger generations.
### Caching
- [preemptive-cache-age](#preemptive-cache-age)
- [parquet-mem-cache-size-mb](#parquet-mem-cache-size-mb)
- [parquet-mem-cache-size](#parquet-mem-cache-size)
- [parquet-mem-cache-prune-percentage](#parquet-mem-cache-prune-percentage)
- [parquet-mem-cache-prune-interval](#parquet-mem-cache-prune-interval)
- [disable-parquet-mem-cache](#disable-parquet-mem-cache)
@ -1108,17 +1105,16 @@ Specifies the interval to prefetch into the Parquet cache during compaction.
---
#### parquet-mem-cache-size-mb
#### parquet-mem-cache-size
<span id="parquet-mem-cache-size-mb" />
Defines the size of the in-memory Parquet cache in megabytes (MB).
Specifies the size of the in-memory Parquet cache in megabytes or percentage of total available memory.
**Default:** `1000`
**Default:** `20%`
| influxdb3 serve option | Environment variable |
| :---------------------------- | :------------------------------------ |
| `--parquet-mem-cache-size-mb` | `INFLUXDB3_PARQUET_MEM_CACHE_SIZE_MB` |
---
| influxdb3 serve option | Environment variable |
| :-------------------------- | :---------------------------------- |
| `--parquet-mem-cache-size` | `INFLUXDB3_PARQUET_MEM_CACHE_SIZE` |
#### parquet-mem-cache-prune-percentage
@ -1225,7 +1221,12 @@ engine uses.
Specifies the Python package manager that the processing engine uses.
**Default:** `10s`
This option supports the following values:
- `discover` _(default)_: Automatically discover available package manager
- `pip`: Use pip package manager
- `uv`: Use uv package manager
**Default:** `discover`
| influxdb3 serve option | Environment variable |
| :--------------------- | :------------------- |

View File

@ -3,32 +3,43 @@
describe('Article links', () => {
const subjects = Cypress.env('test_subjects').split(',');
// Always use HEAD for downloads to avoid timeouts
const useHeadForDownloads = true;
const useHeadForDownloads = true;
// Helper function to identify download links - improved
function isDownloadLink(href) {
// Check for common download file extensions
const downloadExtensions = [
'.pdf', '.zip', '.tar.gz', '.tgz', '.rar', '.exe', '.dmg', '.pkg',
'.deb', '.rpm', '.xlsx', '.csv', '.doc', '.docx', '.ppt', '.pptx'
'.pdf',
'.zip',
'.tar.gz',
'.tgz',
'.rar',
'.exe',
'.dmg',
'.pkg',
'.deb',
'.rpm',
'.xlsx',
'.csv',
'.doc',
'.docx',
'.ppt',
'.pptx',
];
// Check for download domains or paths
const downloadDomains = [
'dl.influxdata.com',
'downloads.influxdata.com'
];
const downloadDomains = ['dl.influxdata.com', 'downloads.influxdata.com'];
// Check if URL contains a download extension
const hasDownloadExtension = downloadExtensions.some(ext =>
const hasDownloadExtension = downloadExtensions.some((ext) =>
href.toLowerCase().endsWith(ext)
);
// Check if URL is from a download domain
const isFromDownloadDomain = downloadDomains.some(domain =>
const isFromDownloadDomain = downloadDomains.some((domain) =>
href.toLowerCase().includes(domain)
);
// Return true if either condition is met
return hasDownloadExtension || isFromDownloadDomain;
}
@ -40,19 +51,31 @@ describe('Article links', () => {
cy.request({
method: 'HEAD',
url: href,
failOnStatusCode: false,
timeout: 10000 // 10 second timeout for download links
}).then(response => {
expect(response.status).to.be.lt(400);
}).then((response) => {
const message = `Link is broken: ${href} (status: ${response.status})`;
try {
expect(response.status).to.be.lt(400);
} catch (e) {
// Log the broken link with the URL for better visibility in reports
cy.log(`❌ BROKEN LINK: ${href} (${response.status})`);
throw new Error(message);
}
});
} else {
cy.log(`** Testing link: ${href} **`);
cy.request({
url: href,
failOnStatusCode: false,
timeout: 30000 // 30 second timeout for regular links
}).then(response => {
expect(response.status).to.be.lt(400);
timeout: 10000, // 10 second timeout for regular links
}).then((response) => {
const message = `Link is broken: ${href} (status: ${response.status})`;
try {
expect(response.status).to.be.lt(400);
} catch (e) {
// Log the broken link with the URL for better visibility in reports
cy.log(`❌ BROKEN LINK: ${href} (${response.status})`);
throw new Error(message);
}
});
}
}
@ -60,66 +83,94 @@ describe('Article links', () => {
subjects.forEach((subject) => {
it(`contains valid internal links on ${subject}`, function () {
cy.visit(`${subject}`);
// Test internal links (including anchor links)
cy.get('article a[href^="/"]').each(($a) => {
const href = $a.attr('href');
// Skip links that contain "kapa.ai"
if (!href.includes('kapa.ai')) {
testLink(href);
// Test internal links
// 1. Timeout and fail the test if article is not found
// 2. Check each link.
// 3. If no links are found, continue without failing
cy.get('article').then(($article) => {
// Find links without failing the test if none are found
const $links = $article.find('a[href^="/"]');
if ($links.length === 0) {
cy.log('No internal links found on this page');
return;
}
cy.wrap($links).each(($a) => {
const href = $a.attr('href');
testLink(href);
});
});
});
it(`checks anchor links on ${subject} (with warnings for missing targets)`, function () {
cy.visit(`${subject}`);
// Track missing anchors for summary
const missingAnchors = [];
// Process anchor links individually
cy.get('article a[href^="#"]').each(($a) => {
const href = $a.prop('href'); // Use prop() instead of attr()
if (href && href.length > 1) { // Skip empty anchors (#)
// Get just the fragment part
const url = new URL(href);
const anchorId = url.hash.substring(1); // Remove the # character
if (!anchorId) {
cy.log(`Skipping empty anchor in ${href}`);
return;
}
// Use DOM to check if the element exists, but don't fail if missing
cy.window().then(win => {
const element = win.document.getElementById(anchorId);
if (element) {
cy.log(`✅ Anchor target exists: #${anchorId}`);
cy.get('article').then(($article) => {
const $anchorLinks = $article.find('a[href^="#"]');
if ($anchorLinks.length === 0) {
cy.log('No anchor links found on this page');
return;
}
cy.wrap($anchorLinks).each(($a) => {
const href = $a.prop('href');
if (href && href.length > 1) {
// Skip empty anchors (#)
// Get just the fragment part
const url = new URL(href);
const anchorId = url.hash.substring(1); // Remove the # character
if (!anchorId) {
cy.log(`Skipping empty anchor in ${href}`);
return;
}
// Use DOM to check if the element exists, but don't fail if missing
cy.window().then((win) => {
const element = win.document.getElementById(anchorId);
if (element) {
cy.log(`✅ Anchor target exists: #${anchorId}`);
} else {
// Just warn about the missing anchor
cy.log(`⚠️ WARNING: Missing anchor target: #${anchorId}`);
missingAnchors.push(anchorId);
}
});
}
})
.then(() => {
// After checking all anchors, log a summary
if (missingAnchors.length > 0) {
cy.log(
`⚠️ Found ${missingAnchors.length} missing anchor targets: ${missingAnchors.join(', ')}`
);
} else {
// Just warn about the missing anchor
cy.log(`⚠️ WARNING: Missing anchor target: #${anchorId}`);
missingAnchors.push(anchorId);
cy.log('✅ All anchor targets are valid');
}
});
}
}).then(() => {
// After checking all anchors, log a summary
if (missingAnchors.length > 0) {
cy.log(`⚠️ Found ${missingAnchors.length} missing anchor targets: ${missingAnchors.join(', ')}`);
} else {
cy.log('✅ All anchor targets are valid');
}
});
});
it(`contains valid external links on ${subject}`, function () {
cy.visit(`${subject}`);
// Test external links
cy.get('article a[href^="http"]').each(($a) => {
const href = $a.attr('href');
testLink(href);
it(`contains valid external links on ${subject}`, function () {
cy.visit(`${subject}`);
// Test external links
// 1. Timeout and fail the test if article is not found
// 2. Check each link.
// 3. If no links are found, continue without failing
cy.get('article').then(($article) => {
// Find links without failing the test if none are found
const $links = $article.find('a[href^="http"]');
if ($links.length === 0) {
cy.log('No external links found on this page');
return;
}
cy.wrap($links).each(($a) => {
const href = $a.attr('href');
testLink(href);
});
});
});
});
});
});
});