@@ -1742,12 +1742,8 @@ RdbStatus elementHash(RdbParser *p) {
1742
1742
1743
1743
switch (ctx -> state ) {
1744
1744
case ST_HASH_HEADER :
1745
- if (p -> currOpcode == RDB_TYPE_HASH_METADATA ) {
1746
- /* digest min HFE expiration time. No need to pass it to handlers
1747
- as each field will report its own expiration time anyway */
1748
- BulkInfo * binfoExpire ;
1749
- IF_NOT_OK_RETURN (rdbLoad (p , 8 , RQ_ALLOC , NULL , & binfoExpire ));
1750
- }
1745
+ if (p -> currOpcode == RDB_TYPE_HASH_METADATA )
1746
+ IF_NOT_OK_RETURN (rdbLoadMillisecTime (p , & ctx -> hash .hexpireMinMsec ));
1751
1747
1752
1748
IF_NOT_OK_RETURN (rdbLoadLen (p , NULL , & (ctx -> hash .numFields ), NULL , NULL ));
1753
1749
@@ -1762,27 +1758,43 @@ RdbStatus elementHash(RdbParser *p) {
1762
1758
BulkInfo * binfoField , * binfoValue ;
1763
1759
1764
1760
while (ctx -> hash .visitingField < ctx -> hash .numFields ) {
1765
- uint64_t expireAt = 0 ;
1766
- if (p -> parsingElement == PE_HASH_META )
1767
- IF_NOT_OK_RETURN (rdbLoadLen (p , NULL , & expireAt , NULL , NULL ));
1761
+ uint64_t val , expireAt = -1 ;
1762
+
1763
+ /* If parsing a hash with metadata, read field's expiration time
1764
+ * (Applicable for opcodes RDB_TYPE_HASH_METADATA and
1765
+ * RDB_TYPE_HASH_METADATA_PRE_GA) */
1766
+ if (p -> parsingElement == PE_HASH_META ) {
1767
+ IF_NOT_OK_RETURN (rdbLoadLen (p , NULL , & val , NULL , NULL ));
1768
+ if (val != 0 ) {
1769
+ if (p -> currOpcode == RDB_TYPE_HASH_METADATA ) {
1770
+ /* Value is relative to minExpire (with +1 to avoid
1771
+ * 0 which indicates no expiration) */
1772
+ expireAt = val + ctx -> hash .hexpireMinMsec - 1 ;
1773
+ } else {
1774
+ /* absolute expiration time */
1775
+ expireAt = val ;
1776
+ }
1777
+ }
1778
+ }
1768
1779
IF_NOT_OK_RETURN (rdbLoadString (p , RQ_ALLOC_APP_BULK , NULL , & binfoField ));
1769
1780
IF_NOT_OK_RETURN (rdbLoadString (p , RQ_ALLOC_APP_BULK , NULL , & binfoValue ));
1770
1781
1771
1782
/*** ENTER SAFE STATE ***/
1772
1783
1773
1784
registerAppBulkForNextCb (p , binfoField );
1774
1785
registerAppBulkForNextCb (p , binfoValue );
1786
+
1775
1787
if (p -> elmCtx .key .handleByLevel == RDB_LEVEL_STRUCT ) {
1776
1788
CALL_HANDLERS_CB (p , NOP , RDB_LEVEL_STRUCT , rdbStruct .handleHashPlain ,
1777
1789
binfoField -> ref ,
1778
1790
binfoValue -> ref ,
1779
- ( expireAt ) ? ( int64_t ) expireAt : -1 );
1791
+ expireAt );
1780
1792
}
1781
1793
else {
1782
1794
CALL_HANDLERS_CB (p , NOP , RDB_LEVEL_DATA , rdbData .handleHashField ,
1783
1795
binfoField -> ref ,
1784
1796
binfoValue -> ref ,
1785
- ( expireAt ) ? ( int64_t ) expireAt : -1 );
1797
+ expireAt );
1786
1798
}
1787
1799
++ ctx -> hash .visitingField ;
1788
1800
0 commit comments