miki3421 opened a new issue, #284:
URL: https://github.com/apache/openserverless/issues/284

   A normal Redis pod replacement can lose acknowledged writes made since the 
last RDB snapshot, even though Redis persistence is enabled. The operator 
starts Redis under a shell without `exec`, so Redis does not receive the 
container stop signal and cannot perform its final save.
   
   ### Affected configuration
   
   Verified on the 0.9.0 K3s baseline with Redis 8.2.1, `save 3600 1 300 100 60 
10000`, AOF disabled and a persistent PVC. The main-container command in both 
`openserverless/templates/redis-set.yaml` and `deploy/redis/redis-set.yaml` is:
   
   ```yaml
   command: ["/bin/sh", "-c", "redis-server /redis-master/redis.conf"]
   ```
   
   That command is present in Apache 0.9.0 commit 
`0205d8efedfbcda3c10a5f45718eaa32069dfc3b`, before the ACL persistence change 
in apache/openserverless-operator#157.
   
   ### Controlled reproduction
   
   Four experiments used the same Redis image and persistence configuration, 
with isolated synthetic pods/PVCs. Each wrote one key and saved it, then 
acknowledged a second key without an intervening snapshot. The previously saved 
key survived every experiment.
   
   | Stop path | Container exit | Latest write |
   | --- | --- | --- |
   | Current command, ordinary pod deletion | 137 after 30.722 s | Lost |
   | Same command with `exec`, ordinary pod deletion | 0 after 0.699 s | 
Preserved |
   | Current command, explicit `SHUTDOWN SAVE` | 0 after 0.190 s | Preserved |
   | `exec` command, deliberate `SIGKILL` | 137 | Lost, expected with RDB |
   
   With the current command, process 1 was `sh` and Redis was its child. Redis 
logged neither receipt of SIGTERM nor a final RDB save. With `exec`, Redis was 
process 1, logged SIGTERM and its final RDB snapshot, and retained the newest 
write. Original tenant workloads were not restarted or changed by this 
reproduction; temporary resources were removed.
   
   ### Expected behavior and correction
   
   [Kubernetes sends the stop signal to process 
1](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination-flow).
 With RDB save points configured, [Redis performs its shutdown save when it 
receives SIGTERM](https://redis.io/docs/latest/commands/shutdown/). The 
ordinary pod-deletion case should therefore preserve the pending writes when 
sufficient shutdown time is available.
   
   The focused correction is to use `exec redis-server 
/redis-master/redis.conf` in both manifests, with regression coverage for 
signal propagation and a real Redis restart. This leaves the image version, 
RDB/AOF policy and storage layout unchanged.
   
   This is separate from ACL identity persistence in #181 / 
apache/openserverless-operator#157. A real crash or SIGKILL can still lose 
writes since the last RDB snapshot. The experiments used two small keys; the 
grace period needed to save a production-sized dataset was not measured.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to