docs(operations): expand LINSTOR DB troubleshooting#552
Conversation
…flicts Adds diagnosis and recovery procedures for failure modes that were not previously covered: - ValueInUseException for duplicate TCP ports on a node (LINBIT/linstor-server#476) - 'did not have tcpPorts stored!' from records missing tcp_port_list Adds a 'CRD API versions and field visibility' section explaining why tcp_port_list and other newer fields are invisible to kubectl through the default served apiVersion, plus warning callouts on the Backup and Restore sections so users take backups via the storage apiVersion. Includes a DrbdRscFlags bitmask reference table for interpreting spec.flags values during diagnosis. Applied to both next/ and v1.4/. Signed-off-by: IvanHunters <xorokhotnikov@gmail.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughThis PR extends the LINSTOR troubleshooting documentation in both ChangesLINSTOR Database Troubleshooting Guide Updates
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
✅ Deploy Preview for cozystack ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
There was a problem hiding this comment.
Code Review
This pull request adds documentation about LINSTOR CRD API versions, field visibility, and troubleshooting database issues (such as duplicate TCP ports or missing tcp_port_list on LayerDrbdResources). The reviewer provided valuable feedback with code suggestions to dynamically fetch the storage version instead of hardcoding v1-31-1 in multiple kubectl commands, making the instructions fully copy-pasteable and less error-prone across different environments.
| ```bash | ||
| # Find the storage version | ||
| kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json \ | ||
| | jq -r '.spec.versions[] | select(.storage==true) | .name' | ||
|
|
||
| # Query via storage version (substitute the version returned above) | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | ||
| | jq '.items[0].spec' | ||
| ``` |
There was a problem hiding this comment.
Instead of hardcoding v1-31-1 and requiring the user to manually substitute the version, we can dynamically fetch the storage version and use it in the query. This makes the command fully copy-pasteable and less error-prone.
| ```bash | |
| # Find the storage version | |
| kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json \ | |
| | jq -r '.spec.versions[] | select(.storage==true) | .name' | |
| # Query via storage version (substitute the version returned above) | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | |
| | jq '.items[0].spec' | |
| ``` | |
| # Find the storage version and query via it directly | |
| VERSION=$(kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json \ | |
| | jq -r '.spec.versions[] | select(.storage==true) | .name') | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerdrbdresources" \ | |
| | jq '.items[0].spec' |
| ```bash | ||
| PORT=7012 # from the error message | ||
| NODE=COZY01 # from the error message, uppercase | ||
|
|
||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | ||
| | jq -r --arg p "[$PORT]" '.items[] | select(.spec.tcp_port_list == $p) | .spec.layer_resource_id' \ | ||
| | while read lri; do | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerresourceids" \ | ||
| | jq -r --argjson l "$lri" '.items[] | select(.spec.layer_resource_id == $l and .spec.layer_resource_kind == "DRBD") | [.spec.layer_resource_id, .spec.node_name, .spec.resource_name] | @tsv' | ||
| done | ||
| ``` |
There was a problem hiding this comment.
Dynamically query the storage version instead of hardcoding v1-31-1 to ensure the command works seamlessly on any cluster regardless of the installed LINSTOR version.
| ```bash | |
| PORT=7012 # from the error message | |
| NODE=COZY01 # from the error message, uppercase | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | |
| | jq -r --arg p "[$PORT]" '.items[] | select(.spec.tcp_port_list == $p) | .spec.layer_resource_id' \ | |
| | while read lri; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerresourceids" \ | |
| | jq -r --argjson l "$lri" '.items[] | select(.spec.layer_resource_id == $l and .spec.layer_resource_kind == "DRBD") | [.spec.layer_resource_id, .spec.node_name, .spec.resource_name] | @tsv' | |
| done | |
| ``` | |
| PORT=7012 # from the error message | |
| NODE=COZY01 # from the error message, uppercase | |
| VERSION=$(kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json | jq -r '.spec.versions[] | select(.storage==true) | .name') | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerdrbdresources" \ | |
| | jq -r --arg p "[$PORT]" '.items[] | select(.spec.tcp_port_list == $p) | .spec.layer_resource_id' \ | |
| | while read lri; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerresourceids" \ | |
| | jq -r --argjson l "$lri" '.items[] | select(.spec.layer_resource_id == $l and .spec.layer_resource_kind == "DRBD") | [.spec.layer_resource_id, .spec.node_name, .spec.resource_name] | @tsv' | |
| done |
| ```bash | ||
| RSC=PVC-31690526-8027-412F-9F13-2766E8D26341 | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerresourceids" \ | ||
| | jq -r --arg r "$RSC" '.items[] | select(.spec.resource_name == $r and .spec.layer_resource_kind == "DRBD") | .spec.layer_resource_id' \ | ||
| | while read l; do | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | ||
| | jq -r --argjson l "$l" '.items[] | select(.spec.layer_resource_id == $l) | [.spec.layer_resource_id, .spec.tcp_port_list, .spec.flags] | @tsv' | ||
| done | ||
| ``` |
There was a problem hiding this comment.
Dynamically query the storage version instead of hardcoding v1-31-1 to ensure the command works seamlessly on any cluster regardless of the installed LINSTOR version.
| ```bash | |
| RSC=PVC-31690526-8027-412F-9F13-2766E8D26341 | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerresourceids" \ | |
| | jq -r --arg r "$RSC" '.items[] | select(.spec.resource_name == $r and .spec.layer_resource_kind == "DRBD") | .spec.layer_resource_id' \ | |
| | while read l; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | |
| | jq -r --argjson l "$l" '.items[] | select(.spec.layer_resource_id == $l) | [.spec.layer_resource_id, .spec.tcp_port_list, .spec.flags] | @tsv' | |
| done | |
| ``` | |
| RSC=PVC-31690526-8027-412F-9F13-2766E8D26341 | |
| VERSION=$(kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json | jq -r '.spec.versions[] | select(.storage==true) | .name') | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerresourceids" \ | |
| | jq -r --arg r "$RSC" '.items[] | select(.spec.resource_name == $r and .spec.layer_resource_kind == "DRBD") | .spec.layer_resource_id' \ | |
| | while read l; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerdrbdresources" \ | |
| | jq -r --argjson l "$l" '.items[] | select(.spec.layer_resource_id == $l) | [.spec.layer_resource_id, .spec.tcp_port_list, .spec.flags] | @tsv' | |
| done |
| ```bash | ||
| RSC=PVC-31690526-8027-412F-9F13-2766E8D26341 | ||
| for kind in resourcedefinitions layerdrbdresourcedefinitions volumedefinitions layerdrbdvolumedefinitions; do | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/$kind" \ | ||
| | jq -r --arg r "$RSC" '.items[] | select(.spec.resource_name == $r) | "\(.kind).internal.linstor.linbit.com/\(.metadata.name)"' | ||
| done | ||
| ``` |
There was a problem hiding this comment.
Dynamically query the storage version instead of hardcoding v1-31-1 to ensure the command works seamlessly on any cluster regardless of the installed LINSTOR version.
| ```bash | |
| RSC=PVC-31690526-8027-412F-9F13-2766E8D26341 | |
| for kind in resourcedefinitions layerdrbdresourcedefinitions volumedefinitions layerdrbdvolumedefinitions; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/$kind" \ | |
| | jq -r --arg r "$RSC" '.items[] | select(.spec.resource_name == $r) | "\(.kind).internal.linstor.linbit.com/\(.metadata.name)"' | |
| done | |
| ``` | |
| RSC=PVC-31690526-8027-412F-9F13-2766E8D26341 | |
| VERSION=$(kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json | jq -r '.spec.versions[] | select(.storage==true) | .name') | |
| for kind in resourcedefinitions layerdrbdresourcedefinitions volumedefinitions layerdrbdvolumedefinitions; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/$kind" \ | |
| | jq -r --arg r "$RSC" '.items[] | select(.spec.resource_name == $r) | "\(.kind).internal.linstor.linbit.com/\(.metadata.name)"' | |
| done |
| ```bash | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | ||
| | jq -r '.items[] | select(.spec.tcp_port_list == null or .spec.tcp_port_list == "") | .spec.layer_resource_id' \ | ||
| | while read lri; do | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerresourceids" \ | ||
| | jq -r --argjson l "$lri" '.items[] | select(.spec.layer_resource_id == $l and .spec.layer_resource_kind == "DRBD") | [.spec.layer_resource_id, .spec.node_name, .spec.resource_name] | @tsv' | ||
| done | ||
| ``` |
There was a problem hiding this comment.
Dynamically query the storage version instead of hardcoding v1-31-1 to ensure the command works seamlessly on any cluster regardless of the installed LINSTOR version.
| ```bash | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | |
| | jq -r '.items[] | select(.spec.tcp_port_list == null or .spec.tcp_port_list == "") | .spec.layer_resource_id' \ | |
| | while read lri; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerresourceids" \ | |
| | jq -r --argjson l "$lri" '.items[] | select(.spec.layer_resource_id == $l and .spec.layer_resource_kind == "DRBD") | [.spec.layer_resource_id, .spec.node_name, .spec.resource_name] | @tsv' | |
| done | |
| ``` | |
| VERSION=$(kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json | jq -r '.spec.versions[] | select(.storage==true) | .name') | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerdrbdresources" \ | |
| | jq -r '.items[] | select(.spec.tcp_port_list == null or .spec.tcp_port_list == "") | .spec.layer_resource_id' \ | |
| | while read lri; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerresourceids" \ | |
| | jq -r --argjson l "$lri" '.items[] | select(.spec.layer_resource_id == $l and .spec.layer_resource_kind == "DRBD") | [.spec.layer_resource_id, .spec.node_name, .spec.resource_name] | @tsv' | |
| done |
| ```bash | ||
| # Find the storage version | ||
| kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json \ | ||
| | jq -r '.spec.versions[] | select(.storage==true) | .name' | ||
|
|
||
| # Query via storage version (substitute the version returned above) | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | ||
| | jq '.items[0].spec' | ||
| ``` |
There was a problem hiding this comment.
Instead of hardcoding v1-31-1 and requiring the user to manually substitute the version, we can dynamically fetch the storage version and use it in the query. This makes the command fully copy-pasteable and less error-prone.
| ```bash | |
| # Find the storage version | |
| kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json \ | |
| | jq -r '.spec.versions[] | select(.storage==true) | .name' | |
| # Query via storage version (substitute the version returned above) | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | |
| | jq '.items[0].spec' | |
| ``` | |
| # Find the storage version and query via it directly | |
| VERSION=$(kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json \ | |
| | jq -r '.spec.versions[] | select(.storage==true) | .name') | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerdrbdresources" \ | |
| | jq '.items[0].spec' |
| ```bash | ||
| PORT=7012 # from the error message | ||
| NODE=COZY01 # from the error message, uppercase | ||
|
|
||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | ||
| | jq -r --arg p "[$PORT]" '.items[] | select(.spec.tcp_port_list == $p) | .spec.layer_resource_id' \ | ||
| | while read lri; do | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerresourceids" \ | ||
| | jq -r --argjson l "$lri" '.items[] | select(.spec.layer_resource_id == $l and .spec.layer_resource_kind == "DRBD") | [.spec.layer_resource_id, .spec.node_name, .spec.resource_name] | @tsv' | ||
| done | ||
| ``` |
There was a problem hiding this comment.
Dynamically query the storage version instead of hardcoding v1-31-1 to ensure the command works seamlessly on any cluster regardless of the installed LINSTOR version.
| ```bash | |
| PORT=7012 # from the error message | |
| NODE=COZY01 # from the error message, uppercase | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | |
| | jq -r --arg p "[$PORT]" '.items[] | select(.spec.tcp_port_list == $p) | .spec.layer_resource_id' \ | |
| | while read lri; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerresourceids" \ | |
| | jq -r --argjson l "$lri" '.items[] | select(.spec.layer_resource_id == $l and .spec.layer_resource_kind == "DRBD") | [.spec.layer_resource_id, .spec.node_name, .spec.resource_name] | @tsv' | |
| done | |
| ``` | |
| PORT=7012 # from the error message | |
| NODE=COZY01 # from the error message, uppercase | |
| VERSION=$(kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json | jq -r '.spec.versions[] | select(.storage==true) | .name') | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerdrbdresources" \ | |
| | jq -r --arg p "[$PORT]" '.items[] | select(.spec.tcp_port_list == $p) | .spec.layer_resource_id' \ | |
| | while read lri; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerresourceids" \ | |
| | jq -r --argjson l "$lri" '.items[] | select(.spec.layer_resource_id == $l and .spec.layer_resource_kind == "DRBD") | [.spec.layer_resource_id, .spec.node_name, .spec.resource_name] | @tsv' | |
| done |
| ```bash | ||
| RSC=PVC-31690526-8027-412F-9F13-2766E8D26341 | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerresourceids" \ | ||
| | jq -r --arg r "$RSC" '.items[] | select(.spec.resource_name == $r and .spec.layer_resource_kind == "DRBD") | .spec.layer_resource_id' \ | ||
| | while read l; do | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | ||
| | jq -r --argjson l "$l" '.items[] | select(.spec.layer_resource_id == $l) | [.spec.layer_resource_id, .spec.tcp_port_list, .spec.flags] | @tsv' | ||
| done | ||
| ``` |
There was a problem hiding this comment.
Dynamically query the storage version instead of hardcoding v1-31-1 to ensure the command works seamlessly on any cluster regardless of the installed LINSTOR version.
| ```bash | |
| RSC=PVC-31690526-8027-412F-9F13-2766E8D26341 | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerresourceids" \ | |
| | jq -r --arg r "$RSC" '.items[] | select(.spec.resource_name == $r and .spec.layer_resource_kind == "DRBD") | .spec.layer_resource_id' \ | |
| | while read l; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | |
| | jq -r --argjson l "$l" '.items[] | select(.spec.layer_resource_id == $l) | [.spec.layer_resource_id, .spec.tcp_port_list, .spec.flags] | @tsv' | |
| done | |
| ``` | |
| RSC=PVC-31690526-8027-412F-9F13-2766E8D26341 | |
| VERSION=$(kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json | jq -r '.spec.versions[] | select(.storage==true) | .name') | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerresourceids" \ | |
| | jq -r --arg r "$RSC" '.items[] | select(.spec.resource_name == $r and .spec.layer_resource_kind == "DRBD") | .spec.layer_resource_id' \ | |
| | while read l; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerdrbdresources" \ | |
| | jq -r --argjson l "$l" '.items[] | select(.spec.layer_resource_id == $l) | [.spec.layer_resource_id, .spec.tcp_port_list, .spec.flags] | @tsv' | |
| done |
| ```bash | ||
| RSC=PVC-31690526-8027-412F-9F13-2766E8D26341 | ||
| for kind in resourcedefinitions layerdrbdresourcedefinitions volumedefinitions layerdrbdvolumedefinitions; do | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/$kind" \ | ||
| | jq -r --arg r "$RSC" '.items[] | select(.spec.resource_name == $r) | "\(.kind).internal.linstor.linbit.com/\(.metadata.name)"' | ||
| done | ||
| ``` |
There was a problem hiding this comment.
Dynamically query the storage version instead of hardcoding v1-31-1 to ensure the command works seamlessly on any cluster regardless of the installed LINSTOR version.
| ```bash | |
| RSC=PVC-31690526-8027-412F-9F13-2766E8D26341 | |
| for kind in resourcedefinitions layerdrbdresourcedefinitions volumedefinitions layerdrbdvolumedefinitions; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/$kind" \ | |
| | jq -r --arg r "$RSC" '.items[] | select(.spec.resource_name == $r) | "\(.kind).internal.linstor.linbit.com/\(.metadata.name)"' | |
| done | |
| ``` | |
| RSC=PVC-31690526-8027-412F-9F13-2766E8D26341 | |
| VERSION=$(kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json | jq -r '.spec.versions[] | select(.storage==true) | .name') | |
| for kind in resourcedefinitions layerdrbdresourcedefinitions volumedefinitions layerdrbdvolumedefinitions; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/$kind" \ | |
| | jq -r --arg r "$RSC" '.items[] | select(.spec.resource_name == $r) | "\(.kind).internal.linstor.linbit.com/\(.metadata.name)"' | |
| done |
| ```bash | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | ||
| | jq -r '.items[] | select(.spec.tcp_port_list == null or .spec.tcp_port_list == "") | .spec.layer_resource_id' \ | ||
| | while read lri; do | ||
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerresourceids" \ | ||
| | jq -r --argjson l "$lri" '.items[] | select(.spec.layer_resource_id == $l and .spec.layer_resource_kind == "DRBD") | [.spec.layer_resource_id, .spec.node_name, .spec.resource_name] | @tsv' | ||
| done | ||
| ``` |
There was a problem hiding this comment.
Dynamically query the storage version instead of hardcoding v1-31-1 to ensure the command works seamlessly on any cluster regardless of the installed LINSTOR version.
| ```bash | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerdrbdresources" \ | |
| | jq -r '.items[] | select(.spec.tcp_port_list == null or .spec.tcp_port_list == "") | .spec.layer_resource_id' \ | |
| | while read lri; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/v1-31-1/layerresourceids" \ | |
| | jq -r --argjson l "$lri" '.items[] | select(.spec.layer_resource_id == $l and .spec.layer_resource_kind == "DRBD") | [.spec.layer_resource_id, .spec.node_name, .spec.resource_name] | @tsv' | |
| done | |
| ``` | |
| VERSION=$(kubectl get crd layerdrbdresources.internal.linstor.linbit.com -o json | jq -r '.spec.versions[] | select(.storage==true) | .name') | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerdrbdresources" \ | |
| | jq -r '.items[] | select(.spec.tcp_port_list == null or .spec.tcp_port_list == "") | .spec.layer_resource_id' \ | |
| | while read lri; do | |
| kubectl get --raw "/apis/internal.linstor.linbit.com/$VERSION/layerresourceids" \ | |
| | jq -r --argjson l "$lri" '.items[] | select(.spec.layer_resource_id == $l and .spec.layer_resource_kind == "DRBD") | [.spec.layer_resource_id, .spec.node_name, .spec.resource_name] | @tsv' | |
| done |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@content/en/docs/next/operations/troubleshooting/linstor-database.md`:
- Around line 429-435: The doc hard-codes the storage API version "v1-31-1" in
several kubectl commands (e.g., the kubectl get --raw lines selecting
layerdrbdresources and layerresourceids), which can break on clusters with a
different storage API; update those commands to use the discovered
${STORAGE_VERSION} variable instead of the literal "v1-31-1" in all affected
snippets (lines shown and also the other occurrences noted: 465-470, 502-504,
524-529) so the commands reference
"/apis/internal.linstor.linbit.com/${STORAGE_VERSION}/..." and remain portable.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 0b432932-56b0-4140-be35-cd439956964b
📒 Files selected for processing (2)
content/en/docs/next/operations/troubleshooting/linstor-database.mdcontent/en/docs/v1.4/operations/troubleshooting/linstor-database.md
Aleksei Sviridkin (lexfrei)
left a comment
There was a problem hiding this comment.
Fix hard wraps please
- Unwrap hard-wrapped paragraphs to match project markdown convention
- Replace hard-coded v1-31-1 with ${STORAGE_VERSION} variable in all
kubectl --raw commands, discovered once at the start of the section
and reused across snippets
Addresses review comments from lexfrei, gemini-code-assist, and
coderabbitai on PR #552.
Signed-off-by: IvanHunters <xorokhotnikov@gmail.com>
Summary
Extends the LINSTOR CrashLoopBackOff recovery guide (
operations/troubleshooting/linstor-database) with diagnosis and recovery procedures for two failure modes that were not previously covered:ValueInUseException: <node>'s TCP port N is already in use— duplicatetcp_port_listrecords on the same node, often a leftover of a botchedtoggle-diskoperation on LINSTOR ≥ v1.31.2 (tracked upstream in LINBIT/linstor-server#476)did not have tcpPorts stored!—LayerDrbdResourcesrecords missing thetcp_port_listfield, typically a side effect of restoring from a backup taken via an older served apiVersionAdds a new "CRD API versions and field visibility" section explaining why
tcp_port_listand other newer fields are invisible tokubectl getthrough the default served apiVersion, and adds warning callouts to the existingBackup and analyzeandRestore to the original statesections so users take backups via the storage apiVersion.Includes a
DrbdRscFlagsbitmask reference table to help interpretspec.flagsvalues during diagnosis.Applied to both
next/andv1.4/.Test plan
Summary by CodeRabbit