diff --git a/src/cfg.cc b/src/cfg.cc
index 4e01437ac4a218e00301101c1aeab6db0ca4a6fa..81b4b6b43d4c94a6480dfd0459d77cf6daae4ff4 100644
--- a/src/cfg.cc
+++ b/src/cfg.cc
@@ -52,22 +52,27 @@ cfg_geti(const char *param)
 	return val;
 }
 
-const char *
-cfg_gets(const char *param)
+static const char *
+cfg_converts(struct lua_State *L)
 {
-	/* Support simultaneous cfg_gets("str1") and cfg_gets("str2") */
 	static char __thread values[MAX_STR_OPTS][MAX_OPT_VAL_LEN];
 	static int __thread i = 0;
-	struct lua_State *L = tarantool_L;
-	char *val;
-	cfg_get(param);
 	if (lua_isnil(L, -1))
-		val = NULL;
+		return NULL;
 	else {
-		val = values[i++ % MAX_STR_OPTS];
-		snprintf(val, MAX_OPT_VAL_LEN, "%s", lua_tostring(L, -1));
+		snprintf(values[i % MAX_STR_OPTS], MAX_OPT_VAL_LEN,
+			 "%s", lua_tostring(L, -1));
+		return values[i++ % MAX_STR_OPTS];
 	}
-	lua_pop(L, 1);
+}
+
+const char *
+cfg_gets(const char *param)
+{
+	/* Support simultaneous cfg_gets("str1") and cfg_gets("str2") */
+	cfg_get(param);
+	const char *val = cfg_converts(tarantool_L);
+	lua_pop(tarantool_L, 1);
 	return val;
 }
 
@@ -80,3 +85,24 @@ cfg_getd(const char *param)
 	return val;
 }
 
+int
+cfg_getarr_size(const char *name)
+{
+	cfg_get(name);
+	luaL_checktype(tarantool_L, -1, LUA_TTABLE);
+	int result = luaL_getn(tarantool_L, -1);
+	lua_pop(tarantool_L, 1);
+	return result;
+}
+
+const char *
+cfg_getarr_elem(const char *name, int i)
+{
+	cfg_get(name);
+	luaL_checktype(tarantool_L, -1, LUA_TTABLE);
+	lua_rawgeti(tarantool_L, -1, i + 1);
+	const char *val = cfg_converts(tarantool_L);
+	lua_pop(tarantool_L, 2);
+	return val;
+}
+
diff --git a/src/cfg.h b/src/cfg.h
index 7bdefc022367aa471bc0ea2fe118b05b88fefff7..586f50628dcbb0efa76b799ef21bee431832269e 100644
--- a/src/cfg.h
+++ b/src/cfg.h
@@ -36,4 +36,11 @@ cfg_gets(const char *param);
 
 double
 cfg_getd(const char *param);
+
+int
+cfg_getarr_size(const char *name);
+
+const char *
+cfg_getarr_elem(const char *name, int i);
+
 #endif /* INCLUDES_TARANTOOL_CFG_H */