Commit b1c2e1a1 authored by antirez's avatar antirez
Browse files

Fix two bugs in moduleTypeLookupModuleByID().

The function cache was not working at all, and the function returned
wrong values if there where two or more modules exporting native data
types.

See issue #4131 for more details.
parent b80e4670
...@@ -2680,7 +2680,7 @@ moduleType *moduleTypeLookupModuleByID(uint64_t id) { ...@@ -2680,7 +2680,7 @@ moduleType *moduleTypeLookupModuleByID(uint64_t id) {
/* Search in cache to start. */ /* Search in cache to start. */
int j; int j;
for (j = 0; j < MODULE_LOOKUP_CACHE_SIZE; j++) for (j = 0; j < MODULE_LOOKUP_CACHE_SIZE && cache[j].mt != NULL; j++)
if (cache[j].id == id) return cache[j].mt; if (cache[j].id == id) return cache[j].mt;
/* Slow module by module lookup. */ /* Slow module by module lookup. */
...@@ -2688,17 +2688,20 @@ moduleType *moduleTypeLookupModuleByID(uint64_t id) { ...@@ -2688,17 +2688,20 @@ moduleType *moduleTypeLookupModuleByID(uint64_t id) {
dictIterator *di = dictGetIterator(modules); dictIterator *di = dictGetIterator(modules);
dictEntry *de; dictEntry *de;
while ((de = dictNext(di)) != NULL) { while ((de = dictNext(di)) != NULL && mt == NULL) {
struct RedisModule *module = dictGetVal(de); struct RedisModule *module = dictGetVal(de);
listIter li; listIter li;
listNode *ln; listNode *ln;
listRewind(module->types,&li); listRewind(module->types,&li);
while((ln = listNext(&li))) { while((ln = listNext(&li))) {
mt = ln->value; moduleType *this_mt = ln->value;
/* Compare only the 54 bit module identifier and not the /* Compare only the 54 bit module identifier and not the
* encoding version. */ * encoding version. */
if (mt->id >> 10 == id >> 10) break; if (this_mt->id >> 10 == id >> 10) {
mt = this_mt;
break;
}
} }
} }
dictReleaseIterator(di); dictReleaseIterator(di);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment