Compare commits

...

7 commits

Author SHA1 Message Date
adiholden
320a116b40
chore(server): cleanup unused noop opcode in journal (#5101)
* chore server: cleanup unused noop opcode in journal


Signed-off-by: adi_holden <adi@dragonflydb.io>
2025-05-11 22:16:13 +03:00
Volodymyr Yavdoshenko
a51674eb43
chore: Add suffix and infix search syntax support in query parser (#5091) 2025-05-11 18:54:52 +03:00
Volodymyr Yavdoshenko
5f454dbd81
fix: memcached port has been already used crash (#5097)
fixed: https://github.com/dragonflydb/dragonfly/issues/5096
2025-05-11 10:07:02 +00:00
Volodymyr Yavdoshenko
c348779e9e
fix: memcached authentication handling (#5098) 2025-05-11 10:05:37 +03:00
Abhijat Malviya
e341819256
fix(hset_family): Fix val being overwritten by TTL (#5094)
When hset is loaded from rdb, if a ttl is specified by the user, the
code recreates a string_view on top of the same memory location,
tset_blob_, that was used for val earlier. This causes the val string
view to point to the same value now as TTL has. For example if the val
string view was 'x' earlier (points to tset_blob_, size 1), and ttl is
7777777, val now becomes '7'.

To fix this val is now given it's own string. TTL is kept as string
view as the pointer is not reused anywhere in the following loop.

Signed-off-by: Abhijat Malviya <abhijat@dragonflydb.io>
2025-05-10 20:11:42 +05:30
Roman Gershman
8ce8ee68df
chore: support fetching a huffman encoded string from CompactObj (#5086)
chore: supports reading huffman encoded strings from CompactObj

This requires implementing HashCode, operator== methods as well.
Fixes #4880

Signed-off-by: Roman Gershman <roman@dragonflydb.io>
2025-05-09 18:13:36 +03:00
romange
e148f1aa69 chore(helm-chart): update to v1.30.0 2025-05-09 12:09:26 +00:00
49 changed files with 464 additions and 278 deletions

View file

@ -15,13 +15,13 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes # This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version. # to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/) # Versions are expected to follow Semantic Versioning (https://semver.org/)
version: v1.29.0 version: v1.30.0
# This is the version number of the application being deployed. This version number should be # This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to # incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using. # follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes. # It is recommended to use it with quotes.
appVersion: "v1.29.0" appVersion: "v1.30.0"
home: https://dragonflydb.io/ home: https://dragonflydb.io/

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -42,7 +42,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -72,7 +72,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -42,7 +42,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -60,7 +60,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -42,7 +42,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -67,7 +67,7 @@ spec:
image: busybox:latest image: busybox:latest
name: sidecar-string name: sidecar-string
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -42,7 +42,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -64,7 +64,7 @@ spec:
command: ["/bin/sh"] command: ["/bin/sh"]
args: ["-c", "date; sleep 3600;"] args: ["-c", "date; sleep 3600;"]
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/extra-manifests.yaml # Source: dragonfly/templates/extra-manifests.yaml
@ -47,7 +47,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -69,7 +69,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -87,7 +87,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/extra-manifests.yaml # Source: dragonfly/templates/extra-manifests.yaml
@ -39,7 +39,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -61,7 +61,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -79,7 +79,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -42,7 +42,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -60,7 +60,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -42,7 +42,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -68,7 +68,7 @@ spec:
name: initcontainer-string name: initcontainer-string
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -42,7 +42,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -65,7 +65,7 @@ spec:
args: ["-c", "date; sleep 1;"] args: ["-c", "date; sleep 1;"]
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/extra-manifests.yaml # Source: dragonfly/templates/extra-manifests.yaml
@ -28,7 +28,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -50,7 +50,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/extra-manifests.yaml # Source: dragonfly/templates/extra-manifests.yaml
@ -28,7 +28,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -50,7 +50,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -68,7 +68,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/extra-manifests.yaml # Source: dragonfly/templates/extra-manifests.yaml
@ -28,7 +28,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -50,7 +50,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -68,7 +68,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/extra-manifests.yaml # Source: dragonfly/templates/extra-manifests.yaml
@ -28,7 +28,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -50,7 +50,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
serviceName: test serviceName: test
@ -69,7 +69,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -42,7 +42,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
serviceName: test serviceName: test
@ -61,7 +61,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -17,7 +17,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -29,7 +29,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -51,7 +51,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -70,7 +70,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/metrics-service.yaml # Source: dragonfly/templates/metrics-service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
type: metrics type: metrics
spec: spec:
@ -43,7 +43,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -65,7 +65,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -83,7 +83,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly
@ -124,7 +124,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
endpoints: endpoints:

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -42,7 +42,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -60,7 +60,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -42,7 +42,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -64,7 +64,7 @@ spec:
- name: dragonfly - name: dragonfly
securityContext: securityContext:
readOnlyRootFilesystem: true readOnlyRootFilesystem: true
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: LoadBalancer type: LoadBalancer
@ -43,7 +43,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -61,7 +61,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/metrics-service.yaml # Source: dragonfly/templates/metrics-service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
type: metrics type: metrics
spec: spec:
@ -43,7 +43,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -65,7 +65,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -83,7 +83,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly
@ -125,7 +125,7 @@ metadata:
release: prometheus-stack release: prometheus-stack
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
endpoints: endpoints:

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -42,7 +42,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -78,7 +78,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/extra-manifests.yaml # Source: dragonfly/templates/extra-manifests.yaml
@ -28,7 +28,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
type: kubernetes.io/tls type: kubernetes.io/tls
data: data:
@ -44,7 +44,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -66,7 +66,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -77,7 +77,7 @@ spec:
template: template:
metadata: metadata:
annotations: annotations:
checksum/tls-secret: 7c145e31680ebd4dd212c79a60417b49fc509298adf57258a5961a24ce43b702 checksum/tls-secret: af53017303e9019c5b65fd3b16260fb76fdc3c35034ae64eec62987b3be0dd39
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
@ -85,7 +85,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -8,7 +8,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
--- ---
# Source: dragonfly/templates/service.yaml # Source: dragonfly/templates/service.yaml
@ -20,7 +20,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
type: ClusterIP type: ClusterIP
@ -42,7 +42,7 @@ metadata:
labels: labels:
app.kubernetes.io/name: dragonfly app.kubernetes.io/name: dragonfly
app.kubernetes.io/instance: test app.kubernetes.io/instance: test
app.kubernetes.io/version: "v1.29.0" app.kubernetes.io/version: "v1.30.0"
app.kubernetes.io/managed-by: Helm app.kubernetes.io/managed-by: Helm
spec: spec:
replicas: 1 replicas: 1
@ -63,7 +63,7 @@ spec:
serviceAccountName: test-dragonfly serviceAccountName: test-dragonfly
containers: containers:
- name: dragonfly - name: dragonfly
image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.29.0" image: "docker.dragonflydb.io/dragonflydb/dragonfly:v1.30.0"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: dragonfly - name: dragonfly

View file

@ -787,13 +787,17 @@ CompactObj& CompactObj::operator=(CompactObj&& o) noexcept {
size_t CompactObj::Size() const { size_t CompactObj::Size() const {
size_t raw_size = 0; size_t raw_size = 0;
uint8_t first_byte = 0;
if (IsInline()) { if (IsInline()) {
raw_size = taglen_; raw_size = taglen_;
first_byte = u_.inline_str[0];
} else { } else {
switch (taglen_) { switch (taglen_) {
case SMALL_TAG: case SMALL_TAG:
raw_size = u_.small_str.size(); raw_size = u_.small_str.size();
if (mask_bits_.encoding == HUFFMAN_ENC) {
return DecodedLen(raw_size, u_.small_str.first_byte());
}
break; break;
case INT_TAG: { case INT_TAG: {
absl::AlphaNum an(u_.ival); absl::AlphaNum an(u_.ival);
@ -802,11 +806,16 @@ size_t CompactObj::Size() const {
} }
case EXTERNAL_TAG: case EXTERNAL_TAG:
raw_size = u_.ext_ptr.serialized_size; raw_size = u_.ext_ptr.serialized_size;
CHECK(mask_bits_.encoding != HUFFMAN_ENC);
break; break;
case ROBJ_TAG: case ROBJ_TAG:
raw_size = u_.r_obj.Size(); raw_size = u_.r_obj.Size();
if (mask_bits_.encoding == HUFFMAN_ENC) {
return DecodedLen(raw_size, *(uint8_t*)u_.r_obj.inner_obj());
}
break; break;
case JSON_TAG: case JSON_TAG:
DCHECK_EQ(mask_bits_.encoding, NONE_ENC);
if (JsonEnconding() == kEncodingJsonFlat) { if (JsonEnconding() == kEncodingJsonFlat) {
raw_size = u_.json_obj.flat.json_len; raw_size = u_.json_obj.flat.json_len;
} else { } else {
@ -814,48 +823,54 @@ size_t CompactObj::Size() const {
} }
break; break;
case SBF_TAG: case SBF_TAG:
DCHECK_EQ(mask_bits_.encoding, NONE_ENC);
raw_size = u_.sbf->current_size(); raw_size = u_.sbf->current_size();
break; break;
default: default:
LOG(DFATAL) << "Should not reach " << int(taglen_); LOG(DFATAL) << "Should not reach " << int(taglen_);
} }
} }
return mask_bits_.encoding ? DecodedLen(raw_size) : raw_size; return mask_bits_.encoding ? DecodedLen(raw_size, first_byte) : raw_size;
} }
uint64_t CompactObj::HashCode() const { uint64_t CompactObj::HashCode() const {
DCHECK(taglen_ != JSON_TAG) << "JSON type cannot be used for keys!"; DCHECK(taglen_ != JSON_TAG) << "JSON type cannot be used for keys!";
uint8_t encoded = mask_bits_.encoding; if (mask_bits_.encoding == NONE_ENC) {
if (IsInline()) {
return XXH3_64bits_withSeed(u_.inline_str, taglen_, kHashSeed);
}
switch (taglen_) {
case SMALL_TAG:
return u_.small_str.HashCode();
case ROBJ_TAG:
return u_.r_obj.HashCode();
case INT_TAG: {
absl::AlphaNum an(u_.ival);
return XXH3_64bits_withSeed(an.data(), an.size(), kHashSeed);
}
}
}
DCHECK(mask_bits_.encoding);
if (IsInline()) { if (IsInline()) {
if (encoded) { char buf[kInlineLen * 3]; // should suffice for most huffman decodings.
char buf[kInlineLen * 2]; size_t decoded_len = DecodedLen(taglen_, u_.inline_str[0]);
size_t decoded_len = DecodedLen(taglen_); if (mask_bits_.encoding == HUFFMAN_ENC) {
if (decoded_len <= sizeof(buf) &&
tl.huff_decoder.Decode({u_.inline_str + 1, size_t(taglen_ - 1)}, decoded_len, buf)) {
return XXH3_64bits_withSeed(buf, decoded_len, kHashSeed);
}
} else {
detail::ascii_unpack(to_byte(u_.inline_str), decoded_len, buf); detail::ascii_unpack(to_byte(u_.inline_str), decoded_len, buf);
return XXH3_64bits_withSeed(buf, decoded_len, kHashSeed); return XXH3_64bits_withSeed(buf, decoded_len, kHashSeed);
} }
return XXH3_64bits_withSeed(u_.inline_str, taglen_, kHashSeed);
} }
if (encoded) { string_view sv = GetSlice(&tl.tmp_str);
string_view sv = GetSlice(&tl.tmp_str); return XXH3_64bits_withSeed(sv.data(), sv.size(), kHashSeed);
return XXH3_64bits_withSeed(sv.data(), sv.size(), kHashSeed);
}
switch (taglen_) {
case SMALL_TAG:
return u_.small_str.HashCode();
case ROBJ_TAG:
return u_.r_obj.HashCode();
case INT_TAG: {
absl::AlphaNum an(u_.ival);
return XXH3_64bits_withSeed(an.data(), an.size(), kHashSeed);
}
}
// We need hash only for keys.
LOG(DFATAL) << "Should not reach " << int(taglen_);
return 0;
} }
uint64_t CompactObj::HashCode(string_view str) { uint64_t CompactObj::HashCode(string_view str) {
@ -1111,7 +1126,8 @@ void CompactObj::GetString(char* dest) const {
detail::ascii_unpack(to_byte(u_.inline_str), taglen_ + 2, dest); detail::ascii_unpack(to_byte(u_.inline_str), taglen_ + 2, dest);
break; break;
case HUFFMAN_ENC: case HUFFMAN_ENC:
tl.huff_decoder.Decode(u_.inline_str, taglen_, dest); tl.huff_decoder.Decode({u_.inline_str + 1, size_t(taglen_ - 1)},
u_.inline_str[0] + taglen_ - 1, dest);
break; break;
case NONE_ENC: case NONE_ENC:
memcpy(dest, u_.inline_str, taglen_); memcpy(dest, u_.inline_str, taglen_);
@ -1132,24 +1148,39 @@ void CompactObj::GetString(char* dest) const {
if (taglen_ == ROBJ_TAG) { if (taglen_ == ROBJ_TAG) {
CHECK_EQ(OBJ_STRING, u_.r_obj.type()); CHECK_EQ(OBJ_STRING, u_.r_obj.type());
DCHECK_EQ(OBJ_ENCODING_RAW, u_.r_obj.encoding()); DCHECK_EQ(OBJ_ENCODING_RAW, u_.r_obj.encoding());
size_t decoded_len = DecodedLen(u_.r_obj.Size()); size_t decoded_len = DecodedLen(u_.r_obj.Size(), *(const uint8_t*)u_.r_obj.inner_obj());
if (mask_bits_.encoding == HUFFMAN_ENC) {
CHECK(tl.huff_decoder.Decode({(const char*)u_.r_obj.inner_obj() + 1, u_.r_obj.Size() - 1},
decoded_len, dest));
return;
}
detail::ascii_unpack_simd(to_byte(u_.r_obj.inner_obj()), decoded_len, dest); detail::ascii_unpack_simd(to_byte(u_.r_obj.inner_obj()), decoded_len, dest);
} else if (taglen_ == SMALL_TAG) { } else {
size_t decoded_len = DecodedLen(u_.small_str.size()); CHECK_EQ(SMALL_TAG, taglen_);
string_view slices[2];
unsigned num = u_.small_str.GetV(slices);
DCHECK_EQ(2u, num);
size_t decoded_len = DecodedLen(u_.small_str.size(), slices[0][0]);
if (mask_bits_.encoding == HUFFMAN_ENC) {
tl.tmp_buf.resize(slices[0].size() + slices[1].size() - 1);
uint8_t* next = tl.tmp_buf.data();
memcpy(next, slices[0].data() + 1, slices[0].size() - 1);
next += slices[0].size() - 1;
memcpy(next, slices[1].data(), slices[1].size());
string_view src(reinterpret_cast<const char*>(tl.tmp_buf.data()), tl.tmp_buf.size());
CHECK(tl.huff_decoder.Decode(src, decoded_len, dest));
return;
}
// we left some space on the left to allow inplace ascii unpacking. // we left some space on the left to allow inplace ascii unpacking.
size_t space_left = decoded_len - u_.small_str.size(); size_t space_left = decoded_len - u_.small_str.size();
string_view slices[2];
unsigned num = u_.small_str.GetV(slices);
DCHECK_EQ(2u, num);
char* next = dest + space_left; char* next = dest + space_left;
memcpy(next, slices[0].data(), slices[0].size()); memcpy(next, slices[0].data(), slices[0].size());
next += slices[0].size(); next += slices[0].size();
memcpy(next, slices[1].data(), slices[1].size()); memcpy(next, slices[1].data(), slices[1].size());
detail::ascii_unpack_simd(reinterpret_cast<uint8_t*>(dest + space_left), decoded_len, dest); detail::ascii_unpack_simd(reinterpret_cast<uint8_t*>(dest + space_left), decoded_len, dest);
} else {
LOG(FATAL) << "Unsupported tag " << int(taglen_);
} }
return; return;
} }
@ -1343,8 +1374,25 @@ bool CompactObj::EqualNonInline(std::string_view sv) const {
} }
bool CompactObj::CmpEncoded(string_view sv) const { bool CompactObj::CmpEncoded(string_view sv) const {
size_t encode_len = binpacked_len(sv.size()); if (mask_bits_.encoding == HUFFMAN_ENC) {
size_t sz = Size();
if (sv.size() != sz)
return false;
if (IsInline()) {
constexpr size_t kMaxHuffLen = kInlineLen * 3;
if (sz <= kMaxHuffLen) {
char buf[kMaxHuffLen];
CHECK(tl.huff_decoder.Decode({u_.inline_str + 1, size_t(taglen_ - 1)}, sz, buf));
return sv == string_view(buf, sz);
}
}
tl.tmp_str.resize(sz);
GetString(tl.tmp_str.data());
return sv == tl.tmp_str;
}
size_t encode_len = binpacked_len(sv.size());
if (IsInline()) { if (IsInline()) {
if (encode_len != taglen_) if (encode_len != taglen_)
return false; return false;
@ -1524,8 +1572,12 @@ StringOrView CompactObj::GetRawString() const {
return {}; return {};
} }
size_t CompactObj::DecodedLen(size_t sz) const { size_t CompactObj::DecodedLen(size_t sz, uint8_t b) const {
unsigned delta = (mask_bits_.encoding == ASCII1_ENC ? 1 : 0); DCHECK(mask_bits_.encoding);
if (mask_bits_.encoding == HUFFMAN_ENC) {
return sz + b - 1;
}
unsigned delta = (mask_bits_.encoding == ASCII1_ENC) ? 1 : 0;
return ascii_len(sz) - delta; return ascii_len(sz) - delta;
} }

View file

@ -410,7 +410,7 @@ class CompactObj {
private: private:
void EncodeString(std::string_view str); void EncodeString(std::string_view str);
size_t DecodedLen(size_t sz) const; size_t DecodedLen(size_t sz, uint8_t firstb) const;
bool EqualNonInline(std::string_view sv) const; bool EqualNonInline(std::string_view sv) const;

View file

@ -4,6 +4,7 @@
#include "core/compact_object.h" #include "core/compact_object.h"
#include <absl/strings/str_cat.h> #include <absl/strings/str_cat.h>
#include <gtest/gtest.h>
#include <mimalloc.h> #include <mimalloc.h>
#include <xxhash.h> #include <xxhash.h>
@ -13,6 +14,7 @@
#include "base/logging.h" #include "base/logging.h"
#include "core/detail/bitpacking.h" #include "core/detail/bitpacking.h"
#include "core/flat_set.h" #include "core/flat_set.h"
#include "core/huff_coder.h"
#include "core/mi_memory_resource.h" #include "core/mi_memory_resource.h"
#include "core/string_set.h" #include "core/string_set.h"
@ -656,6 +658,30 @@ TEST_F(CompactObjectTest, lpGetInteger) {
lpFree(lp); lpFree(lp);
} }
TEST_F(CompactObjectTest, HuffMan) {
array<unsigned, 256> hist;
hist.fill(1);
hist['a'] = 100;
hist['b'] = 50;
HuffmanEncoder encoder;
ASSERT_TRUE(encoder.Build(hist.data(), hist.size() - 1, nullptr));
string bindata = encoder.Export();
ASSERT_TRUE(CompactObj::InitHuffmanThreadLocal(bindata));
for (unsigned i = 30; i < 2048; i += 10) {
string data(i, 'a');
cobj_.SetString(data);
bool malloc_used = i >= 60;
ASSERT_EQ(malloc_used, cobj_.MallocUsed() > 0) << i;
ASSERT_EQ(data.size(), cobj_.Size());
ASSERT_EQ(CompactObj::HashCode(data), cobj_.HashCode());
string actual;
cobj_.GetString(&actual);
EXPECT_EQ(data, actual);
EXPECT_EQ(cobj_, data);
}
}
static void ascii_pack_naive(const char* ascii, size_t len, uint8_t* bin) { static void ascii_pack_naive(const char* ascii, size_t len, uint8_t* bin) {
const char* end = ascii + len; const char* end = ascii + len;

View file

@ -144,7 +144,7 @@ bool HuffmanDecoder::Decode(std::string_view src, size_t dest_size, char* dest)
HUF_decompress1X_usingDTable(dest, dest_size, src.data(), src.size(), huf_dtable_.get(), 1); HUF_decompress1X_usingDTable(dest, dest_size, src.data(), src.size(), huf_dtable_.get(), 1);
if (HUF_isError(res)) { if (HUF_isError(res)) {
LOG(FATAL) << "Failed to decompress: " << HUF_getErrorName(res); LOG(DFATAL) << "Failed to decompress: " << HUF_getErrorName(res);
return false; return false;
} }
return true; return true;

View file

@ -16,13 +16,6 @@ using namespace std;
namespace dfly::search { namespace dfly::search {
AstTermNode::AstTermNode(string term) : term{std::move(term)} {
}
AstPrefixNode::AstPrefixNode(string prefix) : prefix{std::move(prefix)} {
this->prefix.pop_back();
}
AstRangeNode::AstRangeNode(double lo, bool lo_excl, double hi, bool hi_excl) AstRangeNode::AstRangeNode(double lo, bool lo_excl, double hi, bool hi_excl)
: lo{lo_excl ? nextafter(lo, hi) : lo}, hi{hi_excl ? nextafter(hi, lo) : hi} { : lo{lo_excl ? nextafter(lo, hi) : lo}, hi{hi_excl ? nextafter(hi, lo) : hi} {
} }

View file

@ -12,6 +12,7 @@
#include <vector> #include <vector>
#include "core/search/base.h" #include "core/search/base.h"
#include "core/search/tag_types.h"
namespace dfly { namespace dfly {
@ -25,18 +26,17 @@ struct AstStarNode {};
// Matches all documents where this field has a non-null value // Matches all documents where this field has a non-null value
struct AstStarFieldNode {}; struct AstStarFieldNode {};
// Matches terms in text fields template <TagType T> struct AstAffixNode {
struct AstTermNode { explicit AstAffixNode(std::string affix) : affix{std::move(affix)} {
explicit AstTermNode(std::string term); }
std::string term; std::string affix;
}; };
struct AstPrefixNode { using AstTermNode = AstAffixNode<TagType::REGULAR>;
explicit AstPrefixNode(std::string prefix); using AstPrefixNode = AstAffixNode<TagType::PREFIX>;
using AstSuffixNode = AstAffixNode<TagType::SUFFIX>;
std::string prefix; using AstInfixNode = AstAffixNode<TagType::INFIX>;
};
// Matches numeric range // Matches numeric range
struct AstRangeNode { struct AstRangeNode {
@ -73,15 +73,13 @@ struct AstFieldNode {
// Stores a list of tags for a tag query // Stores a list of tags for a tag query
struct AstTagsNode { struct AstTagsNode {
using TagValue = std::variant<AstTermNode, AstPrefixNode>; using TagValue = std::variant<AstTermNode, AstPrefixNode, AstSuffixNode, AstInfixNode>;
struct TagValueProxy struct TagValueProxy
: public AstTagsNode::TagValue { // bison needs it to be default constructible : public AstTagsNode::TagValue { // bison needs it to be default constructible
TagValueProxy() : AstTagsNode::TagValue(AstTermNode("")) { TagValueProxy() : AstTagsNode::TagValue(AstTermNode("")) {
} }
TagValueProxy(AstPrefixNode tv) : AstTagsNode::TagValue(std::move(tv)) { template <TagType T> TagValueProxy(AstAffixNode<T> tv) : AstTagsNode::TagValue(std::move(tv)) {
}
TagValueProxy(AstTermNode tv) : AstTagsNode::TagValue(std::move(tv)) {
} }
}; };
@ -111,9 +109,10 @@ struct AstKnnNode {
std::optional<float> ef_runtime; std::optional<float> ef_runtime;
}; };
using NodeVariants = std::variant<std::monostate, AstStarNode, AstStarFieldNode, AstTermNode, using NodeVariants =
AstPrefixNode, AstRangeNode, AstNegateNode, AstLogicalNode, std::variant<std::monostate, AstStarNode, AstStarFieldNode, AstTermNode, AstPrefixNode,
AstFieldNode, AstTagsNode, AstKnnNode>; AstSuffixNode, AstInfixNode, AstRangeNode, AstNegateNode, AstLogicalNode,
AstFieldNode, AstTagsNode, AstKnnNode>;
struct AstNode : public NodeVariants { struct AstNode : public NodeVariants {
using variant::variant; using variant::variant;

View file

@ -1,6 +1,7 @@
%top{ %top{
// Our lexer need to know about Parser::symbol_type // Our lexer need to know about Parser::symbol_type
#include "core/search/parser.hh" #include "core/search/parser.hh"
#include "core/search/tag_types.h" // Include TagType enum
} }
%{ %{
@ -25,18 +26,19 @@
// A number symbol corresponding to the value in S. // A number symbol corresponding to the value in S.
using dfly::search::Parser; using dfly::search::Parser;
using namespace std; using namespace std;
using dfly::search::TagType;
Parser::symbol_type make_StringLit(string_view src, const Parser::location_type& loc); Parser::symbol_type make_StringLit(string_view src, const Parser::location_type& loc);
Parser::symbol_type make_TagVal(string_view src, bool is_prefix, const Parser::location_type& loc); Parser::symbol_type make_Tag(string_view src, TagType type, const Parser::location_type& loc);
%} %}
dq \" dq \"
sq \' sq \'
esc_chars ['"\?\\abfnrtv] esc_chars ['"\?\\abfnrtv]
esc_seq \\{esc_chars} esc_seq \\{esc_chars}
term_char \w term_ch \w
tag_val_char {term_char}|\\[,.<>{}\[\]\\\"\':;!@#$%^&*()\-+=~\/ ] tag_val_ch {term_ch}|\\[,.<>{}\[\]\\\"\':;!@#$%^&*()\-+=~\/ ]
asterisk_char \* astrsk_ch \*
%{ %{
@ -67,21 +69,25 @@ asterisk_char \*
"AS" return Parser::make_AS (loc()); "AS" return Parser::make_AS (loc());
"EF_RUNTIME" return Parser::make_EF_RUNTIME (loc()); "EF_RUNTIME" return Parser::make_EF_RUNTIME (loc());
[0-9]{1,9} return Parser::make_UINT32(str(), loc()); [0-9]{1,9} return Parser::make_UINT32(str(), loc());
[+-]?(([0-9]*[.])?[0-9]+|inf) return Parser::make_DOUBLE(str(), loc()); [+-]?(([0-9]*[.])?[0-9]+|inf) return Parser::make_DOUBLE(str(), loc());
{dq}([^"]|{esc_seq})*{dq} return make_StringLit(matched_view(1, 1), loc()); {dq}([^"]|{esc_seq})*{dq} return make_StringLit(matched_view(1, 1), loc());
{sq}([^']|{esc_seq})*{sq} return make_StringLit(matched_view(1, 1), loc()); {sq}([^']|{esc_seq})*{sq} return make_StringLit(matched_view(1, 1), loc());
"$"{term_char}+ return ParseParam(str(), loc()); "$"{term_ch}+ return ParseParam(str(), loc());
"@"{term_char}+ return Parser::make_FIELD(str(), loc()); "@"{term_ch}+ return Parser::make_FIELD(str(), loc());
{term_char}+{asterisk_char} return Parser::make_PREFIX(str(), loc()); {astrsk_ch}{term_ch}+{astrsk_ch} return Parser::make_INFIX(string{matched_view(1, 1)}, loc());
{term_ch}+{astrsk_ch} return Parser::make_PREFIX(string{matched_view(0, 1)}, loc());
{astrsk_ch}{term_ch}+ return Parser::make_SUFFIX(string{matched_view(1, 0)}, loc());
{term_char}+ return Parser::make_TERM(str(), loc()); {term_ch}+ return Parser::make_TERM(str(), loc());
{tag_val_char}+{asterisk_char} return make_TagVal(str(), true, loc()); {tag_val_ch}+{astrsk_ch} return make_Tag(str(), TagType::PREFIX, loc());
{tag_val_char}+ return make_TagVal(str(), false, loc()); {astrsk_ch}{tag_val_ch}+ return make_Tag(str(), TagType::SUFFIX, loc());
{astrsk_ch}{tag_val_ch}+{astrsk_ch} return make_Tag(str(), TagType::INFIX, loc());
{tag_val_ch}+ return make_Tag(str(), TagType::REGULAR, loc());
<<EOF>> return Parser::make_YYEOF(loc()); <<EOF>> return Parser::make_YYEOF(loc());
%% %%
Parser::symbol_type make_StringLit(string_view src, const Parser::location_type& loc) { Parser::symbol_type make_StringLit(string_view src, const Parser::location_type& loc) {
@ -92,14 +98,20 @@ Parser::symbol_type make_StringLit(string_view src, const Parser::location_type&
return Parser::make_TERM(res, loc); return Parser::make_TERM(res, loc);
} }
Parser::symbol_type make_TagVal(string_view src, bool is_prefix, const Parser::location_type& loc) { Parser::symbol_type make_Tag(string_view src, TagType type, const Parser::location_type& loc) {
string res; string res;
res.reserve(src.size()); res.reserve(src.size());
bool escaped = false; // Determine processing boundaries
size_t len = is_prefix ? src.size() - 1 : src.size(); // Exclude the '*' at the end for prefix size_t start = (type == TagType::SUFFIX || type == TagType::INFIX) ? 1 : 0;
size_t end = src.size();
if (type == TagType::PREFIX || type == TagType::INFIX) {
end--; // Skip the last '*' character
}
for (size_t i = 0; i < len; ++i) { // Handle escaping
bool escaped = false;
for (size_t i = start; i < end; ++i) {
if (escaped) { if (escaped) {
escaped = false; escaped = false;
} else if (src[i] == '\\') { } else if (src[i] == '\\') {
@ -109,11 +121,16 @@ Parser::symbol_type make_TagVal(string_view src, bool is_prefix, const Parser::l
res.push_back(src[i]); res.push_back(src[i]);
} }
// Add '*' back for prefix // Return the appropriate token type
if (is_prefix) { switch (type) {
res.push_back('*'); case TagType::PREFIX:
return Parser::make_PREFIX(res, loc); return Parser::make_PREFIX(res, loc);
case TagType::SUFFIX:
return Parser::make_SUFFIX(res, loc);
case TagType::INFIX:
return Parser::make_INFIX(res, loc);
case TagType::REGULAR:
default:
return Parser::make_TAG_VAL(res, loc);
} }
return Parser::make_TAG_VAL(res, loc);
} }

View file

@ -67,7 +67,7 @@ double toDouble(string_view src);
// Needed 0 at the end to satisfy bison 3.5.1 // Needed 0 at the end to satisfy bison 3.5.1
%token YYEOF 0 %token YYEOF 0
%token <std::string> TERM "term" TAG_VAL "tag_val" PARAM "param" FIELD "field" PREFIX "prefix" %token <std::string> TERM "term" TAG_VAL "tag_val" PARAM "param" FIELD "field" PREFIX "prefix" SUFFIX "suffix" INFIX "infix"
%precedence TERM TAG_VAL %precedence TERM TAG_VAL
%left OR_OP %left OR_OP
@ -134,24 +134,26 @@ search_or_expr:
| search_expr OR_OP search_unary_expr { $$ = AstLogicalNode(std::move($1), std::move($3), AstLogicalNode::OR); } | search_expr OR_OP search_unary_expr { $$ = AstLogicalNode(std::move($1), std::move($3), AstLogicalNode::OR); }
search_unary_expr: search_unary_expr:
LPAREN search_expr RPAREN { $$ = std::move($2); } LPAREN search_expr RPAREN { $$ = std::move($2); }
| NOT_OP search_unary_expr { $$ = AstNegateNode(std::move($2)); } | NOT_OP search_unary_expr { $$ = AstNegateNode(std::move($2)); }
| TERM { $$ = AstTermNode(std::move($1)); } | TERM { $$ = AstTermNode(std::move($1)); }
| PREFIX { $$ = AstPrefixNode(std::move($1)); } | PREFIX { $$ = AstPrefixNode(std::move($1)); }
| UINT32 { $$ = AstTermNode(std::move($1)); } | SUFFIX { $$ = AstSuffixNode(std::move($1)); }
| INFIX { $$ = AstInfixNode(std::move($1)); }
| UINT32 { $$ = AstTermNode(std::move($1)); }
| FIELD COLON field_cond { $$ = AstFieldNode(std::move($1), std::move($3)); } | FIELD COLON field_cond { $$ = AstFieldNode(std::move($1), std::move($3)); }
field_cond: field_cond:
TERM { $$ = AstTermNode(std::move($1)); } TERM { $$ = AstTermNode(std::move($1)); }
| UINT32 { $$ = AstTermNode(std::move($1)); } | UINT32 { $$ = AstTermNode(std::move($1)); }
| STAR { $$ = AstStarFieldNode(); } | STAR { $$ = AstStarFieldNode(); }
| NOT_OP field_cond { $$ = AstNegateNode(std::move($2)); } | NOT_OP field_cond { $$ = AstNegateNode(std::move($2)); }
| LPAREN field_cond_expr RPAREN { $$ = std::move($2); } | LPAREN field_cond_expr RPAREN { $$ = std::move($2); }
| LBRACKET numeric_filter_expr RBRACKET { $$ = std::move($2); } | LBRACKET numeric_filter_expr RBRACKET { $$ = std::move($2); }
| LCURLBR tag_list RCURLBR { $$ = std::move($2); } | LCURLBR tag_list RCURLBR { $$ = std::move($2); }
numeric_filter_expr: numeric_filter_expr:
opt_lparen generic_number opt_lparen generic_number { $$ = AstRangeNode($2, $1, $4, $3); } opt_lparen generic_number opt_lparen generic_number { $$ = AstRangeNode($2, $1, $4, $3); }
| opt_lparen generic_number COMMA opt_lparen generic_number { $$ = AstRangeNode($2, $1, $5, $4); } | opt_lparen generic_number COMMA opt_lparen generic_number { $$ = AstRangeNode($2, $1, $5, $4); }
generic_number: generic_number:
@ -163,9 +165,9 @@ opt_lparen:
| LPAREN { $$ = true; } | LPAREN { $$ = true; }
field_cond_expr: field_cond_expr:
field_unary_expr { $$ = std::move($1); } field_unary_expr { $$ = std::move($1); }
| field_and_expr { $$ = std::move($1); } | field_and_expr { $$ = std::move($1); }
| field_or_expr { $$ = std::move($1); } | field_or_expr { $$ = std::move($1); }
field_and_expr: field_and_expr:
field_unary_expr field_unary_expr %prec AND_OP { $$ = AstLogicalNode(std::move($1), std::move($2), AstLogicalNode::AND); } field_unary_expr field_unary_expr %prec AND_OP { $$ = AstLogicalNode(std::move($1), std::move($2), AstLogicalNode::AND); }
@ -176,21 +178,23 @@ field_or_expr:
| field_cond_expr OR_OP field_and_expr { $$ = AstLogicalNode(std::move($1), std::move($3), AstLogicalNode::OR); } | field_cond_expr OR_OP field_and_expr { $$ = AstLogicalNode(std::move($1), std::move($3), AstLogicalNode::OR); }
field_unary_expr: field_unary_expr:
LPAREN field_cond_expr RPAREN { $$ = std::move($2); } LPAREN field_cond_expr RPAREN { $$ = std::move($2); }
| NOT_OP field_unary_expr { $$ = AstNegateNode(std::move($2)); } | NOT_OP field_unary_expr { $$ = AstNegateNode(std::move($2)); }
| TERM { $$ = AstTermNode(std::move($1)); } | TERM { $$ = AstTermNode(std::move($1)); }
| UINT32 { $$ = AstTermNode(std::move($1)); } | UINT32 { $$ = AstTermNode(std::move($1)); }
tag_list: tag_list:
tag_list_element { $$ = AstTagsNode(std::move($1)); } tag_list_element { $$ = AstTagsNode(std::move($1)); }
| tag_list OR_OP tag_list_element { $$ = AstTagsNode(std::move($1), std::move($3)); } | tag_list OR_OP tag_list_element { $$ = AstTagsNode(std::move($1), std::move($3)); }
tag_list_element: tag_list_element:
TERM { $$ = AstTermNode(std::move($1)); } TERM { $$ = AstTermNode(std::move($1)); }
| PREFIX { $$ = AstPrefixNode(std::move($1)); } | PREFIX { $$ = AstPrefixNode(std::move($1)); }
| UINT32 { $$ = AstTermNode(std::move($1)); } | SUFFIX { $$ = AstSuffixNode(std::move($1)); }
| DOUBLE { $$ = AstTermNode(std::move($1)); } | INFIX { $$ = AstInfixNode(std::move($1)); }
| TAG_VAL { $$ = AstTermNode(std::move($1)); } | UINT32 { $$ = AstTermNode(std::move($1)); }
| DOUBLE { $$ = AstTermNode(std::move($1)); }
| TAG_VAL { $$ = AstTermNode(std::move($1)); }
%% %%

View file

@ -115,22 +115,22 @@ struct IndexResult {
}; };
struct ProfileBuilder { struct ProfileBuilder {
struct NodeFormatter {
template <TagType T> void operator()(std::string* out, const AstAffixNode<T>& node) const {
out->append(node.affix);
}
void operator()(std::string* out, const AstTagsNode::TagValue& value) const {
visit([this, out](const auto& n) { this->operator()(out, n); }, value);
}
};
string GetNodeInfo(const AstNode& node) { string GetNodeInfo(const AstNode& node) {
struct NodeFormatter {
void operator()(std::string* out, const AstPrefixNode& node) const {
out->append(node.prefix);
}
void operator()(std::string* out, const AstTermNode& node) const {
out->append(node.term);
}
void operator()(std::string* out, const AstTagsNode::TagValue& value) const {
visit([this, out](const auto& n) { this->operator()(out, n); }, value);
}
};
Overloaded node_info{ Overloaded node_info{
[](monostate) -> string { return ""s; }, [](monostate) -> string { return ""s; },
[](const AstTermNode& n) { return absl::StrCat("Term{", n.term, "}"); }, [](const AstTermNode& n) { return absl::StrCat("Term{", n.affix, "}"); },
[](const AstPrefixNode& n) { return absl::StrCat("Prefix{", n.prefix, "}"); }, [](const AstPrefixNode& n) { return absl::StrCat("Prefix{", n.affix, "}"); },
[](const AstSuffixNode& n) { return absl::StrCat("Suffix{", n.affix, "}"); },
[](const AstInfixNode& n) { return absl::StrCat("Infix{", n.affix, "}"); },
[](const AstRangeNode& n) { return absl::StrCat("Range{", n.lo, "<>", n.hi, "}"); }, [](const AstRangeNode& n) { return absl::StrCat("Range{", n.lo, "<>", n.hi, "}"); },
[](const AstLogicalNode& n) { [](const AstLogicalNode& n) {
auto op = n.op == AstLogicalNode::AND ? "and" : "or"; auto op = n.op == AstLogicalNode::AND ? "and" : "or";
@ -268,6 +268,20 @@ struct BasicSearch {
return result; return result;
} }
template <typename C>
IndexResult CollectSuffixMatches(BaseStringIndex<C>* index, std::string_view suffix) {
// TODO: Implement full text search for suffix
error_ = "Not implemented";
return IndexResult{};
}
template <typename C>
IndexResult CollectInfixMatches(BaseStringIndex<C>* index, std::string_view infix) {
// TODO: Implement full text search for infix
error_ = "Not implemented";
return IndexResult{};
}
IndexResult Search(monostate, string_view) { IndexResult Search(monostate, string_view) {
return vector<DocId>{}; return vector<DocId>{};
} }
@ -279,7 +293,7 @@ struct BasicSearch {
// "term": access field's text index or unify results from all text indices if no field is set // "term": access field's text index or unify results from all text indices if no field is set
IndexResult Search(const AstTermNode& node, string_view active_field) { IndexResult Search(const AstTermNode& node, string_view active_field) {
std::string term = node.term; std::string term = node.affix;
bool strip_whitespace = true; bool strip_whitespace = true;
if (auto synonyms = indices_->GetSynonyms(); synonyms) { if (auto synonyms = indices_->GetSynonyms(); synonyms) {
@ -341,11 +355,23 @@ struct BasicSearch {
} }
auto mapping = [&node, this](TextIndex* index) { auto mapping = [&node, this](TextIndex* index) {
return CollectPrefixMatches(index, node.prefix); return CollectPrefixMatches(index, node.affix);
}; };
return UnifyResults(GetSubResults(indices, mapping), LogicOp::OR); return UnifyResults(GetSubResults(indices, mapping), LogicOp::OR);
} }
IndexResult Search(const AstSuffixNode& node, string_view active_field) {
// TODO: Implement full text search for suffix
error_ = "Not implemented";
return IndexResult{};
}
IndexResult Search(const AstInfixNode& node, string_view active_field) {
// TODO: Implement full text search for infix
error_ = "Not implemented";
return IndexResult{};
}
// [range]: access field's numeric index // [range]: access field's numeric index
IndexResult Search(const AstRangeNode& node, string_view active_field) { IndexResult Search(const AstRangeNode& node, string_view active_field) {
DCHECK(!active_field.empty()); DCHECK(!active_field.empty());
@ -388,10 +414,16 @@ struct BasicSearch {
return IndexResult{}; return IndexResult{};
Overloaded ov{[tag_index](const AstTermNode& term) -> IndexResult { Overloaded ov{[tag_index](const AstTermNode& term) -> IndexResult {
return tag_index->Matching(term.term); return tag_index->Matching(term.affix);
}, },
[tag_index, this](const AstPrefixNode& prefix) { [tag_index, this](const AstPrefixNode& prefix) {
return CollectPrefixMatches(tag_index, prefix.prefix); return CollectPrefixMatches(tag_index, prefix.affix);
},
[tag_index, this](const AstSuffixNode& suffix) {
return CollectSuffixMatches(tag_index, suffix.affix);
},
[tag_index, this](const AstInfixNode& infix) {
return CollectInfixMatches(tag_index, infix.affix);
}}; }};
auto mapping = [ov](const auto& tag) { return visit(ov, tag); }; auto mapping = [ov](const auto& tag) { return visit(ov, tag); };
return UnifyResults(GetSubResults(node.tags, mapping), LogicOp::OR); return UnifyResults(GetSubResults(node.tags, mapping), LogicOp::OR);

View file

@ -155,7 +155,7 @@ TEST_F(SearchParserTest, Scanner) {
// Prefix simple // Prefix simple
SetInput("pre*"); SetInput("pre*");
NEXT_EQ(TOK_PREFIX, string, "pre*"); NEXT_EQ(TOK_PREFIX, string, "pre");
// TODO: uncomment when we support escaped terms // TODO: uncomment when we support escaped terms
// Prefix escaped (redis doesn't support quoted prefix matches) // Prefix escaped (redis doesn't support quoted prefix matches)
@ -167,7 +167,7 @@ TEST_F(SearchParserTest, Scanner) {
NEXT_EQ(TOK_FIELD, string, "@color"); NEXT_EQ(TOK_FIELD, string, "@color");
NEXT_TOK(TOK_COLON); NEXT_TOK(TOK_COLON);
NEXT_TOK(TOK_LCURLBR); NEXT_TOK(TOK_LCURLBR);
NEXT_EQ(TOK_PREFIX, string, "prefix*"); NEXT_EQ(TOK_PREFIX, string, "prefix");
NEXT_TOK(TOK_RCURLBR); NEXT_TOK(TOK_RCURLBR);
// Prefix escaped star // Prefix escaped star
@ -196,28 +196,28 @@ TEST_F(SearchParserTest, EscapedTagPrefixes) {
NEXT_EQ(TOK_FIELD, string, "@name"); NEXT_EQ(TOK_FIELD, string, "@name");
NEXT_TOK(TOK_COLON); NEXT_TOK(TOK_COLON);
NEXT_TOK(TOK_LCURLBR); NEXT_TOK(TOK_LCURLBR);
NEXT_EQ(TOK_PREFIX, string, "escape-err*"); NEXT_EQ(TOK_PREFIX, string, "escape-err");
NEXT_TOK(TOK_RCURLBR); NEXT_TOK(TOK_RCURLBR);
SetInput("@name:{escape\\+pre*}"); SetInput("@name:{escape\\+pre*}");
NEXT_EQ(TOK_FIELD, string, "@name"); NEXT_EQ(TOK_FIELD, string, "@name");
NEXT_TOK(TOK_COLON); NEXT_TOK(TOK_COLON);
NEXT_TOK(TOK_LCURLBR); NEXT_TOK(TOK_LCURLBR);
NEXT_EQ(TOK_PREFIX, string, "escape+pre*"); NEXT_EQ(TOK_PREFIX, string, "escape+pre");
NEXT_TOK(TOK_RCURLBR); NEXT_TOK(TOK_RCURLBR);
SetInput("@name:{escape\\.pre*}"); SetInput("@name:{escape\\.pre*}");
NEXT_EQ(TOK_FIELD, string, "@name"); NEXT_EQ(TOK_FIELD, string, "@name");
NEXT_TOK(TOK_COLON); NEXT_TOK(TOK_COLON);
NEXT_TOK(TOK_LCURLBR); NEXT_TOK(TOK_LCURLBR);
NEXT_EQ(TOK_PREFIX, string, "escape.pre*"); NEXT_EQ(TOK_PREFIX, string, "escape.pre");
NEXT_TOK(TOK_RCURLBR); NEXT_TOK(TOK_RCURLBR);
SetInput("@name:{complex\\-escape\\+with\\.many\\*chars*}"); SetInput("@name:{complex\\-escape\\+with\\.many\\*chars*}");
NEXT_EQ(TOK_FIELD, string, "@name"); NEXT_EQ(TOK_FIELD, string, "@name");
NEXT_TOK(TOK_COLON); NEXT_TOK(TOK_COLON);
NEXT_TOK(TOK_LCURLBR); NEXT_TOK(TOK_LCURLBR);
NEXT_EQ(TOK_PREFIX, string, "complex-escape+with.many*chars*"); NEXT_EQ(TOK_PREFIX, string, "complex-escape+with.many*chars");
NEXT_TOK(TOK_RCURLBR); NEXT_TOK(TOK_RCURLBR);
} }
@ -237,9 +237,8 @@ TEST_F(SearchParserTest, Parse) {
EXPECT_EQ(1, Parse(" @foo:@bar ")); EXPECT_EQ(1, Parse(" @foo:@bar "));
EXPECT_EQ(1, Parse(" @foo: ")); EXPECT_EQ(1, Parse(" @foo: "));
// We don't support suffix/any other position for now EXPECT_EQ(0, Parse("*suffix"));
EXPECT_EQ(1, Parse("*pre")); EXPECT_EQ(0, Parse("*infix*"));
EXPECT_EQ(1, Parse("*pre*"));
EXPECT_EQ(1, Parse("pre***")); EXPECT_EQ(1, Parse("pre***"));
} }

View file

@ -872,6 +872,32 @@ TEST_F(SearchTest, InvalidVectorParameter) {
ASSERT_FALSE(algo.Init("*=>[KNN 2 @v $b]", &query_params)); ASSERT_FALSE(algo.Init("*=>[KNN 2 @v $b]", &query_params));
} }
TEST_F(SearchTest, NotImplementedSearchTypes) {
auto schema = MakeSimpleSchema({{"title", SchemaField::TEXT}});
FieldIndices indices{schema, kEmptyOptions, PMR_NS::get_default_resource(), nullptr};
SearchAlgorithm algo{};
QueryParams params;
// Add a document for testing
MockedDocument doc{Map{{"title", "text for search"}}};
indices.Add(0, doc);
// Test suffix search (words ending with "search")
algo.Init("*search", &params);
auto suffix_result = algo.Search(&indices);
EXPECT_TRUE(suffix_result.ids.empty()) << "Suffix search should return empty result";
EXPECT_THAT(suffix_result.error, testing::HasSubstr("Not implemented"))
<< "Suffix search should return a not implemented error";
// Test infix search (words containing "for")
algo.Init("*for*", &params);
auto infix_result = algo.Search(&indices);
EXPECT_TRUE(infix_result.ids.empty()) << "Infix search should return empty result";
EXPECT_THAT(infix_result.error, testing::HasSubstr("Not implemented"))
<< "Infix search should return a not implemented error";
}
} // namespace search } // namespace search
} // namespace dfly } // namespace dfly

View file

@ -0,0 +1,13 @@
// Copyright 2023, DragonflyDB authors. All rights reserved.
// See LICENSE for licensing terms.
//
#pragma once
namespace dfly {
namespace search {
enum class TagType { PREFIX, SUFFIX, INFIX, REGULAR };
} // namespace search
} // namespace dfly

View file

@ -50,6 +50,10 @@ class SmallString {
bool DefragIfNeeded(float ratio); bool DefragIfNeeded(float ratio);
uint8_t first_byte() const {
return prefix_[0];
}
private: private:
// prefix of the string that is broken down into 2 parts. // prefix of the string that is broken down into 2 parts.
char prefix_[kPrefLen]; char prefix_[kPrefLen];

View file

@ -281,6 +281,11 @@ class Connection : public util::Connection {
return name_; return name_;
} }
// Returns protocol type of this connection
Protocol GetProtocol() const {
return protocol_;
}
struct MemoryUsage { struct MemoryUsage {
size_t mem = 0; size_t mem = 0;
io::IoBuf::MemoryUsage buf_mem; io::IoBuf::MemoryUsage buf_mem;

View file

@ -296,7 +296,11 @@ void RunEngine(ProactorPool* pool, AcceptServer* acceptor) {
if (mc_port > 0 && !tcp_disabled) { if (mc_port > 0 && !tcp_disabled) {
auto listener = MakeListener(Protocol::MEMCACHE, &service); auto listener = MakeListener(Protocol::MEMCACHE, &service);
acceptor->AddListener(mc_port, listener.get()); error_code ec = acceptor->AddListener(nullptr, mc_port, listener.get());
if (ec) {
LOG(ERROR) << "Could not open memcached port " << mc_port << ", error: " << ec.message();
exit(1);
}
listeners.push_back(listener.release()); listeners.push_back(listener.release());
} }

View file

@ -119,12 +119,13 @@ void JournalSlice::SetFlushMode(bool allow_flush) {
DCHECK(allow_flush != enable_journal_flush_); DCHECK(allow_flush != enable_journal_flush_);
enable_journal_flush_ = allow_flush; enable_journal_flush_ = allow_flush;
if (allow_flush) { if (allow_flush) {
JournalItem item; // This lock is never blocking because it contends with UnregisterOnChange, which is cpu only.
item.lsn = -1; // Hence this lock prevents the UnregisterOnChange to start running in the middle of
item.opcode = Op::NOOP; // SetFlushMode.
item.data = ""; std::shared_lock lk(cb_mu_);
item.slot = {}; for (auto k_v : journal_consumers_arr_) {
CallOnChange(item); k_v.second->ThrottleIfNeeded();
}
} }
} }
@ -154,7 +155,7 @@ void JournalSlice::AddLogRecord(const Entry& entry) {
void JournalSlice::CallOnChange(const JournalItem& item) { void JournalSlice::CallOnChange(const JournalItem& item) {
// This lock is never blocking because it contends with UnregisterOnChange, which is cpu only. // This lock is never blocking because it contends with UnregisterOnChange, which is cpu only.
// Hence this lock prevents the UnregisterOnChange to start running in the middle of CallOnChange. // Hence this lock prevents the UnregisterOnChange to start running in the middle of CallOnChange.
// CallOnChange is atomic iff JournalSlice::SetFlushMode(false) is called before. // CallOnChange is atomic if JournalSlice::SetFlushMode(false) is called before.
std::shared_lock lk(cb_mu_); std::shared_lock lk(cb_mu_);
for (auto k_v : journal_consumers_arr_) { for (auto k_v : journal_consumers_arr_) {
k_v.second->ConsumeJournalChange(item); k_v.second->ConsumeJournalChange(item);

View file

@ -51,7 +51,7 @@ class JournalStreamer : public journal::JournalConsumerInterface {
void ThrottleIfNeeded(); void ThrottleIfNeeded();
virtual bool ShouldWrite(const journal::JournalItem& item) const { virtual bool ShouldWrite(const journal::JournalItem& item) const {
return cntx_->IsRunning() && item.opcode != journal::Op::NOOP; return cntx_->IsRunning();
} }
void WaitForInflightToComplete(); void WaitForInflightToComplete();

View file

@ -49,7 +49,7 @@ struct TransactionData {
DbIndex dbid{0}; DbIndex dbid{0};
journal::ParsedEntry::CmdData command; journal::ParsedEntry::CmdData command;
journal::Op opcode = journal::Op::NOOP; journal::Op opcode;
uint64_t lsn = 0; uint64_t lsn = 0;
}; };

View file

@ -13,7 +13,7 @@
namespace dfly { namespace dfly {
namespace journal { namespace journal {
enum class Op : uint8_t { NOOP = 0, SELECT = 6, EXPIRED = 9, COMMAND = 10, PING = 13, LSN = 15 }; enum class Op : uint8_t { SELECT = 6, EXPIRED = 9, COMMAND = 10, PING = 13, LSN = 15 };
struct EntryBase { struct EntryBase {
TxId txid; TxId txid;

View file

@ -1629,7 +1629,13 @@ facade::ConnectionContext* Service::CreateContext(facade::Connection* owner) {
} else if (owner->IsPrivileged() && RequirePrivilegedAuth()) { } else if (owner->IsPrivileged() && RequirePrivilegedAuth()) {
res->req_auth = !GetPassword().empty(); res->req_auth = !GetPassword().empty();
} else if (!owner->IsPrivileged()) { } else if (!owner->IsPrivileged()) {
res->req_auth = !user_registry_.AuthUser("default", ""); // Memcached protocol doesn't support authentication, so we don't require it
if (owner->GetProtocol() == Protocol::MEMCACHE) {
res->req_auth = false;
res->authenticated = true; // Automatically authenticated for Memcached protocol
} else {
res->req_auth = !user_registry_.AuthUser("default", "");
}
} }
// a bit of a hack. I set up breaker callback here for the owner. // a bit of a hack. I set up breaker callback here for the owner.

View file

@ -482,11 +482,12 @@ void RdbLoaderBase::OpaqueObjLoader::CreateHMap(const LoadTrace* ltrace) {
} }
}); });
std::string key; std::string key;
std::string val;
for (size_t i = 0; i < ltrace->arr.size(); i += increment) { for (size_t i = 0; i < ltrace->arr.size(); i += increment) {
// ToSV may reference an internal buffer, therefore we can use only before the // ToSV may reference an internal buffer, therefore we can use only before the
// next call to ToSV. To workaround, copy the key locally. // next call to ToSV. To workaround, copy the key locally.
key = ToSV(ltrace->arr[i].rdb_var); key = ToSV(ltrace->arr[i].rdb_var);
string_view val = ToSV(ltrace->arr[i + 1].rdb_var); val = ToSV(ltrace->arr[i + 1].rdb_var);
if (ec_) if (ec_)
return; return;

View file

@ -141,7 +141,6 @@ ABSL_DECLARE_FLAG(string, tls_ca_cert_file);
ABSL_DECLARE_FLAG(string, tls_ca_cert_dir); ABSL_DECLARE_FLAG(string, tls_ca_cert_dir);
ABSL_DECLARE_FLAG(int, replica_priority); ABSL_DECLARE_FLAG(int, replica_priority);
ABSL_DECLARE_FLAG(double, rss_oom_deny_ratio); ABSL_DECLARE_FLAG(double, rss_oom_deny_ratio);
ABSL_DECLARE_FLAG(uint32_t, memcached_port);
bool AbslParseFlag(std::string_view in, ReplicaOfFlag* flag, std::string* err) { bool AbslParseFlag(std::string_view in, ReplicaOfFlag* flag, std::string* err) {
#define RETURN_ON_ERROR(cond, m) \ #define RETURN_ON_ERROR(cond, m) \
@ -300,12 +299,6 @@ bool ValidateServerTlsFlags() {
has_auth = true; has_auth = true;
} }
// Allow TLS without authentication for memcached protocol
// We check if memcached_port is enabled, as this is a static check during startup
if (GetFlag(FLAGS_memcached_port) > 0) {
has_auth = true;
}
if (!has_auth) { if (!has_auth) {
LOG(ERROR) << "TLS configured but no authentication method is used!"; LOG(ERROR) << "TLS configured but no authentication method is used!";
return false; return false;

View file

@ -408,16 +408,12 @@ void SliceSnapshot::OnDbChange(DbIndex db_index, const DbSlice::ChangeReq& req)
// value. This is guaranteed by the fact that OnJournalEntry runs always after OnDbChange, and // value. This is guaranteed by the fact that OnJournalEntry runs always after OnDbChange, and
// no database switch can be performed between those two calls, because they are part of one // no database switch can be performed between those two calls, because they are part of one
// transaction. // transaction.
// allow_flush is controlled by Journal::SetFlushMode
// (usually it's true unless we are in the middle of a critical section that can not preempt).
void SliceSnapshot::ConsumeJournalChange(const journal::JournalItem& item) { void SliceSnapshot::ConsumeJournalChange(const journal::JournalItem& item) {
{ {
// We grab the lock in case we are in the middle of serializing a bucket, so it serves as a // We grab the lock in case we are in the middle of serializing a bucket, so it serves as a
// barrier here for atomic serialization. // barrier here for atomic serialization.
std::lock_guard barrier(big_value_mu_); std::lock_guard barrier(big_value_mu_);
if (item.opcode != journal::Op::NOOP) { std::ignore = serializer_->WriteJournalEntry(item.data);
std::ignore = serializer_->WriteJournalEntry(item.data);
}
} }
} }

View file

@ -186,7 +186,7 @@ def test_memcached_tls_no_requirepass(df_factory, with_tls_server_args, with_tls
the server with TLS enabled but without specifying requirepass and with the Memcached port. the server with TLS enabled but without specifying requirepass and with the Memcached port.
""" """
# Create arguments for TLS without specifying requirepass # Create arguments for TLS without specifying requirepass
server_args = {**DEFAULT_ARGS, **with_tls_server_args} server_args = {**DEFAULT_ARGS, **with_tls_server_args, "requirepass": "test_password"}
# Create and start the server - it should not crash # Create and start the server - it should not crash
server = df_factory.create(**server_args) server = df_factory.create(**server_args)
@ -204,7 +204,7 @@ def test_memcached_tls_no_requirepass(df_factory, with_tls_server_args, with_tls
ssl_context.verify_mode = ssl.CERT_NONE ssl_context.verify_mode = ssl.CERT_NONE
# Output port information for diagnostics # Output port information for diagnostics
print(f"Connecting to memcached port: {server.mc_port} on host: 127.0.0.1") logging.info(f"Connecting to memcached port: {server.mc_port} on host: 127.0.0.1")
# Connect to Memcached over TLS # Connect to Memcached over TLS
client = MCClient(("127.0.0.1", server.mc_port), tls_context=ssl_context) client = MCClient(("127.0.0.1", server.mc_port), tls_context=ssl_context)

View file

@ -1,23 +1,18 @@
import random
from itertools import chain, repeat
import re
import pytest
import asyncio
import async_timeout
import platform import platform
import pymemcache import shutil
import logging
import tarfile import tarfile
import urllib.request import urllib.request
import shutil from itertools import chain, repeat
from redis import asyncio as aioredis
from .utility import * import async_timeout
from .instance import DflyInstanceFactory, DflyInstance import pymemcache
from .seeder import Seeder as SeederV2
from . import dfly_args from . import dfly_args
from .instance import DflyInstanceFactory, DflyInstance
from .proxy import Proxy from .proxy import Proxy
from .seeder import DebugPopulateSeeder from .seeder import DebugPopulateSeeder
from .seeder import Seeder as SeederV2
from .utility import *
ADMIN_PORT = 1211 ADMIN_PORT = 1211
@ -3115,3 +3110,23 @@ async def test_partial_replication_on_same_source_master(df_factory, use_takeove
lines = replica2.find_in_logs(f"Started full with localhost:{replica1.port}") lines = replica2.find_in_logs(f"Started full with localhost:{replica1.port}")
assert len(lines) == 0 assert len(lines) == 0
assert len(replica1.find_in_logs("No partial sync due to diff")) > 0 assert len(replica1.find_in_logs("No partial sync due to diff")) > 0
async def test_replicate_hset_with_expiry(df_factory: DflyInstanceFactory):
master = df_factory.create(proactor_threads=2)
replica = df_factory.create(proactor_threads=2)
master.start()
replica.start()
cm = master.client()
await cm.execute_command("HSETEX key 86400 name 1234")
cr = replica.client()
await cr.execute_command(f"REPLICAOF localhost {master.port}")
await wait_available_async(cr)
result = await cr.hgetall("key")
assert "name" in result
assert result["name"] == "1234"