jayprakashstar
jayprakashstar

Reputation: 395

Why I keep getting this error " Wrong number of args calling Redis command From Lua script" even I get desired output

I trying to execute this lua script i get proper output too. But i keep getting Wrong number of args calling Redis command From Lua script

def new_get_following(self, start, count, user_id=0):
        script = """
        local envs = redis.call('zrevrange',KEYS[1],ARGV[3],ARGV[4]);
        redis.call('sadd',ARGV[1],unpack(envs));
        local favs = redis.call('sinter',ARGV[2],ARGV[1]);
        local acts= redis.call('mget',unpack(envs));
        redis.call('del',ARGV[1]);
        return {favs,envs,acts}
        """
        count = int(start) + int(count) - 1
        print count
        fav_key = self.fav_key + ":" + str(user_id)
        following_stream_key = self.following_stream_key + ":" + str(user_id)
        tmp_key = int(time.time())
        return self.exectute(script, args=[tmp_key, fav_key, start, count], keys=[following_stream_key])

Upvotes: 3

Views: 6352

Answers (2)

jayprakashstar
jayprakashstar

Reputation: 395

In the code last line is causing error.

local envs = redis.call('zrevrange',KEYS[1],ARGV[3],ARGV[4]);
local acts= redis.call('mget',unpack(envs));

As if envs is empty table then second line:

local acts= redis.call('mget',unpack(envs));

becomes this:

local acts= redis.call('mget',unpack());

so lua keeps throwing error. For avoid this error we can use redis.pacall which gives Response error object which can be checked in output can handle error. So final code should be

def new_get_following(self, start, count, user_id=0):
        script = """
        local envs = redis.call('zrevrange',KEYS[1],ARGV[3],ARGV[4]);
        redis.call('sadd',ARGV[1],unpack(envs));
        local favs = redis.call('sinter',ARGV[2],ARGV[1]);
        local acts= redis.pcall('mget',unpack(envs));
        redis.call('del',ARGV[1]);
        return {favs,envs,acts}
        """
        count = int(start) + int(count) - 1
        print count
        fav_key = self.fav_key + ":" + str(user_id)
        following_stream_key = self.following_stream_key + ":" + str(user_id)
        tmp_key = int(time.time())
        return self.exectute(script, args=[tmp_key, fav_key, start, count], keys=[following_stream_key])

Upvotes: 1

Ignacio
Ignacio

Reputation: 1124

Maybe it is just a typo and has already been corrected but:

self.exectute shouldn't it be self.execute?

Upvotes: 2

Related Questions