Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions charts/sourcegraph/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Use `**BREAKING**:` to denote a breaking change

- Added opt-in Redis config management through `redisCache.config.enabled` and `redisStore.config.enabled` (both default to `false`). Default deployments retain their image configs, custom mounts, authentication, and memory settings. When enabled, the chart mounts `/etc/redis/redis.conf` and supports `existingConfig`, `maxmemory`, `maxmemoryRatio`, `maxmemoryPolicy`, and `additionalConfig`. See [Enabling Redis config management](README.md#enabling-redis-config-management) before opting in, especially when using custom images or Secret-mounted configs.
- With Redis config management enabled, the chart sizes `maxmemory` at 75% of `resources.limits.memory` to leave room for overhead; this reduces, but does not eliminate, OOM risk. Ratios must be greater than 0 and less than 1. Auto-sizing is skipped in local development mode or when the limit is absent or unrecognised. At the default 7Gi limit, opting in lowers the effective cap from 6GiB to 5.25GiB: `redis-cache` evicts earlier, but `redis-store` uses `noeviction`, so its write-error ceiling drops too. Set `redisStore.config.maxmemory: 6gb` to keep the old ceiling if the pod has sufficient memory.
- `searcher.storageSize` now accepts any Kubernetes quantity (e.g. `150G`, `1Ti`, `1.5Ti`, `500000M`) when deriving `SEARCHER_CACHE_SIZE_MB` and `SYMBOLS_CACHE_SIZE_MB`. Previously anything other than `Gi` silently rendered both as `0`, which disables cache eviction and lets the cache volume fill up. Unparseable values, or values below `3M`, now fail the render unless `searcher.autoCacheSize` is enabled. The derived size now matches searcher's own auto-sizing arithmetic (45% of the volume in decimal megabytes), so existing `Gi` deployments see a slightly higher value on upgrade, e.g. the default `26Gi` renders `12562` instead of `11700`.
- Added a `network-policy` example, which limits Executor and Executor job pods to the frontend API
- Corrected the external object storage examples to configure the shared store for frontend, worker, precise code intel, syntactic code intel, gitserver, and searcher, including credentials or workload service accounts as required.
- Removed the unused application ports from the precise and syntactic code intel worker Deployments and Services; health checks and Prometheus metrics continue to use the debug server on port 6060.
Expand Down
2 changes: 1 addition & 1 deletion charts/sourcegraph/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,7 @@ In addition to the documented values, all services also support the following va
| searcher.serviceAccount.create | bool | `false` | Enable creation of ServiceAccount for `searcher` |
| searcher.serviceAccount.name | string | `""` | Name of the ServiceAccount to be created or an existing ServiceAccount |
| searcher.storageAnnotations | object | `{}` | Optional annotations to add to the `searcher` PVC |
| searcher.storageSize | string | `"26Gi"` | Size of the PVC for searcher pods to store cache data |
| searcher.storageSize | string | `"26Gi"` | Size of the PVC for searcher pods to store cache data. Unless `autoCacheSize` is enabled, this must be a Kubernetes quantity (e.g. `150G`, `100Gi`, `1Ti`) of at least `3M`, so the chart can derive `SEARCHER_CACHE_SIZE_MB` and `SYMBOLS_CACHE_SIZE_MB` from it |
| searcher.storageSubPath | string | `""` | Optional subPath for the `searcher` primary data volume mount |
| sgTestConnection | object | `{"enabled":true}` | Enable the busybox connection test after deployment |
| sourcegraph.affinity | object | `{}` | Global Affinity, learn more from the [Kubernetes documentation](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity) |
Expand Down
28 changes: 21 additions & 7 deletions charts/sourcegraph/templates/_helpers.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,24 @@ checksum/auth: {{ toJson $checksum | sha256sum }}
checksum/redis: {{ toJson $checksum | sha256sum }}
{{- end -}}

{{/*
Convert a Kubernetes resource quantity (e.g. 7Gi, 1.5G, 500M, 1Ti, 6442450944)
to a whole number of bytes, rounded down. Renders an empty string when the
value is not a recognised quantity, so callers can decide whether to fall back
or fail.
Usage: include "sourcegraph.quantityBytes" .Values.searcher.storageSize
*/}}
{{- define "sourcegraph.quantityBytes" -}}
{{- $quantity := . | toString -}}
{{- $number := regexReplaceAll "^([0-9]+(\\.[0-9]+)?).*$" $quantity "${1}" -}}
{{- $suffix := regexReplaceAll "^[0-9]+(\\.[0-9]+)?" $quantity "" -}}
{{- /* Kubernetes quantity suffixes: binary (1024^n) and decimal (1000^n). */ -}}
{{- $units := dict "" 1.0 "k" 1e3 "M" 1e6 "G" 1e9 "T" 1e12 "P" 1e15 "E" 1e18 "Ki" 1024.0 "Mi" 1048576.0 "Gi" 1073741824.0 "Ti" 1099511627776.0 "Pi" 1125899906842624.0 "Ei" 1152921504606846976.0 -}}
{{- if and (regexMatch "^[0-9]+(\\.[0-9]+)?$" $number) (hasKey $units $suffix) -}}
{{- printf "%d" (int64 (floor (mulf (float64 $number) (index $units $suffix)))) -}}
{{- end -}}
{{- end -}}

{{/*
Resolve the redis `maxmemory` directive for a service.
Usage: include "sourcegraph.redis.maxmemory" (list . "redisCache")
Expand All @@ -333,20 +351,16 @@ Resolution order:
{{- if $config.maxmemory -}}
{{- $config.maxmemory -}}
{{- else if not $top.Values.sourcegraph.localDevMode -}}
{{- $limit := dig "resources" "limits" "memory" "" $values | toString -}}
{{- $number := regexReplaceAll "^([0-9]+(\\.[0-9]+)?).*$" $limit "${1}" -}}
{{- $suffix := regexReplaceAll "^[0-9]+(\\.[0-9]+)?" $limit "" -}}
{{- /* Kubernetes quantity suffixes: binary (1024^n) and decimal (1000^n). */ -}}
{{- $units := dict "" 1.0 "k" 1e3 "M" 1e6 "G" 1e9 "T" 1e12 "P" 1e15 "E" 1e18 "Ki" 1024.0 "Mi" 1048576.0 "Gi" 1073741824.0 "Ti" 1099511627776.0 "Pi" 1125899906842624.0 "Ei" 1152921504606846976.0 -}}
{{- if and (regexMatch "^[0-9]+(\\.[0-9]+)?$" $number) (hasKey $units $suffix) -}}
{{- $limit := include "sourcegraph.quantityBytes" (dig "resources" "limits" "memory" "" $values) -}}
{{- if $limit -}}
{{- $ratio := 0.75 -}}
{{- if hasKey $config "maxmemoryRatio" -}}
{{- $ratio = float64 $config.maxmemoryRatio -}}
{{- end -}}
{{- if not (and (gt $ratio 0.0) (lt $ratio 1.0)) -}}
{{- fail (printf "%s.config.maxmemoryRatio must be greater than 0 and less than 1" $service) -}}
{{- end -}}
{{- $bytes := floor (mulf (float64 $number) (index $units $suffix) $ratio) -}}
{{- $bytes := floor (mulf (float64 $limit) $ratio) -}}
{{- if gt $bytes 0.0 -}}
{{- printf "%d" (int64 $bytes) -}}
{{- end -}}
Expand Down
22 changes: 22 additions & 0 deletions charts/sourcegraph/templates/_helpers/_searcherCacheSize.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{{/*
45% of searcher.storageSize in whole (decimal) megabytes, for
SEARCHER_CACHE_SIZE_MB and SYMBOLS_CACHE_SIZE_MB. Mirrors the arithmetic
searcher uses when it auto-sizes from the volume: floor(bytes / 1e6) * 45 / 100.
Accepts any Kubernetes quantity (e.g. 150G, 100Gi, 1.5Ti, 500000M).
Anything unparseable, or anything so small the result would be 0, fails the
render: searcher treats an explicit 0 as "never evict" (unlike an unset
variable, which auto-sizes), so the cache volume would fill up.
*/}}
{{- define "sourcegraph.searcher.cacheSizeMB" -}}
{{- $size := .Values.searcher.storageSize | default "26Gi" | toString -}}
{{- $bytes := include "sourcegraph.quantityBytes" $size -}}
{{- if not $bytes -}}
{{- fail (printf "searcher.storageSize must be a Kubernetes quantity such as 150G, 100Gi or 1Ti (got %q), or set searcher.autoCacheSize=true" $size) -}}
{{- end -}}
{{- $megabytes := div (mul (div (int64 $bytes) 1000000) 45) 100 -}}
{{- if le $megabytes 0 -}}
{{- fail (printf "searcher.storageSize %s is too small to derive a non-zero cache size; use at least 3M, or set searcher.autoCacheSize=true" $size) -}}
{{- end -}}
{{- $megabytes -}}
{{- end -}}
19 changes: 3 additions & 16 deletions charts/sourcegraph/templates/searcher/searcher.StatefulSet.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,24 +62,11 @@ spec:
# sizes its cache to ~45% of the live cache volume, tracking PVC
# expansion automatically. SEARCHER_CACHE_SIZE_MB / SYMBOLS_CACHE_SIZE_MB
# are deprecated in favor of this auto-detection.
# Both caches share the PVC below and each gets ~45% of it.
- name: SEARCHER_CACHE_SIZE_MB
# Set the cache size to ~45% of the PVC size
{{- if .Values.searcher.storageSize }}
value: {{ trimSuffix "Gi" .Values.searcher.storageSize | mul 450 | quote }}
{{- else }}
# This value is ~45% of the default value for
# storageSize in the VolumeClaimTemplate below
value: "11700"
{{- end }}
value: {{ include "sourcegraph.searcher.cacheSizeMB" . | quote }}
- name: SYMBOLS_CACHE_SIZE_MB
# Set the cache size to ~45% of the PVC size
{{- if .Values.searcher.storageSize }}
value: {{ trimSuffix "Gi" .Values.searcher.storageSize | mul 450 | quote }}
{{- else }}
# This value is ~45% of the default value for
# storageSize in the VolumeClaimTemplate below
value: "11700"
{{- end }}
value: {{ include "sourcegraph.searcher.cacheSizeMB" . | quote }}
{{- end }}
- name: POD_NAME
valueFrom:
Expand Down
124 changes: 124 additions & 0 deletions charts/sourcegraph/tests/searcherCacheSize_test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
suite: searcher cache size
templates:
- searcher/searcher.StatefulSet.yaml
tests:
- it: should size both caches to 45% of the default storageSize
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: SEARCHER_CACHE_SIZE_MB
value: "12562"
- contains:
path: spec.template.spec.containers[0].env
content:
name: SYMBOLS_CACHE_SIZE_MB
value: "12562"
- it: should accept storageSize in Gi
set:
searcher:
storageSize: 100Gi
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: SEARCHER_CACHE_SIZE_MB
value: "48318"
- contains:
path: spec.template.spec.containers[0].env
content:
name: SYMBOLS_CACHE_SIZE_MB
value: "48318"
- it: should accept storageSize in G
set:
searcher:
storageSize: 150G
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: SEARCHER_CACHE_SIZE_MB
value: "67500"
- contains:
path: spec.template.spec.containers[0].env
content:
name: SYMBOLS_CACHE_SIZE_MB
value: "67500"
- equal:
path: spec.volumeClaimTemplates[0].spec.resources.requests.storage
value: 150G
- it: should accept storageSize in M
set:
searcher:
storageSize: 500000M
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: SEARCHER_CACHE_SIZE_MB
value: "225000"
- it: should accept storageSize in Ti
set:
searcher:
storageSize: 1Ti
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: SEARCHER_CACHE_SIZE_MB
value: "494779"
- contains:
path: spec.template.spec.containers[0].env
content:
name: SYMBOLS_CACHE_SIZE_MB
value: "494779"
- it: should accept a fractional storageSize
set:
searcher:
storageSize: 1.5G
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: SEARCHER_CACHE_SIZE_MB
value: "675"
- it: should accept a suffixless byte count and round down to whole megabytes
set:
searcher:
storageSize: "6442450944"
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: SEARCHER_CACHE_SIZE_MB
value: "2898"
- it: should fail on an unrecognised quantity instead of disabling eviction
set:
searcher:
storageSize: 1Tb
asserts:
- failedTemplate:
errorMessage: searcher.storageSize must be a Kubernetes quantity such as 150G, 100Gi or 1Ti (got "1Tb"), or set searcher.autoCacheSize=true
- it: should fail when the derived cache size would be 0 instead of disabling eviction
set:
searcher:
storageSize: 2M
asserts:
- failedTemplate:
errorMessage: searcher.storageSize 2M is too small to derive a non-zero cache size; use at least 3M, or set searcher.autoCacheSize=true
- it: should not need a parseable storageSize when autoCacheSize is enabled
set:
searcher:
autoCacheSize: true
storageSize: 1Tb
asserts:
- notContains:
path: spec.template.spec.containers[0].env
content:
name: SEARCHER_CACHE_SIZE_MB
any: true
- notContains:
path: spec.template.spec.containers[0].env
content:
name: SYMBOLS_CACHE_SIZE_MB
any: true
4 changes: 3 additions & 1 deletion charts/sourcegraph/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1282,7 +1282,9 @@ searcher:
# This tracks PVC expansion automatically, whereas the hardcoded env vars are
# frozen to the initial `storageSize` and do not follow later disk growth.
autoCacheSize: false
# -- Size of the PVC for searcher pods to store cache data
# -- Size of the PVC for searcher pods to store cache data. Unless `autoCacheSize`
# is enabled, this must be a Kubernetes quantity (e.g. `150G`, `100Gi`, `1Ti`) of at
# least `3M`, so the chart can derive `SEARCHER_CACHE_SIZE_MB` and `SYMBOLS_CACHE_SIZE_MB` from it
storageSize: 26Gi
# -- Optional subPath for the `searcher` primary data volume mount
storageSubPath: ""
Expand Down
Loading