Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add API UpdateRuntimeArgs for updating the module arguments during runtime #1041

Merged
merged 13 commits into from
Dec 5, 2024

Conversation

hwware
Copy link
Member

@hwware hwware commented Sep 17, 2024

Before Redis OSS 7, if we load a module with some arguments during runtime,
and run the command "config rewrite", the module information will not be saved into the
config file.

Since Redis OSS 7 and Valkey 7.2, if we load a module with some arguments during runtime,
the module information (path, arguments number, and arguments value) can be saved into the config file after config rewrite command is called.
Thus, the module will be loaded automatically when the server startup next time.

Following is one example:

bind 172.25.0.58
port 7000
protected-mode no
enable-module-command yes

Generated by CONFIG REWRITE
latency-tracking-info-percentiles 50 99 99.9
dir "/home/ubuntu/valkey"
save 3600 1 300 100 60 10000
user default on nopass sanitize-payload ~* &* +https://github.com/ALL
loadmodule tests/modules/datatype.so 10 20

However, there is one problem.
If developers write a module, and update the running arguments by someway, the updated arguments can not be saved into the config file even "config rewrite" is called.
The reason comes from the following function
rewriteConfigLoadmoduleOption (src/config.c)

void rewriteConfigLoadmoduleOption(struct rewriteConfigState *state) {
..........
struct ValkeyModule *module = dictGetVal(de);
line = sdsnew("loadmodule ");
line = sdscatsds(line, module->loadmod->path);
for (int i = 0; i < module->loadmod->argc; i++) {
line = sdscatlen(line, " ", 1);
line = sdscatsds(line, module->loadmod->argv[i]->ptr);
}
rewriteConfigRewriteLine(state, "loadmodule", line, 1);
.......
}

The function only save the initial arguments information (module->loadmod) into the configfile.

After core members discuss, ref #1177

We decide add the following API to implement this feature:

Original proposal:

int VM_UpdateRunTimeArgs(ValkeyModuleCtx *ctx, int index, char *value);

Updated proposal:

ValkeyModuleString **values VM_GetRuntimeArgs(ValkeyModuleCtx *ctx);
**int VM_UpdateRuntimeArgs(ValkeyModuleCtx *ctx, int argc, ValkeyModuleString **values);

Why we do not recommend the following way:

MODULE UNLOAD
Update module args in the conf file
MODULE LOAD

I think there are the following disadvantages:

  1. Some modules can not be unloaded. Such as the example module datatype.so, which is tests/modules/datatype.so
  2. it is not atomic operation for MODULE UNLOAD + MODULE LOAD
  3. sometimes, if we just run the module unload, the client business could be interrupted

@hwware hwware force-pushed the update-module-parameter-runtime branch from c52d35c to c3341b1 Compare September 17, 2024 17:45
Copy link

codecov bot commented Sep 17, 2024

Codecov Report

Attention: Patch coverage is 8.33333% with 11 lines in your changes missing coverage. Please review.

Project coverage is 70.86%. Comparing base (a401e37) to head (263b276).
Report is 1 commits behind head on unstable.

Files with missing lines Patch % Lines
src/module.c 8.33% 11 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff              @@
##           unstable    #1041      +/-   ##
============================================
+ Coverage     70.69%   70.86%   +0.16%     
============================================
  Files           118      118              
  Lines         63549    63561      +12     
============================================
+ Hits          44924    45040     +116     
+ Misses        18625    18521     -104     
Files with missing lines Coverage Δ
src/module.c 9.64% <8.33%> (-0.01%) ⬇️

... and 15 files with indirect coverage changes

@hwware hwware force-pushed the update-module-parameter-runtime branch 2 times, most recently from 3bb1f12 to 9884508 Compare September 24, 2024 00:37
@hwware hwware force-pushed the update-module-parameter-runtime branch from 9884508 to 8a9d80e Compare September 26, 2024 00:37
@zuiderkwast
Copy link
Contributor

Looks simple, but what's the use case? Why does a module need to update args in runtime?

A module can already have config that is updated using CONFIG SET, right?

@hwware hwware force-pushed the update-module-parameter-runtime branch 2 times, most recently from eb9712a to fbc66dd Compare October 14, 2024 00:43
@hwware hwware force-pushed the update-module-parameter-runtime branch from 5038d52 to ed24ce1 Compare October 14, 2024 13:21
@zuiderkwast zuiderkwast added the major-decision-pending Major decision pending by TSC team label Oct 14, 2024
@hwware hwware changed the title Add Module set-argument command for updating module parameter during rumtime Add Module set-argument command for updating module parameter and use them by GetRunTimeArgs during rumtime Oct 15, 2024
@hwware
Copy link
Member Author

hwware commented Oct 15, 2024

@zuiderkwast I update the top description for this PR, i think this is a good way to access the updated module arguments. Pls take a look when you have time, Thanks a lot

@zuiderkwast
Copy link
Contributor

zuiderkwast commented Oct 15, 2024

You added a module API to access the argv. Interesting.

But, I am not convinced. :)

In a program written in C, the arguments are passed to main as int main(int argc, char **argv). It's not possible to change these args later, from outside the program, while the program is running.

