use INVALID_EXPIRE instead of -1

Former-commit-id: 9e45984a97a293d87474f87612204a24c831a343
This commit is contained in:
malavan 2021-07-14 22:13:29 +00:00
parent 9b201b31c3
commit 3a379f0934
7 changed files with 36 additions and 29 deletions

View File

@ -5425,11 +5425,11 @@ try_again:
for (j = 0; j < num_keys; j++) { for (j = 0; j < num_keys; j++) {
long long ttl = 0; long long ttl = 0;
expireEntry *pexpire = getExpire(c->db,kv[j]); expireEntry *pexpire = getExpire(c->db,kv[j]);
long long expireat = -1; long long expireat = INVALID_EXPIRE;
if (pexpire != nullptr) if (pexpire != nullptr)
pexpire->FGetPrimaryExpire(&expireat); pexpire->FGetPrimaryExpire(&expireat);
if (expireat != -1) { if (expireat != INVALID_EXPIRE) {
ttl = expireat-mstime(); ttl = expireat-mstime();
if (ttl < 0) { if (ttl < 0) {
continue; continue;

View File

@ -1626,7 +1626,7 @@ int keyIsExpired(redisDb *db, robj *key) {
/* Don't expire anything while loading. It will be done later. */ /* Don't expire anything while loading. It will be done later. */
if (g_pserver->loading) return 0; if (g_pserver->loading) return 0;
long long when = pexpire->whenFull(); long long when = pexpire->FGetPrimaryExpire();
if (when == INVALID_EXPIRE) if (when == INVALID_EXPIRE)
return 0; return 0;

View File

@ -128,7 +128,7 @@ void xorObjectDigest(redisDb *db, robj_roptr keyobj, unsigned char *digest, robj
uint32_t aux = htonl(o->type); uint32_t aux = htonl(o->type);
mixDigest(digest,&aux,sizeof(aux)); mixDigest(digest,&aux,sizeof(aux));
expireEntry *pexpire = getExpire(db,keyobj); expireEntry *pexpire = getExpire(db,keyobj);
long long expiretime = -1; long long expiretime = INVALID_EXPIRE;
char buf[128]; char buf[128];
if (pexpire != nullptr) if (pexpire != nullptr)
@ -260,7 +260,7 @@ void xorObjectDigest(redisDb *db, robj_roptr keyobj, unsigned char *digest, robj
serverPanic("Unknown object type"); serverPanic("Unknown object type");
} }
/* If the key has an expire, add it to the mix */ /* If the key has an expire, add it to the mix */
if (expiretime != -1) xorDigest(digest,"!!expire!!",10); if (expiretime != INVALID_EXPIRE) xorDigest(digest,"!!expire!!",10);
} }
/* Compute the dataset digest. Since keys, sets elements, hashes elements /* Compute the dataset digest. Since keys, sets elements, hashes elements

View File

@ -668,7 +668,7 @@ void pexpireatCommand(client *c) {
/* Implements TTL and PTTL */ /* Implements TTL and PTTL */
void ttlGenericCommand(client *c, int output_ms) { void ttlGenericCommand(client *c, int output_ms) {
long long expire = -1, ttl = -1; long long expire = INVALID_EXPIRE, ttl = -1;
/* If the key does not exist at all, return -2 */ /* If the key does not exist at all, return -2 */
if (lookupKeyReadWithFlags(c->db,c->argv[1],LOOKUP_NOTOUCH) == nullptr) { if (lookupKeyReadWithFlags(c->db,c->argv[1],LOOKUP_NOTOUCH) == nullptr) {
@ -702,7 +702,7 @@ void ttlGenericCommand(client *c, int output_ms) {
} }
if (expire != -1) { if (expire != INVALID_EXPIRE) {
ttl = expire-mstime(); ttl = expire-mstime();
if (ttl < 0) ttl = 0; if (ttl < 0) ttl = 0;
} }

View File

@ -34,14 +34,7 @@ public:
~expireEntryFat(); ~expireEntryFat();
long long when() const noexcept { return m_vecexpireEntries.front().when; } long long when() const noexcept { return m_vecexpireEntries.front().when; }
long long whenFull() const noexcept {
for (size_t i = 0; i < size(); ++i) {
if (m_vecexpireEntries[i].spsubkey == nullptr) {
return m_vecexpireEntries[i].when;
}
}
return INVALID_EXPIRE;
}
const char *key() const noexcept { return m_keyPrimary; } const char *key() const noexcept { return m_keyPrimary; }
bool operator<(long long when) const noexcept { return this->when() < when; } bool operator<(long long when) const noexcept { return this->when() < when; }
@ -120,7 +113,10 @@ public:
expireEntry(expireEntryFat *pfatentry) expireEntry(expireEntryFat *pfatentry)
{ {
u.m_pfatentry = pfatentry; u.m_pfatentry = pfatentry;
m_when = FFatMask() | pfatentry->whenFull(); if (FGetPrimaryExpireSlow(&m_when))
m_when = FFatMask() | m_when;
else
m_when = INVALID_EXPIRE;
} }
expireEntry(expireEntry &&e) expireEntry(expireEntry &&e)
@ -173,11 +169,7 @@ public:
{ {
if (FFat()) if (FFat())
return u.m_pfatentry->when(); return u.m_pfatentry->when();
return whenFull(); return FGetPrimaryExpire();
}
long long whenFull() const noexcept
{
return m_when & (~FFatMask());
} }
void update(const char *subkey, long long when) void update(const char *subkey, long long when)
@ -221,12 +213,27 @@ public:
pfatentry()->m_vecexpireEntries.begin() + itr.m_idx); pfatentry()->m_vecexpireEntries.begin() + itr.m_idx);
} }
bool FGetPrimaryExpire(long long *pwhen) long long FGetPrimaryExpire() const noexcept
{
return m_when & (~FFatMask());
}
bool FGetPrimaryExpire(long long *pwhen) const noexcept
{
*pwhen = FGetPrimaryExpire();
return *pwhen != INVALID_EXPIRE;
}
bool FGetPrimaryExpireSlow(long long *pwhen)
{ {
*pwhen = -1; *pwhen = INVALID_EXPIRE;
if (this->whenFull() != INVALID_EXPIRE) { for (auto itr : *this)
*pwhen = this->whenFull(); {
return true; if (itr.subkey() == nullptr)
{
*pwhen = itr.when();
return true;
}
} }
return false; return false;
} }

View File

@ -2264,11 +2264,11 @@ int RM_UnlinkKey(RedisModuleKey *key) {
* REDISMODULE_NO_EXPIRE is returned. */ * REDISMODULE_NO_EXPIRE is returned. */
mstime_t RM_GetExpire(RedisModuleKey *key) { mstime_t RM_GetExpire(RedisModuleKey *key) {
expireEntry *pexpire = getExpire(key->db,key->key); expireEntry *pexpire = getExpire(key->db,key->key);
mstime_t expire = -1; mstime_t expire = INVALID_EXPIRE;
if (pexpire != nullptr) if (pexpire != nullptr)
pexpire->FGetPrimaryExpire(&expire); pexpire->FGetPrimaryExpire(&expire);
if (expire == -1 || key->value == NULL) if (expire == INVALID_EXPIRE || key->value == NULL)
return REDISMODULE_NO_EXPIRE; return REDISMODULE_NO_EXPIRE;
expire -= mstime(); expire -= mstime();
return expire >= 0 ? expire : 0; return expire >= 0 ? expire : 0;

View File

@ -1101,7 +1101,7 @@ int rdbSaveKeyValuePair(rio *rdb, robj *key, robj *val, expireEntry *pexpire) {
int savelfu = g_pserver->maxmemory_policy & MAXMEMORY_FLAG_LFU; int savelfu = g_pserver->maxmemory_policy & MAXMEMORY_FLAG_LFU;
/* Save the expire time */ /* Save the expire time */
long long expiretime = -1; long long expiretime = INVALID_EXPIRE;
if (pexpire != nullptr && pexpire->FGetPrimaryExpire(&expiretime)) { if (pexpire != nullptr && pexpire->FGetPrimaryExpire(&expiretime)) {
if (rdbSaveType(rdb,RDB_OPCODE_EXPIRETIME_MS) == -1) return -1; if (rdbSaveType(rdb,RDB_OPCODE_EXPIRETIME_MS) == -1) return -1;
if (rdbSaveMillisecondTime(rdb,expiretime) == -1) return -1; if (rdbSaveMillisecondTime(rdb,expiretime) == -1) return -1;