diff --git a/src/object.cpp b/src/object.cpp index ce6265ad1..e7f053a24 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -1302,6 +1302,10 @@ NULL * because we update the access time only * when the key is read or overwritten. */ addReplyLongLong(c,LFUDecrAndReturn(o)); + } else if (!strcasecmp(szFromObj(c->argv[1]), "lastmodified") && c->argc == 3) { + if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.null[c->resp])) + == NULL) return; + addReplyLongLong(c, (g_pserver->mstime - (o->mvcc_tstamp >> MVCC_MS_SHIFT)) / 1000); } else { addReplySubcommandSyntaxError(c); } diff --git a/src/server.cpp b/src/server.cpp index b72d7e118..c33ff389b 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -4988,7 +4988,7 @@ void incrementMvccTstamp() { uint64_t msPrev; __atomic_load(&g_pserver->mvcc_tstamp, &msPrev, __ATOMIC_ACQUIRE); - msPrev >>= 20; // convert to milliseconds + msPrev >>= MVCC_MS_SHIFT; // convert to milliseconds long long mst; __atomic_load(&g_pserver->mstime, &mst, __ATOMIC_RELAXED); @@ -4998,7 +4998,7 @@ void incrementMvccTstamp() } else { - atomicSet(g_pserver->mvcc_tstamp, ((uint64_t)g_pserver->mstime) << 20); + atomicSet(g_pserver->mvcc_tstamp, ((uint64_t)g_pserver->mstime) << MVCC_MS_SHIFT); } } diff --git a/src/server.h b/src/server.h index 2f6dcd69a..bd2b43fbc 100644 --- a/src/server.h +++ b/src/server.h @@ -722,6 +722,8 @@ typedef struct RedisModuleDigest { #define OBJ_SHARED_REFCOUNT (0x7FFFFFFF) #define OBJ_MVCC_INVALID (0xFFFFFFFFFFFFFFFFULL) +#define MVCC_MS_SHIFT 20 + typedef struct redisObject { unsigned type:4; unsigned encoding:4;