Implementing a reload() function (or foo_reload() ?) is of course the correct choice.
Out of the two variable based alternatives, I find foo_reload=1 as somewhat understandable. We originally set out to find the easiest way to implement something, so yes, it is the hackish way. henrik On Sun, Apr 29, 2012 at 5:34 PM, Daniel Nichter <dan...@percona.com> wrote: > Henrik, > > Do you think that foo_reload=1 is redundant because SET GLOBAL foo=@@foo will > always work in any case? > > I think variables like foo_reload are more an abuse of a side effect than > foo=@@foo because foo_reload uses a variable as a toggle switch (vs. just a > simple on/off switch like the _active variables that I have proposed). I > suppose this is ok if we document its semantics, which might be: > > * foo_reload = 0 when the toggle switch is inactive (i.e. foo is not being > reloaded) > * foo_reload = 1 while foo is being reloaded (due to SET GLOBAL foo_reload=1) > * foo_reload returns to 0 once foo has reloaded, whether successfully or not > > Still this seems hackish to me. Perhaps we should do the effort of > implementing a RELOAD function? This might be a better longterm solution > because then we provide reload ability at a higher level so plugin writers > don't have to implement special _reload vars. > > -Daniel > > Le 29 avr. 2012 à 01:51, Henrik Ingo a écrit : > >> Daniel, >> >> I don't like the end user semantics of what you are proposing. It >> looks like you are abusing a side effect of something else. >> >> "something_reload=1" is quite clear what it means. Note that for an >> average mysql/drizzle user even the meaning of the @@var_name syntax >> might be unclear. >> >> henrik >> >> >> On Sat, Apr 28, 2012 at 8:56 AM, Daniel Nichter <dan...@percona.com> wrote: >>> Anshu, >>> >>> My reply is quite late, but the conference and Drizzle Day were both >>> enlightening. I look forward to next year. >>> >>> As for updating files, I think there's a simpler, more direct approach: >>> >>> SET GLOBAL regex_policy_policy=@@regex_policy_policy; >>> >>> That sets the var to its current value which triggers the plugin's update >>> hook and since the new value == the old value, the result is simply to >>> reload the file. >>> >>> This avoid having two code paths: one for SET >>> GLOBAL regex_policy_policy="new-file" and another for SET >>> GLOBAL regex_policy_reload=1 (which would eventually call the same code as >>> the first statement). >>> >>> Thoughts on this (you and anyone else)? >>> >>> -Daniel >>> >>> Le 17 avr. 2012 à 15:09, Anshu Kumar a écrit : >>> >>> Hi Daniel, >>> How was the conference and drizzle day? >>> Coming to the point, after brainstorming the possibilities that I have in >>> the issue of making regex policy plugin dynamic, I think that the solution I >>> proposed in my last mail is best for now. And using that we wont need any >>> issue handling with if the policy file was not correct or change in the look >>> and feel of some specific plugins. From coding point of view, we can do this >>> by adding an option of reload variable which will default be set to false. >>> Upon making it true, it will trigger a function which will create a separate >>> instance of policy and will call loadfile on it. If the call is a success, >>> we will remove all old policies and reload the system with new ones. And if >>> the call gives some error message then do nothing. After both the cases, the >>> function will change the reload variable to false. This way we wont need any >>> separate threads also. >>> Waiting for your review comments to start working on this. >>> >>> On Wed, Apr 4, 2012 at 2:55 PM, Anshu Kumar <ansharyan...@gmail.com> wrote: >>>> >>>> Hey Daniel, >>>> After reading your views, I too think now that auto reloading is not the >>>> ideal solution to this scenario. In this solution I have used the idea of >>>> thread for reloading the policy files. You put a point that what if admin >>>> is >>>> using a ext editor which auto saves the changes after some fixed time. In >>>> that case incorrect policies may be read. >>>> >>>> For this issue, instead of using a thread, we can come up with a solution >>>> in which the reloading won't be dynamic. So it would be like, if you are an >>>> admin and you want to change the policy file, do it. After all changes are >>>> done, just change the value of regex_policy_reload to true and policies >>>> will >>>> then be reloaded. After policies are reloaded, the value of >>>> regex_policy_reload will again be set to false from code itself. In this >>>> way, it can be ensured that only the correct policies are loaded there. It >>>> is true that here too anyone can change the status of regex_policy_reload >>>> to >>>> true, so either don't let him access the policy file or we will be needing >>>> an authorization system for changing global variables too. >>>> >>>> Brainstorming further for the most optimal solution. Comment and >>>> suggestions are welcome. >>>> >>>> About the name concern, I use Ansh as my nick. Both are correct. You can >>>> call me anything you like. However changing my sign to 'Anshu', so that it >>>> don't cause any further confusion to anyone. :) >>>> >>>> On Wed, Apr 4, 2012 at 1:40 PM, Henrik Ingo <henrik.i...@avoinelama.fi> >>>> wrote: >>>>> >>>>> Daniel >>>>> >>>>> FWIW, I think you might be correct. I originally thought that >>>>> auto-reloading would be an easy way to implement a way to re-read the >>>>> policy >>>>> file. For instance, it could be implemented crudely without any new >>>>> configuration options and no new threads needing to launch. However, as >>>>> we've gone deeper into the subject it became clear that a good >>>>> implementation will need those things, hence the "easy" attribute is no >>>>> longer there. I support going back to explore your original idea. >>>>> >>>>> henrik >>>>> >>>>> >>>>> On Wed, Apr 4, 2012 at 8:12 AM, Daniel Nichter <dan...@percona.com> >>>>> wrote: >>>>>> >>>>>> Anshu, Henrik, Clint, >>>>>> >>>>>> First: Anshu: I like to use people's names correctly, so I noticed you >>>>>> sign your emails "Ansh" but we've been writing "Anshu". Is one or the >>>>>> other, or both, correct? >>>>>> >>>>>> Now on to business. First, thanks for the code. This is a good start >>>>>> and I'm happy to see that you've been able to jump into the code with >>>>>> apparent ease. >>>>>> >>>>>> Second, I disagree that the auto-reloading approach is the ideal >>>>>> solution. I think we all need to debate the merits of this approach >>>>>> further. So let's do that... >>>>>> >>>>>> In my humble opinion, this approach has the following drawbacks: >>>>>> >>>>>> 1) It's "gold plating" because in the real world the policy file >>>>>> won't/shouldn't change so frequently as to make autp-reloading a valuable >>>>>> feature. It's not too much to ask the user to execute one simple >>>>>> command, >>>>>> and chances are they will expect to do this. Thinking of Drizzle and >>>>>> MySQL, >>>>>> no auto-(re)loading features come immediately to my mind, so we won't be >>>>>> depriving the user of functionality they're used to. Of course, I'm all >>>>>> for >>>>>> new types of functionality when it's clear that the functionality will >>>>>> be a >>>>>> "big win" for users, but given the nature of this issue, I don't think >>>>>> auto-reloading is a big win and certainly not worth the extra engineering >>>>>> effort. >>>>>> >>>>>> 2) It's a bit of magic and magic usually leads to problems down the >>>>>> road. Sure, it's just one little thread that sleeps, checks, and maybe >>>>>> does >>>>>> something, but one immediate "problem" comes to mind: testing. Anything >>>>>> dependent on time or time-based is inherently more difficult to test. >>>>>> It's >>>>>> possible, of course, but (related to #1) is it worth the effort? Another >>>>>> problem comes to mind: what if the admin is editing the policy file and >>>>>> his >>>>>> editor auto-saves every N minutes, and auto-reload is on? Drizzle may >>>>>> read >>>>>> the policy file before the admin intends. Magic can be very difficult to >>>>>> wield safely. >>>>>> >>>>>> 3) It doesn't address the original security concern. Henrik raised the >>>>>> problem that anyone could execute the command to reload the policy file, >>>>>> but >>>>>> anyone could enable the auto-reload, too. The real solution lies in the >>>>>> authorization modules. Right now Drizzle has only very basic >>>>>> authorization: >>>>>> schema and table access (via this plugin nonetheless). What Drizzle >>>>>> needs >>>>>> is authorization for setting/changing global variables. I think we can >>>>>> make >>>>>> still make this dynamic and leave the authorization solution for another >>>>>> time/person/project. >>>>>> >>>>>> 4) It introduces a concept that will either become a norm or become an >>>>>> exception. Given the aforementioned points, I wouldn't like to see >>>>>> auto-reloading before a norm, and we certainly don't want more exceptions >>>>>> because one of our high-level goals is to make the "look and feel" of all >>>>>> plugins consistent. So if we do this here, then why not >>>>>> --auth-file.auto-reload too? But then we're neck deep in gold plating >>>>>> and >>>>>> magic. >>>>>> >>>>>> 5) It seems contrary to "the Drizzle way". Brian, Stewart, and the >>>>>> original core developers have more of a sense of what the Drizzle way is, >>>>>> but I'm pretty certain is centers on removing the extraneous and the >>>>>> gotchas. Drizzle prides itself it what it doesn't have: no views, no >>>>>> triggers, no timezones, etc. I think auto-reloading is extraneous (gold >>>>>> plating) and prone to becoming a gotcha. To modify my previous example: >>>>>> what if the senior admin enables auto-reloading but forgets to tell the >>>>>> junior admin who changes the policy file on Friday and plans to review >>>>>> the >>>>>> changes with the senior admin on Monday only for both of them to get a >>>>>> call >>>>>> during the weekend by the CTO because Sally in HR can't access the >>>>>> employees >>>>>> database and she's trying to do payroll so now everyone's paychecks will >>>>>> be >>>>>> late? Gotcha. >>>>>> >>>>>> So, in conclusion: your code is a good start, but I think we need >>>>>> another solution. Other opinions? >>>>>> >>>>>> -Daniel >>>>>> >>>>>> >>>>>> Le 3 avr. 2012 à 18:03, Anshu Kumar a écrit : >>>>>> >>>>>> Hi Daniel, >>>>>> For making all the plugins dynamic, as the earlier discussion for >>>>>> auth_file could not come to a conclusion, I started off with making the >>>>>> regex_policy plugin dynamic. Here is the complete process which am >>>>>> proposing >>>>>> for this plugin >>>>>> >>>>>> 1. There would be a autoreload variable, default set to false. This >>>>>> variable will determine if policy file needs to be reloaded. >>>>>> >>>>>> 2. Upon setting this variable to true (SET GLOBAL >>>>>> regex_policy_autoreload=ON), a new thread will be created which will >>>>>> handle >>>>>> the reload issues of policy file. >>>>>> >>>>>> 3. In the thread created, on every one minute, using the stat command to >>>>>> find the last modified time and taking the difference from current time, >>>>>> it >>>>>> will be checked that if the file was modified in last one minute. And if >>>>>> it >>>>>> was, reload the file. If it wasn't modified, continue to the next poll. >>>>>> >>>>>> 4. This thing will go on till you again set the variable value to false >>>>>> (SET GLOBAL regex_policy_autoreload=OFF) >>>>>> >>>>>> Scenario would be, if you want to change the policy file and want those >>>>>> changes to be reflected, just change the variable to true, do your >>>>>> modifications, and the changes will be reflected the next minute in the >>>>>> system. >>>>>> >>>>>> I have implemented this whole thing. Here is the link of the branch. It >>>>>> would be great if you can go through it and give your comments. >>>>>> https://code.launchpad.net/~ansharyan015/drizzle/dynamic_regex_policy >>>>>> >>>>>> P.S. Thanks to Henrik for being the continuous help. :) >>>>>> Comments and suggestions are welcome. >>>>>> >>>>>> >>>>>> On Mon, Apr 2, 2012 at 11:01 PM, Henrik Ingo <henrik.i...@avoinelama.fi> >>>>>> wrote: >>>>>>> >>>>>>> Anshu: To create a background thread, you need to use class >>>>>>> drizzled::plugin::Daemon >>>>>>> >>>>>>> Look at plugin/json_server/json_server.cc (class JsonServer at the >>>>>>> end) for an example. >>>>>>> >>>>>>> henrik >>>>>>> >>>>>>> On Mon, Apr 2, 2012 at 4:16 PM, Henrik Ingo <henrik.i...@avoinelama.fi> >>>>>>> wrote: >>>>>>>> Anshu >>>>>>>> >>>>>>>> You are right. Creating a thread is more correct. I was just trying >>>>>>>> to >>>>>>>> avoid it since you originally asked for "low-hanging-fruit" bug. >>>>>>>> >>>>>>>> Functionally, ignoring the performance hit, you could do this also >>>>>>>> from the restrict* methods and then you don't need to create your own >>>>>>>> thread. >>>>>>>> >>>>>>>> henrik >>>>>>>> >>>>>>>> On Mon, Apr 2, 2012 at 3:45 PM, Anshu Kumar <ansharyan...@gmail.com> >>>>>>>> wrote: >>>>>>>>> Hey Henrik, >>>>>>>>> What I was thinking is we can have a system like this. When >>>>>>>>> autoreload >>>>>>>>> variable is set to true, we can create a thread which will check >>>>>>>>> either by >>>>>>>>> inotify or stat() that the corresponding regex policy file is >>>>>>>>> changed or >>>>>>>>> not. And it of does then only reload the file. This is just like >>>>>>>>> creating a >>>>>>>>> handler for change in policy file. The performance will be better >>>>>>>>> than >>>>>>>>> polling for a min and reloading the policy file. >>>>>>>>> The implementation is actually the same in this, and the way you >>>>>>>>> suggested >>>>>>>>> by Policy::restrict methods. So did you want to say that when >>>>>>>>> checking for >>>>>>>>> regex policy rights (if access is allowed or denied), we can check >>>>>>>>> if file >>>>>>>>> needs to be refreshed? >>>>>>>>> >>>>>>>>> On Mon, Apr 2, 2012 at 6:02 PM, Henrik Ingo >>>>>>>>> <henrik.i...@avoinelama.fi> >>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> Anshu >>>>>>>>>> >>>>>>>>>> Actually, now that I re-read this, I don't know if it was a smart >>>>>>>>>> idea >>>>>>>>>> and maybe there needs to be a thread that does the polling, but my >>>>>>>>>> original idea was that you could reload the file during an >>>>>>>>>> authorization request. So basically when any of the >>>>>>>>>> Polixy::restrict... methods are called, you would first check if >>>>>>>>>> the >>>>>>>>>> file needs to be refreshed and then re-read it (or not). This way >>>>>>>>>> you >>>>>>>>>> don't need to have a loop or do any polling or such. >>>>>>>>>> >>>>>>>>>> This approach is not good because it would introduce a performance >>>>>>>>>> hit >>>>>>>>>> into random requests every N seconds. But you could still do it >>>>>>>>>> this >>>>>>>>>> way as a proof of concept, then we could work on making it a >>>>>>>>>> background thread later. >>>>>>>>>> >>>>>>>>>> henrik >>>>>>>>>> >>>>>>>>>> On Mon, Apr 2, 2012 at 2:51 PM, Anshu Kumar >>>>>>>>>> <ansharyan...@gmail.com> >>>>>>>>>> wrote: >>>>>>>>>>> Hey Guys, >>>>>>>>>>> I have tried to implement this dynamic thing to regex_policy >>>>>>>>>>> plugin. >>>>>>>>>>> In reference to my talk with Henrik yesterday, we discussed that >>>>>>>>>>> there >>>>>>>>>>> could >>>>>>>>>>> be a autoreload variable, and when made true it will continuously >>>>>>>>>>> poll >>>>>>>>>>> for >>>>>>>>>>> changes in default regex policy file. And it it is made false, it >>>>>>>>>>> will >>>>>>>>>>> stop >>>>>>>>>>> polling, checking for modifications. Sticking to the discussion, >>>>>>>>>>> the >>>>>>>>>>> code I >>>>>>>>>>> wrote is >>>>>>>>>>> >>>>>>>>>>> void autoReload_Regex_Policy(Session *, sql_var_t) >>>>>>>>>>> { >>>>>>>>>>> if(policy->sysvar_autoreload) >>>>>>>>>>> { >>>>>>>>>>> while(1) >>>>>>>>>>> { >>>>>>>>>>> if (not policy->loadFile()) >>>>>>>>>>> { >>>>>>>>>>> errmsg_printf(error::ERROR, _("Could >>>>>>>>>>> not >>>>>>>>>>> load >>>>>>>>>>> regex policy file: %s\n"), >>>>>>>>>>> (policy ? >>>>>>>>>>> policy->getError().str().c_str() : _("Unknown"))); >>>>>>>>>>> return; >>>>>>>>>>> } >>>>>>>>>>> sleep(60); >>>>>>>>>>> if(!policy->sysvar_autoreload) >>>>>>>>>>> break; >>>>>>>>>>> } >>>>>>>>>>> } >>>>>>>>>>> else >>>>>>>>>>> { >>>>>>>>>>> } >>>>>>>>>>> } >>>>>>>>>>> This function handles the case when you change the value of >>>>>>>>>>> autoreload >>>>>>>>>>> from >>>>>>>>>>> drizzle client. The problem is as the function is using sleep >>>>>>>>>>> recursively, >>>>>>>>>>> when trying to change autoreload value by "SET GLOBAL", the >>>>>>>>>>> client >>>>>>>>>>> hangs. >>>>>>>>>>> This is obviously due to function recursive structure. Initially, >>>>>>>>>>> I >>>>>>>>>>> thought >>>>>>>>>>> that it would change the variable and then polls. >>>>>>>>>>> >>>>>>>>>>> Now, coming to the discussion earlier in this mail, even if I >>>>>>>>>>> create a >>>>>>>>>>> pthread from this function which will check for modification >>>>>>>>>>> using >>>>>>>>>>> stat() or >>>>>>>>>>> inotify(), this function won't exit untill its thread stop >>>>>>>>>>> working. And >>>>>>>>>>> as >>>>>>>>>>> thread will continuously polls for changes, it wont exit. >>>>>>>>>>> >>>>>>>>>>> Is there any solution for this scenario, except adding the >>>>>>>>>>> refresh >>>>>>>>>>> command >>>>>>>>>>> for refreshing the policy file? >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Fri, Mar 30, 2012 at 10:34 PM, Clint Byrum <cl...@fewbar.com> >>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>> Excerpts from Henrik Ingo's message of Thu Mar 29 21:16:26 -0700 >>>>>>>>>>>> 2012: >>>>>>>>>>>>> Daniel: >>>>>>>>>>>>> >>>>>>>>>>>>> Have you thought about authorization for this? I mean we >>>>>>>>>>>>> wouldn't >>>>>>>>>>>>> want >>>>>>>>>>>>> any old logged in user to be able to >>>>>>>>>>>>> >>>>>>>>>>>>> SET GLOBAL >>>>>>>>>>>>> auth_file.users=/home/hingo/igivemyselfrootpowers.users >>>>>>>>>>>>> >>>>>>>>>>>>> (Making the plugin reload the existing file will be helpful. >>>>>>>>>>>>> But it >>>>>>>>>>>>> might not be a good idea to allow to change that value.) >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Agreed. I'd like to see plugins like auth_file and regex_policy >>>>>>>>>>>> given >>>>>>>>>>>> a generic way to "watch" their files. There are a number of ways >>>>>>>>>>>> to do >>>>>>>>>>>> this, but I don't think each plugin should implement its own >>>>>>>>>>>> method. >>>>>>>>>>>> >>>>>>>>>>>> Thoughts I've had on this: >>>>>>>>>>>> >>>>>>>>>>>> * A thread which uses either inotify or falls back to polling >>>>>>>>>>>> with stat(), and whenever there is a change, calls any >>>>>>>>>>>> registered code >>>>>>>>>>>> to update that file's effect. >>>>>>>>>>>> >>>>>>>>>>>> * An admin command like REFRESH '/etc/drizzle/regex.policy' >>>>>>>>>>>> which does >>>>>>>>>>>> the same thing as the thread without the inotify/polling. >>>>>>>>>>>> >>>>>>>>>>>> * Cache the stat() call on the file and periodically expire the >>>>>>>>>>>> cache >>>>>>>>>>>> and refresh the contents if stat() indicates that it has >>>>>>>>>>>> changed. >>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> henrik.i...@avoinelama.fi >>>>> +358-40-8211286 skype: henrik.ingo irc: hingo >>>>> www.openlife.cc >>>>> >>>>> My LinkedIn profile: http://www.linkedin.com/profile/view?id=9522559 >>>> >>>> >>>> >>>> >>>> -- >>>> Regards, >>>> Anshu >>>> >>> >>> >>> >>> -- >>> Regards, >>> Anshu >>> >>> >> >> >> >> -- >> henrik.i...@avoinelama.fi >> +358-40-8211286 skype: henrik.ingo irc: hingo >> www.openlife.cc >> >> My LinkedIn profile: http://www.linkedin.com/profile/view?id=9522559 > -- henrik.i...@avoinelama.fi +358-40-8211286 skype: henrik.ingo irc: hingo www.openlife.cc My LinkedIn profile: http://www.linkedin.com/profile/view?id=9522559 _______________________________________________ Mailing list: https://launchpad.net/~drizzle-discuss Post to : drizzle-discuss@lists.launchpad.net Unsubscribe : https://launchpad.net/~drizzle-discuss More help : https://help.launchpad.net/ListHelp