summaryrefslogtreecommitdiffstats
path: root/valkey-loadmod.patch
blob: 3341863b5f93d160dfe3de7d2632e57e7ed589e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
Adapted for 8.1.4 from
https://github.com/valkey-io/valkey/pull/2689

diff -up ./src/config.c.loadmod ./src/config.c
--- ./src/config.c.loadmod	2025-10-03 21:17:43.000000000 +0200
+++ ./src/config.c	2025-10-06 03:06:41.774448336 +0200
@@ -438,6 +438,8 @@ static int updateClientOutputBufferLimit
  * within conf file parsing. This is only needed to support the deprecated
  * abnormal aggregate `save T C` functionality. Remove in the future. */
 static int reading_config_file;
+/* support detecting include vs main config file */
+static int reading_include_file = 0;
 
 void loadServerConfigFromString(char *config) {
     deprecatedConfig deprecated_configs[] = {
@@ -529,7 +531,9 @@ void loadServerConfigFromString(char *co
 
         /* Execute config directives */
         if (!strcasecmp(argv[0], "include") && argc == 2) {
+            reading_include_file = 1;
             loadServerConfig(argv[1], 0, NULL);
+            reading_include_file = 0;
         } else if (!strcasecmp(argv[0], "rename-command") && argc == 3) {
             struct serverCommand *cmd = lookupCommandBySds(argv[1]);
 
@@ -562,7 +566,7 @@ void loadServerConfigFromString(char *co
                 goto loaderr;
             }
         } else if (!strcasecmp(argv[0], "loadmodule") && argc >= 2) {
-            moduleEnqueueLoadModule(argv[1], &argv[2], argc - 2);
+            moduleEnqueueLoadModule(argv[1], &argv[2], argc - 2, reading_include_file);
         } else if (strchr(argv[0], '.')) {
             if (argc < 2) {
                 err = "Module config specified without value";
@@ -1579,7 +1583,7 @@ void rewriteConfigLoadmoduleOption(struc
     while ((de = dictNext(di)) != NULL) {
         struct ValkeyModule *module = dictGetVal(de);
         line = moduleLoadQueueEntryToLoadmoduleOptionStr(module, "loadmodule");
-        rewriteConfigRewriteLine(state, "loadmodule", line, 1);
+        if (line) rewriteConfigRewriteLine(state, "loadmodule", line, 1);
     }
     dictReleaseIterator(di);
     /* Mark "loadmodule" as processed in case modules is empty. */
diff -up ./src/module.c.loadmod ./src/module.c
--- ./src/module.c.loadmod	2025-10-03 21:17:43.000000000 +0200
+++ ./src/module.c	2025-10-06 03:05:36.498290506 +0200
@@ -83,6 +83,7 @@
 
 struct moduleLoadQueueEntry {
     sds path;
+    int from_include;
     int argc;
     robj **argv;
 };
@@ -669,7 +670,7 @@ void freeClientModuleData(client *c) {
     c->module_data = NULL;
 }
 
-void moduleEnqueueLoadModule(sds path, sds *argv, int argc) {
+void moduleEnqueueLoadModule(sds path, sds *argv, int argc, int from_include) {
     int i;
     struct moduleLoadQueueEntry *loadmod;
 
@@ -677,6 +678,7 @@ void moduleEnqueueLoadModule(sds path, s
     loadmod->argv = argc ? zmalloc(sizeof(robj *) * argc) : NULL;
     loadmod->path = sdsnew(path);
     loadmod->argc = argc;
+    loadmod->from_include = from_include;
     for (i = 0; i < argc; i++) {
         loadmod->argv[i] = createRawStringObject(argv[i], sdslen(argv[i]));
     }
@@ -687,6 +689,10 @@ sds moduleLoadQueueEntryToLoadmoduleOpti
                                               const char *config_option_str) {
     sds line;
 
+    if (module->loadmod->from_include) {
+        /* no need to add as already from config */
+        return NULL;
+    }
     line = sdsnew(config_option_str);
     line = sdscatlen(line, " ", 1);
     line = sdscatsds(line, module->loadmod->path);
@@ -12188,7 +12194,7 @@ void moduleLoadFromQueue(void) {
     listRewind(server.loadmodule_queue, &li);
     while ((ln = listNext(&li))) {
         struct moduleLoadQueueEntry *loadmod = ln->value;
-        if (moduleLoad(loadmod->path, (void **)loadmod->argv, loadmod->argc, 0) == C_ERR) {
+        if (moduleLoad(loadmod->path, (void **)loadmod->argv, loadmod->argc, 0, loadmod->from_include) == C_ERR) {
             serverLog(LL_WARNING, "Can't load module from %s: server aborting", loadmod->path);
             exit(1);
         }
@@ -12369,7 +12375,7 @@ void moduleUnregisterCleanup(ValkeyModul
 
 /* Load a module and initialize it. On success C_OK is returned, otherwise
  * C_ERR is returned. */
-int moduleLoad(const char *path, void **module_argv, int module_argc, int is_loadex) {
+int moduleLoad(const char *path, void **module_argv, int module_argc, int is_loadex, int from_include) {
     int (*onload)(void *, void **, int);
     void *handle;
 
@@ -12444,6 +12450,7 @@ int moduleLoad(const char *path, void **
     ctx.module->loadmod->path = sdsnew(path);
     ctx.module->loadmod->argv = module_argc ? zmalloc(sizeof(robj *) * module_argc) : NULL;
     ctx.module->loadmod->argc = module_argc;
+    ctx.module->loadmod->from_include = from_include;
     for (int i = 0; i < module_argc; i++) {
         ctx.module->loadmod->argv[i] = module_argv[i];
         incrRefCount(ctx.module->loadmod->argv[i]);
@@ -13361,7 +13368,7 @@ void moduleCommand(client *c) {
             argv = &c->argv[3];
         }
 
-        if (moduleLoad(c->argv[2]->ptr, (void **)argv, argc, 0) == C_OK)
+        if (moduleLoad(c->argv[2]->ptr, (void **)argv, argc, 0, 0) == C_OK)
             addReply(c, shared.ok);
         else
             addReplyError(c, "Error loading the extension. Please check the server logs.");
@@ -13376,7 +13383,7 @@ void moduleCommand(client *c) {
         /* If this is a loadex command we want to populate server.module_configs_queue with
          * sds NAME VALUE pairs. We also want to increment argv to just after ARGS, if supplied. */
         if (parseLoadexArguments((ValkeyModuleString ***)&argv, &argc) == VALKEYMODULE_OK &&
-            moduleLoad(c->argv[2]->ptr, (void **)argv, argc, 1) == C_OK)
+            moduleLoad(c->argv[2]->ptr, (void **)argv, argc, 1, 0) == C_OK)
             addReply(c, shared.ok);
         else {
             dictEmpty(server.module_configs_queue, NULL);
diff -up ./src/module.h.loadmod ./src/module.h
--- ./src/module.h.loadmod	2025-10-03 21:17:43.000000000 +0200
+++ ./src/module.h	2025-10-06 03:05:36.498698194 +0200
@@ -169,7 +169,7 @@ static inline void moduleInitDigestConte
     memset(mdvar->x, 0, sizeof(mdvar->x));
 }
 
-void moduleEnqueueLoadModule(sds path, sds *argv, int argc);
+void moduleEnqueueLoadModule(sds path, sds *argv, int argc, int from_include);
 sds moduleLoadQueueEntryToLoadmoduleOptionStr(ValkeyModule *module,
                                               const char *config_option_str);
 ValkeyModuleCtx *moduleAllocateContext(void);
@@ -180,7 +180,7 @@ void moduleFreeContext(ValkeyModuleCtx *
 void moduleInitModulesSystem(void);
 void moduleInitModulesSystemLast(void);
 void modulesCron(void);
-int moduleLoad(const char *path, void **argv, int argc, int is_loadex);
+int moduleLoad(const char *path, void **argv, int argc, int is_loadex, int from_include);
 int moduleUnload(sds name, const char **errmsg);
 void moduleLoadFromQueue(void);
 int moduleGetCommandKeysViaAPI(struct serverCommand *cmd, robj **argv, int argc, getKeysResult *result);