{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":156018,"defaultBranch":"unstable","name":"redis","ownerLogin":"redis","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2009-03-21T22:32:25.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/1529926?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1716099308.0","currentOid":""},"activityList":{"items":[{"before":"5a3534f9b5f4e49c7e59f168250e78d0ea6abfa6","after":"50569a906c29ea4f2348f88888ff71bca4afb47b","ref":"refs/heads/unstable","pushedAt":"2024-05-30T14:09:30.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Free current client asynchronously after user permissions changes (#13274)\n\nThe crash happens when the user that triggers the permission changes\r\nshould be affected (and should be disconnected eventually).\r\n\r\nTo handle such a scenario, we should use the\r\n`CLIENT_CLOSE_AFTER_COMMAND` flag.\r\n\r\nThis commit encapsulates all the places that should be handled in the\r\nsame way in `deauthenticateAndCloseClient`\r\n\r\nAlso:\r\n* bugfix: during the ACL LOAD we ignore clients that are marked as\r\n`CLIENT MASTER`","shortMessageHtmlLink":"Free current client asynchronously after user permissions changes (#1…"}},{"before":"7b9e96069048dda85ee460fc084dbf6c4281bd53","after":"5a3534f9b5f4e49c7e59f168250e78d0ea6abfa6","ref":"refs/heads/unstable","pushedAt":"2024-05-30T11:09:26.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"dynamically list test files (#13220)\n\n**Related issue**\r\nhttps://github.com/redis/redis/issues/13219\r\n\r\n**Motivation**\r\nCurrently we have to manually update the all_tests variable when\r\nintroducing new test files.\r\n\r\n**Modification**\r\nI have modified it to list test files dynamically, but instead of\r\nmodifying it to add all test files, I have modified it to only add only\r\ntest files from the following 4 paths\r\n\r\n- unit\r\n- unit/type\r\n- unit/cluster\r\n- integration\r\n\r\nso that it doesn't deviate too much from what we already do\r\n\r\n**Result**\r\n- dynamically list test files to all_tests variable\r\n- close issue https://github.com/redis/redis/issues/13219\r\n\r\n**Additional information**\r\n- removed `list-common.tcl` file and added\r\n`generate_largevalue_test_array` proc in `util.tcl`. because\r\n`list-common.tcl` is not a test file\r\n- There is an order dependency. So I added a code to the \"Is a ziplist\r\nencoded Hash promoted on big payload?\" test that resets\r\nhash-max-listpack-value to the default (64).\r\n\r\n---------\r\n\r\nSigned-off-by: jonghoonpark \r\nCo-authored-by: debing.sun ","shortMessageHtmlLink":"dynamically list test files (#13220)"}},{"before":"2d1bb42cba2258e229235be00d382476e2ee6049","after":"7b9e96069048dda85ee460fc084dbf6c4281bd53","ref":"refs/heads/unstable","pushedAt":"2024-05-30T07:26:19.000Z","pushType":"pr_merge","commitsCount":22,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Hash Field Expiration (#13303)\n\n## Background\r\n\r\nThis PR introduces support for field-level expiration in Redis hashes. Previously, Redis supported expiration only at the key level, but this enhancement allows setting expiration times for individual fields within a hash.\r\n\r\n## New commands\r\n* HEXPIRE\r\n* HEXPIREAT\r\n* HEXPIRETIME\r\n* HPERSIST\r\n* HPEXPIRE\r\n* HPEXPIREAT\r\n* HPEXPIRETIME\r\n* HPTTL\r\n* HTTL\r\n\r\n## Short example\r\nfrom @moticless\r\n```sh\r\n127.0.0.1:6379> hset myhash f1 v1 f2 v2 f3 v3 \r\n(integer) 3\r\n127.0.0.1:6379> hpexpire myhash 10000 NX fields 2 f2 f3 \r\n1) (integer) 1\r\n2) (integer) 1\r\n127.0.0.1:6379> hpttl myhash fields 3 f1 f2 f3 \r\n1) (integer) -1\r\n2) (integer) 9997\r\n3) (integer) 9997\r\n127.0.0.1:6379> hgetall myhash \r\n1) \"f3\"\r\n2) \"v3\"\r\n3) \"f2\"\r\n4) \"v2\"\r\n5) \"f1\"\r\n6) \"v1\"\r\n\r\n... after 10 seconds ...\r\n\r\n127.0.0.1:6379> hgetall myhash \r\n1) \"f1\"\r\n2) \"v1\"\r\n127.0.0.1:6379>\r\n```\r\n\r\n## Expiration strategy\r\n1. Integrate active\r\n Redis periodically performs active expiration and deletion of hash keys that contain expired fields, with a maximum attempt limit.\r\n3. Lazy expiration\r\n When a client touches fields within a hash, Redis checks if the fields are expired. If a field is expired, it will be deleted. However, we do not delete expired fields during a traversal, we implicitly skip over them.\r\n\r\n## RDB changes\r\nAdd two new rdb type s`RDB_TYPE_HASH_METADATA` and `RDB_TYPE_HASH_LISTPACK_EX`.\r\n\r\n## Notification\r\n1. Add `hpersist` notification for `HPERSIST` command.\r\n5. Add `hexpire` notification for `HEXPIRE`, `HEXPIREAT`, `HPEXPIRE` and `HPEXPIREAT` commands.\r\n\r\n## Internal\r\n1. Add new data structure `ebuckets`, which is used to store TTL and keys, enabling quick retrieval of keys based on TTL.\r\n2. Add new data structure `mstr` like sds, which is used to store a string with TTL.\r\n\r\nThis work was done by @moticless, @tezc, @ronen-kalish, @sundb, I just release it.","shortMessageHtmlLink":"Hash Field Expiration (#13303)"}},{"before":"33fc0fbfae1c048b8b313baa13bdc78cbd2e763a","after":"f0389f282394cca3b646f7dc45043dac9ffe83f7","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-29T13:35:47.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Fix position of numfields in H(P)EXPIRE json files (#13301)\n\nFix position of numfields in H(P)EXPIRE json files","shortMessageHtmlLink":"Fix position of numfields in H(P)EXPIRE json files (#13301)"}},{"before":"6a11d458bee7ac611ce8acdd42259fccbff4c197","after":"33fc0fbfae1c048b8b313baa13bdc78cbd2e763a","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-29T11:47:48.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"HFE to support AOF and replicas (#13285)\n\n* For replica sake, rewrite commands `H*EXPIRE*` , `HSETF`, `HGETF` to\r\nhave absolute unix time in msec.\r\n* On active-expiration of field, propagate HDEL to replica\r\n(`propagateHashFieldDeletion()`)\r\n* On lazy-expiration, propagate HDEL to replica (`hashTypeGetValue()`\r\nnow calls `hashTypeDelete()`. It also takes care to call\r\n`propagateHashFieldDeletion()`).\r\n* Fix `H*EXPIRE*` command such that if it gets flag `LT` and it doesn’t\r\nhave any expiration on the field then it will considered as valid\r\ncondition.\r\n\r\nNote, replicas doesn’t make any active expiration, and should avoid lazy\r\nexpiration. On `hashTypeGetValue()` it doesn't check expiration (As long\r\nas the master didn’t request to delete the field, it is valid)\r\n\r\nTODO: \r\n* Attach `dbid` to HASH metadata. See\r\n[here](https://github.com/redis/redis/pull/13209#discussion_r1593385850)\r\n\r\n---------\r\n\r\nCo-authored-by: debing.sun ","shortMessageHtmlLink":"HFE to support AOF and replicas (#13285)"}},{"before":"e2918705c8ad9e7c7d60ff111ea1e93d79c5aa06","after":"6a11d458bee7ac611ce8acdd42259fccbff4c197","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-28T08:59:57.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Fix hscan return value (#13297)\n\nIn the last step of hscan, while replying to client, we assume all items\r\nin the result list are keys which are mstr instances. Though, there \r\nmight be values which are sds instances. \r\n\r\nAdded a check to avoid calling mstrlen() for value objects.\r\n\r\nTo reproduce:\r\n```\r\n127.0.0.1:6379> hset myhash1 a 11111111111111111111111111111111111111111111111111111111111111111\r\n(integer) 0\r\n127.0.0.1:6379> hscan myhash1 0\r\n1) \"0\"\r\n2) 1) \"a\"\r\n 2) \"11111111111111111111111111111111111111111111111111111111111111111\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"\r\n```","shortMessageHtmlLink":"Fix hscan return value (#13297)"}},{"before":"2f34f6f0b98cc7de1a9b4fafe06e62703be5b0af","after":"e2918705c8ad9e7c7d60ff111ea1e93d79c5aa06","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-27T13:07:01.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Fix hfe reply schemas (#13295)\n\nIn https://github.com/redis/redis/pull/13291, we've changed that hfe\r\ncommands to return empty array if the key does not exist.\r\nForgot to update json schemas.","shortMessageHtmlLink":"Fix hfe reply schemas (#13295)"}},{"before":"6801a3cec882d45853dde84b92fd3aace7a9e9b7","after":"2d1bb42cba2258e229235be00d382476e2ee6049","ref":"refs/heads/unstable","pushedAt":"2024-05-27T08:47:24.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Update version references from 8.0 to 7.4 for upcoming release (#13294)","shortMessageHtmlLink":"Update version references from 8.0 to 7.4 for upcoming release (#13294)"}},{"before":"60e1582ddb4247195d2fbe1b52968e393103d865","after":"2f34f6f0b98cc7de1a9b4fafe06e62703be5b0af","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-26T10:30:45.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Delete hsetf and hgetf (#13291)\n\nChanges:\r\n- Delete hsetf and hgetf commands\r\n- Hfe commands will return empty array instead of nil.\r\n---------\r\n\r\nCo-authored-by: Moti Cohen ","shortMessageHtmlLink":"Delete hsetf and hgetf (#13291)"}},{"before":"f34f2ade85359770bb708ddc23503d95db93ccfc","after":"60e1582ddb4247195d2fbe1b52968e393103d865","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-26T00:34:15.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Fix statistics test (#13293)","shortMessageHtmlLink":"Fix statistics test (#13293)"}},{"before":"e92363e248019b8bf3fc7dd8ce84f648b6b13473","after":"6801a3cec882d45853dde84b92fd3aace7a9e9b7","ref":"refs/heads/unstable","pushedAt":"2024-05-25T07:59:27.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"redis-cli --keystats and --keystats-samples with --top and --cursor (#12826)\n\nAdded `--keystats` and `--keystats-samples ` commands.\r\n\r\nThe new commands combines memkeys and bigkeys with additional\r\ndistribution data.\r\nWe often run memkeys and bigkeys one after the other. It will be\r\nconvenient to just have one command.\r\nDistribution and top 10 key sizes are useful when we have multiple keys\r\ntaking a lot of memory.\r\n\r\nLike for memkeys and bigkeys, we can use `-i ` and Ctrl-C to\r\ninterrupt the scan loop. It will still show the statistics on the keys\r\nsampled so far.\r\nWe can use two new optional parameters:\r\n- `--cursor ` to continue from the last cursor after an interruption\r\nof the scan.\r\n- `--top ` to change the number of top key sizes (10 by default).\r\n\r\nImplemented a fix for the `--memkeys-samples 0` issue in order to use\r\n`--keystats-samples 0`.\r\n\r\nUsed hdr_histogram for the key size distribution.\r\n\r\nFor key length, hdr_histogram seemed overkill and preset ranges were\r\nused.\r\n\r\nThe memory used by keystats with hdr_histogram is around 7MB (compared\r\nto 3MB for memkeys or bigkeys).\r\n\r\nExecution time is somewhat equivalent to adding memkeys and bigkeys\r\ntime. Each scan loop is having more commands (key type, key size, key\r\nlength/cardinality).\r\n\r\nWe can redirect the output to a file. In that case, no color or text\r\nrefresh will happen.\r\n\r\nLimitation:\r\n- As the information printed during the loop is refreshed (moving cursor\r\nup), stderr and information not fitting in the terminal window (width or\r\nheight) might create some refresh issues.\r\n\r\nComments:\r\n- config.top_sizes_limit could be used globally like config.count, but\r\nit is passed as parameter to be consistent with config.memkeys_samples.\r\n- Not sure if we should move some utility functions to cli-common.c.\r\n\r\nGot some tips and help from @ofirluzon.\r\n\r\n---------\r\n\r\nCo-authored-by: Binbin \r\nCo-authored-by: Viktor Söderqvist \r\nCo-authored-by: debing.sun ","shortMessageHtmlLink":"redis-cli --keystats and --keystats-samples with --top and --cursor (#…"}},{"before":"ae6df30eb13bea2f15a5f39a78bf311c41d47322","after":"f34f2ade85359770bb708ddc23503d95db93ccfc","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-23T14:29:46.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"moticless","name":"Moti Cohen","path":"/moticless","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/24944278?s=80&v=4"},"commit":{"message":"Add Statistics hashes_with_expiry_fields to INFO (#13275)\n\nAdded hashes_with_expiry_fields.\r\nOptimially it would better to have statistic of that counts all fields\r\nwith expiry. But it requires careful logic and computation to follow and\r\ndeep dive listpacks and hashes. This statistics is trivial to achieve\r\nand reflected by global HFE DS that has builtin enumeration of all the\r\nhashes that are registered in it.","shortMessageHtmlLink":"Add Statistics hashes_with_expiry_fields to INFO (#13275)"}},{"before":"a25b15392c3f50909ab2dafbcbdb3794ada29620","after":"ae6df30eb13bea2f15a5f39a78bf311c41d47322","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-23T07:46:50.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"moticless","name":"Moti Cohen","path":"/moticless","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/24944278?s=80&v=4"},"commit":{"message":"Fix ebuckets stop indication during ebExpire() (#13287)\n\non active-expire of buckets, at function `ebExpire()` ->\r\n`ebSegExpire()`, if callback `onExpireItem()` indicated to stop, Yet\r\niterator (iter) was wrongly already got updated to point to next item.\r\nIn turn the segment will be updated without current item.","shortMessageHtmlLink":"Fix ebuckets stop indication during ebExpire() (#13287)"}},{"before":"95cbe879e54ab19d0120eac9fa10240759a129e1","after":"a25b15392c3f50909ab2dafbcbdb3794ada29620","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-22T20:05:32.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Improve performance of hfe listpack (#13279)\n\nThis PR contains a few optimizations for hfe listpack.\r\n- Hfe fields are ordered by TTL in the listpack. There are two cases\r\nthat we want to search listpack according to TTLs:\r\n- As part of active-expiry, we need to find the fields that are expired.\r\ne.g. find fields that have smaller TTLs than given timestamp.\r\n- When we want to add a new field, we need to find the correct position\r\nto maintain the order by TTL. e.g. find the field that has a higher TTL\r\nthan the one we want to insert.\r\n \r\nIterating with lpNext() to compare TTLs has a performance cost as\r\nlpNext() calls lpValidateIntegrity() for each entry. Instead, this PR\r\nadds `lpFindCb()` to the listpack which accepts a comparator callback.\r\nIt preserves same validation logic of lpFind() which is faster than\r\nsearch with lpNext().\r\n \r\n- We have field name, value, ttl for a single hfe field. Inserting these\r\nitems one by one to listpack is costly. Especially, as we place fields\r\naccording to TTL, most additions will end up in the middle of the\r\nlistpack. Each insert causes realloc + memmove. This PR introduces\r\n`lpBatchInsert()` to add multiple items in one go.\r\n\r\n- For hsetf, if we are going to update value and TTL at the same time,\r\ncurrently, we update the value first and later update the TTL (two\r\ndistinct listpack operation). This PR improves it by doing it with a\r\nsingle update operation.\r\n\r\n---------\r\n\r\nCo-authored-by: debing.sun ","shortMessageHtmlLink":"Improve performance of hfe listpack (#13279)"}},{"before":"36c3cec6d17222eadea5e07a982791a45e3d0ec4","after":"95cbe879e54ab19d0120eac9fa10240759a129e1","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-22T02:53:30.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"sanitize dump payload for HFE (#13278)\n\nAdd the following validations:\r\n1. Get TTL using the lpGetIntegerValue() method instead of lpGetValue(),\r\nRef https://github.com/redis/redis/pull/13209#discussion_r1602569422\r\n2. The TTL of listpackex is a number in the valid range\r\n(0~EB_EXPIRE_TIME_MAX) and ordered.\r\n3. The TTL fields of listpackex are ordered. \r\n4. The TTL of hashtable is within the valid range\r\n(0~EB_EXPIRE_TIME_MAX).\r\n\r\nOther:\r\nFix the missing of handling OBJ_ENCODING_LISTPACK_EX in\r\ndismissHashObject().\r\n\r\n---------\r\n\r\nCo-authored-by: Ozan Tezcan ","shortMessageHtmlLink":"sanitize dump payload for HFE (#13278)"}},{"before":"9ffc35c98e4629faa0faa4f17a9196da7b4ef9c7","after":"e92363e248019b8bf3fc7dd8ce84f648b6b13473","ref":"refs/heads/unstable","pushedAt":"2024-05-21T02:33:14.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Log the real reason for why posix_fadvise failed (#13246)\n\n`reclaimFilePageCache` did not set `errno` but `rdbSaveInternal` which\r\nis logging the error assumed it did. This makes sure `errno` is set.\r\n\r\nFixes #13245\r\n\r\nSigned-off-by: Ted Lyngmo ","shortMessageHtmlLink":"Log the real reason for why posix_fadvise failed (#13246)"}},{"before":"f1b02129173dd676feca0131dcde92d5b374dacf","after":"9ffc35c98e4629faa0faa4f17a9196da7b4ef9c7","ref":"refs/heads/unstable","pushedAt":"2024-05-21T01:25:14.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Have consistent behavior of SPUBLISH within multi/exec like regular command (#13276)\n\nThis PR is based on the commits from PR #12944.\r\n\r\nAllow SPUBLISH command within multi/exec on replica\r\n\r\nBehavior on unstable:\r\n\r\n```\r\n127.0.0.1:6380> CLUSTER NODES\r\n39ce8aa20f1f0d91f1a88d976ee1926dfefcdf1a 127.0.0.1:6380@16380 myself,slave 8b0feb120b68aac489d6a5af9c77dc40d71bc792 0 0 0 connected\r\n8b0feb120b68aac489d6a5af9c77dc40d71bc792 127.0.0.1:6379@16379 master - 0 1705091681202 0 connected 0-16383\r\n127.0.0.1:6380> SPUBLISH hello world\r\n(integer) 0\r\n127.0.0.1:6380> MULTI\r\nOK\r\n127.0.0.1:6380(TX)> SPUBLISH hello world\r\nQUEUED\r\n127.0.0.1:6380(TX)> EXEC\r\n(error) MOVED 866 127.0.0.1:6379\r\n```\r\n\r\nWith this change:\r\n\r\n```\r\n127.0.0.1:6380> SPUBLISH hello world\r\n(integer) 0\r\n127.0.0.1:6380> MULTI\r\nOK\r\n127.0.0.1:6380(TX)> SPUBLISH hello world\r\nQUEUED\r\n127.0.0.1:6380(TX)> EXEC\r\n1) (integer) 0\r\n```\r\n\r\n---------\r\n\r\nCo-authored-by: Harkrishn Patro \r\nCo-authored-by: oranagra ","shortMessageHtmlLink":"Have consistent behavior of SPUBLISH within multi/exec like regular c…"}},{"before":"d2c8a4b91e8c0e6aefd1f5bc0bf582cddbe046b7","after":"f60370ce28b946c1146dcea77c9c399d39601aaa","ref":"refs/heads/7.2","pushedAt":"2024-05-19T06:12:35.000Z","pushType":"pr_merge","commitsCount":14,"pusher":{"login":"YaacovHazan","name":null,"path":"/YaacovHazan","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/31382944?s=80&v=4"},"commit":{"message":"Redis 7.2.5","shortMessageHtmlLink":"Redis 7.2.5"}},{"before":"323be4d6993faf02bf89382f06f04f0d0f9a70c9","after":"36c3cec6d17222eadea5e07a982791a45e3d0ec4","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-18T08:34:13.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Fix hfe RDB tests by adding FIELDS keyword to hexpire commands (#13277)\n\nFIELDS keyword was added as part of\r\n[#13270](https://github.com/redis/redis/pull/13270). \r\n\r\nIt was missing in\r\n[#13243](https://github.com/redis/redis/pull/13243)","shortMessageHtmlLink":"Fix hfe RDB tests by adding FIELDS keyword to hexpire commands (#13277)"}},{"before":"71676513ddd125af03926b60748bf7eae5689f67","after":"323be4d6993faf02bf89382f06f04f0d0f9a70c9","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-17T10:27:02.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Hfe serialization listpack (#13243)\n\nAdd RDB de/serialization for HFE\r\n\r\nThis PR adds two new RDB types: `RDB_TYPE_HASH_METADATA` and\r\n`RDB_TYPE_HASH_LISTPACK_TTL` to save HFE data.\r\nWhen the hash RAM encoding is dict, it will be saved in the former, and\r\nwhen it is listpack it will be saved in the latter.\r\nBoth formats just add the TTL value for each field after the data that\r\nwas previously saved, i.e HASH_METADATA will save the number of entries\r\nand, for each entry, key, value and TTL, whereas listpack is saved as a\r\nblob.\r\nOn read, the usual dict <--> listpack conversion takes place if\r\nrequired.\r\nIn addition, when reading a hash that was saved as a dict fields are\r\nactively expired if expiry is due. Currently this slao holds for\r\nlistpack encoding, but it is supposed to be removed.\r\n\r\nTODO:\r\nRemove active expiry on load when loading from listpack format (unless\r\nwe'll decide to keep it)","shortMessageHtmlLink":"Hfe serialization listpack (#13243)"}},{"before":"80be2cc29111b31e316c47529b21c7a9efc61651","after":"71676513ddd125af03926b60748bf7eae5689f67","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-16T16:35:58.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"moticless","name":"Moti Cohen","path":"/moticless","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/24944278?s=80&v=4"},"commit":{"message":"Fix commands H*EXPIRE* and H*TTL to include `FIELDS` constant (#13270)\n\nThe same goes to: HPEXPIRE, HEXPIREAT, HPEXPIREAT, HEXPIRETIME,\r\nHPEXPIRETIME, HPTTL, HTTL, HPERSIST","shortMessageHtmlLink":"Fix commands H*EXPIRE* and H*TTL to include FIELDS constant (#13270)"}},{"before":"ffbdf2f6f37e2d5c0d1dcc6db16b63faacffd705","after":"f1b02129173dd676feca0131dcde92d5b374dacf","ref":"refs/heads/unstable","pushedAt":"2024-05-15T06:12:22.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Revert \"Change mmap rand bits as a temporary mitigation to resolve asan bug (#13150)\" (#13266)\n\nThe kernel config `vm.mmap_rnd_bits` had been revert in\r\nhttps://github.com/actions/runner-images/issues/9491, so we can revert\r\nthe changes from #13150.\r\n\r\nCI only with ASAN passed:\r\nhttps://github.com/sundb/redis/actions/runs/9058263634","shortMessageHtmlLink":"Revert \"Change mmap rand bits as a temporary mitigation to resolve as…"}},{"before":"8a05f0092b0e291498b8fdb8dd93355467ceab25","after":"ffbdf2f6f37e2d5c0d1dcc6db16b63faacffd705","ref":"refs/heads/unstable","pushedAt":"2024-05-14T12:08:32.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Fix test failure due to differing reply format of XREADGROUP under RESP3 in MULTI (#13255)\n\nThis test was introducted by #13251.\r\nNormally we auto transform the reply format of XREADGROUP to array under\r\nRESP3 (see trasformer_funcs).\r\nBut when we execute XREADGROUP command in multi it can't work, which\r\ncause the new test failed.\r\nThe solution is to verity the reply of XREADGROUP in advance rather than\r\nin MULTI.\r\n\r\nFailed validate schema CI:\r\nhttps://github.com/redis/redis/actions/runs/9025128323/job/24800285684\r\n\r\n---------\r\n\r\nCo-authored-by: guybe7 ","shortMessageHtmlLink":"Fix test failure due to differing reply format of XREADGROUP under RE…"}},{"before":"5066e6e9cdd5f8dcb5451d4b5432d9ddbf3364de","after":"80be2cc29111b31e316c47529b21c7a9efc61651","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-14T09:32:33.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Add defragment support for HFE (#13229)\n\n## Background\r\n1. All hash objects that contain HFE are referenced by db->hexpires.\r\n2. All fields in a dict hash object with HFE are referenced by an\r\nebucket.\r\n\r\nSo when we defrag the hash object or the field in a dict with HFE, we\r\nalso need to update the references in them.\r\n\r\n## Interface\r\n1. Add a new interface `ebDefragItem`, which can accept a defrag\r\ncallback to defrag items in ebuckets, and simultaneously update their\r\nreferences in the ebucket.\r\n\r\n## Mainly changes\r\n1. The key type of dict of hash object is no longer sds, so add new\r\n`activeDefragHfieldDict()` to defrag the dict instead of\r\n`activeDefragSdsDict()`.\r\n2. When we defrag the dict of hash object by using `dictScanDefrag()`,\r\nwe always set the defrag callback `defragKey` of `dictDefragFunctions`\r\nto NULL, because we can't reallocate a field with out updating it's\r\nreference in ebuckets.\r\nInstead, we will defrag the field of the dict and update its reference\r\nin the callback `dictScanDefrag` of dictScanFunction().\r\n3. When we defrag the hash robj with HFE, we will use `ebDefragItem` to\r\ndefrag the robj and update the reference in db->hexpires.\r\n\r\n## TODO:\r\nDefrag ebucket structure incremently, which will be handler in a future\r\nPR.\r\n\r\n---------\r\n\r\nCo-authored-by: Ozan Tezcan \r\nCo-authored-by: Moti Cohen ","shortMessageHtmlLink":"Add defragment support for HFE (#13229)"}},{"before":"7010f41c9671d0a424459be33619b08bdc49838a","after":"5066e6e9cdd5f8dcb5451d4b5432d9ddbf3364de","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-13T08:09:49.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Fix hgetf/hsetf reply type by returning string (#13263)\n\nIf encoding is listpack, hgetf and hsetf commands reply field value type\r\nas integer.\r\nThis PR fixes it by returning string.\r\n\r\nProblematic cases:\r\n```\r\n127.0.0.1:6379> hset hash one 1\r\n(integer) 1\r\n127.0.0.1:6379> hgetf hash fields 1 one\r\n1) (integer) 1\r\n127.0.0.1:6379> hsetf hash GETOLD fvs 1 one 2\r\n1) (integer) 1\r\n127.0.0.1:6379> hsetf hash DOF GETNEW fvs 1 one 2\r\n1) (integer) 2\r\n```\r\n\r\nAdditional fixes:\r\n- hgetf/hsetf command description text\r\n\r\nFixes #13261, #13262","shortMessageHtmlLink":"Fix hgetf/hsetf reply type by returning string (#13263)"}},{"before":null,"after":"f012703e2f9d9dbe2f5ce780bff89eb0e868f686","ref":"refs/heads/LiorKogan-patch-1","pushedAt":"2024-05-12T10:14:18.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"LiorKogan","name":"Lior Kogan","path":"/LiorKogan","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7252991?s=80&v=4"},"commit":{"message":"Update 00-RELEASENOTES","shortMessageHtmlLink":"Update 00-RELEASENOTES"}},{"before":"0e1de78fca849c135fd00cd85b5b87920e46e50d","after":"8a05f0092b0e291498b8fdb8dd93355467ceab25","ref":"refs/heads/unstable","pushedAt":"2024-05-10T03:10:14.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Add reverse history search in redis-cli (linenoise) (#12543)\n\nadded reverse history search to redis-cli, use it with the following:\r\n\r\n* CTRL+R : enable search backward mode, and search next one when\r\npressing CTRL+R again until reach index 0.\r\n```\r\n127.0.0.1:6379> keys one\r\n127.0.0.1:6379> keys two\r\n(reverse-i-search): # press CTRL+R\r\n(reverse-i-search): keys two # input `keys`\r\n(reverse-i-search): keys one # press CTRL+R again\r\n(reverse-i-search): keys one # press CTRL+R again, still `keys one` due to reaching index 0\r\n(i-search): keys two # press CTRL+S, enable search forward\r\n(i-search): keys two # press CTRL+S, still `keys one` due to reaching index 1\r\n```\r\n\r\n* CTRL+S : enable search forward mode, and search next one when pressing\r\nCTRL+S again until reach index 0.\r\n```\r\n127.0.0.1:6379> keys one\r\n127.0.0.1:6379> keys two\r\n(i-search): # press CTRL+S\r\n(i-search): keys one # input `keys`\r\n(i-search): keys two # press CTRL+S again\r\n(i-search): keys two # press CTRL+R again, still `keys two` due to reaching index 0\r\n(reverse-i-search): keys one # press CTRL+R, enable search backward\r\n(reverse-i-search): keys one # press CTRL+S, still `keys one` due to reaching index 1\r\n```\r\n\r\n* CTRL+G : disable\r\n```\r\n127.0.0.1:6379> keys one\r\n127.0.0.1:6379> keys two\r\n(reverse-i-search): # press CTRL+R\r\n(reverse-i-search): keys two # input `keys`\r\n127.0.0.1:6379> # press CTRL+G\r\n```\r\n\r\n* CTRL+C : disable\r\n```\r\n127.0.0.1:6379> keys one\r\n127.0.0.1:6379> keys two\r\n(reverse-i-search): # press CTRL+R\r\n(reverse-i-search): keys two # input `keys`\r\n127.0.0.1:6379> # press CTRL+G\r\n```\r\n\r\n* TAB : use the current search result and exit search mode\r\n```\r\n127.0.0.1:6379> keys one\r\n127.0.0.1:6379> keys two\r\n(reverse-i-search): # press CTRL+R\r\n(reverse-i-search): keys two # input `keys`\r\n127.0.0.1:6379> keys two # press TAB\r\n```\r\n\r\n* ENTER : use the current search result and execute the command\r\n```\r\n127.0.0.1:6379> keys one\r\n127.0.0.1:6379> keys two\r\n(reverse-i-search): # press CTRL+R\r\n(reverse-i-search): keys two # input `keys`\r\n127.0.0.1:6379> keys two # press ENTER\r\n(empty array)\r\n127.0.0.1:6379>\r\n```\r\n\r\n* any arrow key will disable reverse search\r\n\r\nyour result will have the search match bolded, you can press enter to\r\nexecute the full result\r\n\r\nnote: I have _only added this for multi-line mode_, as it seems to be\r\nforced that way when `repl` is called\r\n\r\nCloses: https://github.com/redis/redis/issues/8277\r\n\r\n---------\r\n\r\nCo-authored-by: Clayton Northey \r\nCo-authored-by: Viktor Söderqvist \r\nCo-authored-by: debing.sun \r\nCo-authored-by: Bjorn Svensson \r\nCo-authored-by: Viktor Söderqvist ","shortMessageHtmlLink":"Add reverse history search in redis-cli (linenoise) (#12543)"}},{"before":"ca4ed48db662cbd568df4775003faabf7491043b","after":"7010f41c9671d0a424459be33619b08bdc49838a","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-09T14:23:00.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Add notification support for HFE (#13237)\n\n1. Add `hpersist` notification for `hpersist` command.\r\n2. Add `pexpire` notification for `hexpire`, `hexpireat` and `hpexpire`.","shortMessageHtmlLink":"Add notification support for HFE (#13237)"}},{"before":"13401f8bc1cd6ab2905f406227fb9d762d78247e","after":"ca4ed48db662cbd568df4775003faabf7491043b","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-08T20:11:32.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Add listpack support, hgetf and hsetf commands (#13209)\n\n**Changes:**\r\n- Adds listpack support to hash field expiration \r\n- Implements hgetf/hsetf commands\r\n\r\n**Listpack support for hash field expiration**\r\n\r\nWe keep field name and value pairs in listpack for the hash type. With\r\nthis PR, if one of hash field expiration command is called on the key\r\nfor the first time, it converts listpack layout to triplets to hold\r\nfield name, value and ttl per field. If a field does not have a TTL, we\r\nstore zero as the ttl value. Zero is encoded as two bytes in the\r\nlistpack. So, once we convert listpack to hold triplets, for the fields\r\nthat don't have a TTL, it will be consuming those extra 2 bytes per\r\nitem. Fields are ordered by ttl in the listpack to find the field with\r\nminimum expiry time efficiently.\r\n\r\n**New command implementations as part of this PR:** \r\n\r\n- HGETF command\r\n\r\nFor each specified field get its value and optionally set the field's\r\nexpiration time in sec/msec /unix-sec/unix-msec:\r\n ```\r\n HGETF key \r\n [NX | XX | GT | LT]\r\n[EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT\r\nunix-time-milliseconds | PERSIST]\r\n \r\n ```\r\n\r\n- HSETF command\r\n\r\nFor each specified field value pair: set field to value and optionally\r\nset the field's expiration time in sec/msec /unix-sec/unix-msec:\r\n ```\r\n HSETF key \r\n [DC] \r\n [DCF | DOF] \r\n [NX | XX | GT | LT] \r\n [GETNEW | GETOLD] \r\n[EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT\r\nunix-time-milliseconds | KEEPTTL]\r\n \r\n ```\r\n\r\nTodo:\r\n- Performance improvement.\r\n- rdb load/save\r\n- aof\r\n- defrag","shortMessageHtmlLink":"Add listpack support, hgetf and hsetf commands (#13209)"}},{"before":"03cd525ffaa301822ebdf96e95e0ffe19474f07d","after":"13401f8bc1cd6ab2905f406227fb9d762d78247e","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-08T15:38:45.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"moticless","name":"Moti Cohen","path":"/moticless","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/24944278?s=80&v=4"},"commit":{"message":"ebuckets: Add test for ACT_UPDATE_EXP_ITEM (#13249)\n\n- On ebExpire() verify the logic of update expired value to a new time\r\nrather than remove it.\r\n- Refine ebuckets benchmark","shortMessageHtmlLink":"ebuckets: Add test for ACT_UPDATE_EXP_ITEM (#13249)"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEWBdKHgA","startCursor":null,"endCursor":null}},"title":"Activity · redis/redis"}