The argv for MODULE LOAD is the same. If you set the arguments with MODULE SET-ARGUMENTS later, the module was still loaded with the old arguments and most modules (or new modules like valkey-bloom) will not notice the arguments have changed. But there will be a problem. In the log, it looks like the module is using the new arguments, even if it is using the old arguments.

MODULE UNLOAD + MODULE LOAD doesn't have this problem.

@hwware hwware force-pushed the update-module-parameter-runtime branch from ed24ce1 to 50aa816 Compare October 16, 2024 01:03
@hwware
Copy link
Member Author

hwware commented Oct 16, 2024

You added a module API to access the argv. Interesting.

But, I am not convinced. :)

In a program written in C, the arguments are passed to main as int main(int argc, char **argv). It's not possible to change these args later, from outside the program, while the program is running.

The argv for MODULE LOAD is the same. If you set the arguments with MODULE SET-ARGUMENTS later, the module was still loaded with the old arguments and most modules (or new modules like valkey-bloom) will not notice the arguments have changed. But there will be a problem. In the log, it looks like the module is using the new arguments, even if it is using the old arguments.

MODULE UNLOAD + MODULE LOAD doesn't have this problem.

Thanks for your comment, but some cons for operation MODULE UNLOAD + MODULE LOAD

  1. some modules maybe not unloaded. Such as the example module datatype.so, which is tests/modules/datatype.so
  2. it is not atomic operation for MODULE UNLOAD + MODULE LOAD
  3. sometimes, if we just run the module unload, the client business could be interrupted
  4. through the way MODULE UNLOAD + MODULE LOAD to update module runtime args, the management plan and data plan software need to be updated as well.

I would like to create an issue to let community to discuss this problem. Thanks

@hwware hwware force-pushed the update-module-parameter-runtime branch from 50aa816 to e313f86 Compare October 22, 2024 03:16
@hwware hwware force-pushed the update-module-parameter-runtime branch 2 times, most recently from 0caa3bd to 69c5083 Compare October 31, 2024 02:25
@hwware hwware changed the title Add Module set-argument command for updating module parameter and use them by GetRunTimeArgs during rumtime Update the module args during runtime and save the new args value into the conf file Oct 31, 2024
@hwware hwware force-pushed the update-module-parameter-runtime branch from 69c5083 to b4d698d Compare October 31, 2024 06:49
@hwware hwware changed the title Update the module args during runtime and save the new args value into the conf file Add API UpdateRuntimeArgs to allow the module arguments during runtime and save the new arguments value into the conf file Oct 31, 2024
@hwware
Copy link
Member Author

hwware commented Oct 31, 2024

@madolson As we discussed, I desgin the API as int VM_UpdateRuntimeArgs(ValkeyModuleCtx *ctx, int argc, ValkeyModuleString **argv), please take a look, Thanks

src/module.c Outdated Show resolved Hide resolved
@hwware hwware force-pushed the update-module-parameter-runtime branch from b4d698d to c35a618 Compare November 1, 2024 00:57
Copy link
Contributor

@zuiderkwast zuiderkwast left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me. Only documentation comment missing.

What about VM_GetRuntimeArgs, is it not needed?

src/module.c Outdated Show resolved Hide resolved
tests/unit/moduleapi/moduleconfigs.tcl Outdated Show resolved Hide resolved
src/redismodule.h Outdated Show resolved Hide resolved
@hwware hwware force-pushed the update-module-parameter-runtime branch from d62c9cd to a117ce9 Compare November 8, 2024 09:05
@hwware hwware force-pushed the update-module-parameter-runtime branch from 357fa75 to aa2ba36 Compare November 22, 2024 19:51
@hwware hwware force-pushed the update-module-parameter-runtime branch from 158477e to 05deaf2 Compare November 22, 2024 21:34
@hwware
Copy link
Member Author

hwware commented Nov 22, 2024

I update some logic in module.c, now it works well. @zuiderkwast

@hwware hwware force-pushed the update-module-parameter-runtime branch from 05deaf2 to fc31906 Compare November 22, 2024 21:55
Copy link
Contributor

@zuiderkwast zuiderkwast left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, now it looks better. Before, it couldn't work. :D

Just some small comment now, then ready to merge I think.

src/module.c Outdated Show resolved Hide resolved
tests/unit/moduleapi/moduleconfigs.tcl Outdated Show resolved Hide resolved
@hwware hwware force-pushed the update-module-parameter-runtime branch from 9de9f2a to b014eb2 Compare November 29, 2024 18:47
@hwware hwware changed the title Add API UpdateRuntimeArgs to allow the module arguments during runtime and save the new arguments value into the conf file Add API UpdateRuntimeArgs for updating the module arguments during runtime Nov 29, 2024
Copy link
Contributor

@zuiderkwast zuiderkwast left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@hwware hwware added major-decision-approved Major decision approved by TSC team and removed major-decision-pending Major decision pending by TSC team labels Dec 5, 2024
@hwware hwware force-pushed the update-module-parameter-runtime branch from b014eb2 to 263b276 Compare December 5, 2024 16:43
@hwware hwware merged commit 71560a2 into valkey-io:unstable Dec 5, 2024
48 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
major-decision-approved Major decision approved by TSC team
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

[NEW]Update the module args during runtime and save the new args value into the conf file
4 participants