Hey Daniel, What do you exactly mean by a 'RELOAD' function? If that is a generic function which can be used for every of the plugin which needs to be reloaded, then of course it is the best solution.
Additionally, apart from using a reload variable as I earlier proposed, the other option of using just a single variable, for eg, regex_policy_policy may not be that obvious for the user. Elaborating on the point, what is a person changes the regex_policy_policy to something else and then he again makes some changes in the new file. Setting the value of regex_policy_policy is not a very obvious thing for the user (the essence is of changing the policy file, not reloading it). regex_policy_reload is more clear in terms from this. Ofcourse we will have to document in a clear way. On Sun, Apr 29, 2012 at 8:04 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 > > -- Regards, Anshu
_______________________________________________ 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