Hi,
Check this:
http://bazaar.launchpad.net/~srivastavamohit91/drizzle/drizzle-json_server-multithreading/revision/2572

On Mon, Jul 16, 2012 at 3:39 PM, Henrik Ingo <henrik.i...@avoinelama.fi> wrote:
> On Sat, Jul 14, 2012 at 5:13 PM, Mohit Srivastava
> <srivastavamohi...@gmail.com> wrote:
>> http://bazaar.launchpad.net/~srivastavamohit91/drizzle/drizzle-alsosql-keyvalue/revision/2575
>
>> I am done with multi-threading and dynamic plugin part.New one for review
>> :)
>
>
> On Thu, Jul 12, 2012 at 11:06 PM, Henrik Ingo <henrik.i...@avoinelama.fi> 
> wrote:
>> *** Miscellaneous:
>>
>> Please use more descriptive name for the branch.
>> "drizzle-json_server-multihtreading" would be a good choice here. (Or
>> at least something with multithread*)
>
> This is still not done.
Done
>
>
>> Please file a bug about the issue we found in /sql api where multiple
>> statements return result sets with different amount of columns and
>> crash the server.
>
> I assume this was not done yet? (It's ok, just keeping track.)
>
Will do soon.
>> *** "Known issues" - still todo:
>>
>> Ability to at least increase max_threads dynamically.
>
> Done. Please correct:
>
> +    errmsg_printf(error::ERROR, _("json_server_max_thread cannot be
> smaller than previous configured value"));//error
>
> Should be json_server_max_threads (plural)
>
> Also, use of errmsg_printf() here is not correct. This will print
> error message to stderr, which will be directed to some log file.
> However, here the user is setting this variable interactively, so we
> should return a warning level message back to the user that his action
> was ignored. (Note that returning error to the client is too hard. We
> should inform the user that the action was ignored, but it shouldn't
> be an error to try.)
>
> Please see how I'm using my_error() in plugin/js/js.cc to return an
> error to the interactive client. Different forms of my_error() are
> defined in drizzled/error.h
>
> To be honest, I do not know how to issue a warning to the user. (Ie
> there is no function my_warning() and also my_message() is not
> exported to be part of DRIZZLED_API. If you can't figure it out, you
> can just leave the code as it is now, and add "todo: we should return
> a warning to the client, not to stderr".
>
>
Segmentation fault occurs.
Above mentioned revision have commented code for this.
> Unrelated - remove this comment. (You've removed the code it is referencing 
> :-)
>
>         // Catch all does nothing and returns generic message.
>
>
>
>>
>> Documentation.
>
> Ok. (I will again make small language enhancements and push a branch
> you can merge.)
>
>> Optional: A shell script to actually test multi-threading. (shell
>> script needs to handle forking, drizzle-test-run doesn't know anything
>> about such...)
>>   (If you don't do this now, add a mention about this to the worklog
>> so we can remember it later.)
>
> todo
>
>>
>> Optional: Instead of launching max_threads amount of threads at
>> startup, launch at first only 10, and then launch more if the server
>> is busy. If you don't do this now (we shouldn't, it's non-trivial),
>> add a mention of this to the worklog so that we remember to do it some
>> time later.
>
> todo
>
>
>> This behavior that drizzled immediately spawns max_threads number of
>> threads (even if they are never used) should be documented in the
>> manual.
>
> Ok.
>
>
>> *** diff starts here
>>
>>
>> $ bzr diff -r2570..2573
>>
>>
>> Both http_server.h and http_server.cc:
>>
>> All files need to have a copyright header. In this case I think you
>> can just insert the GPL header with your name. However, you should add
>> a line just below it that says something like "Based on example code
>> from https://gist.github.com/665437";
>
>
> Ok.
>
>> === modified file 'plugin/json_server/json_server.cc'
>> --- plugin/json_server/json_server.cc   2012-07-06 11:41:21 +0000
>> +++ plugin/json_server/json_server.cc   2012-07-11 14:03:34 +0000
>> @@ -59,6 +59,7 @@
>>  #include <plugin/json_server/json/json.h>
>>  #include <plugin/json_server/db_access.h>
>>  #include <plugin/json_server/http_handler.h>
>> +#include <plugin/json_server/http_server.h>
>>
>>  namespace po= boost::program_options;
>>  using namespace drizzled;
>> @@ -71,12 +72,15 @@
>>  static const string DEFAULT_SCHEMA = "test";
>>  static const string DEFAULT_TABLE = "";
>>  static const string JSON_SERVER_VERSION = "0.3";
>> +static const uint32_t DEFAULT_MAX_THREAD= 1;
>>
>> Use a higher default. Json server isn't loaded by default. So if it is
>> loaded, we can assume it is going to be used. I would set this at 64.
>> (It should be even higher, but then we'd need to implement something
>> that creates more threads as needed, not just 1024 threads at
>> startup.)
>>
>> Also: change name to DEFAULT_MAX_THREADS
>
> Ok.
>
>>  static const bool ALLOW_DROP_TABLE=false;
>>
>> By the way: Also change this to DEFAULT_ALLOW_DROP_TABLE
>>
>
> Ok.
>
>
>>  bool allow_drop_table;
>>  string default_schema;
>>  string default_table;
>> +uint32_t max_thread;
>>
>> Change name to max_threads
>
> Ok.
>
>
>>  {
>>  private:
>> -  drizzled::thread_ptr json_thread;
>> +  std::vector<drizzled::thread_ptr> json_thread;
>>
>> Change name to json_threads (plural)
>>
>
> Ok.
>
>
>> +
>> +    // Create Max_thread number of threads.
>> +    for(uint32_t i =0;i<max_thread;i++)
>>      {
>> -      sql_perror("event_add");
>> -      return false;
>> +      if ((base= event_init()) == NULL)
>> +      {
>> +        sql_perror("event_init()");
>> +        return false;
>> +      }
>> +
>> +      if ((httpd= evhttp_new(base)) == NULL)
>> +      {
>> +        sql_perror("evhttp_new()");
>> +        return false;
>> +      }
>> +
>> +      if(evhttp_accept_socket(httpd,fd))
>> +      {
>> +        sql_perror("evhttp_accept_socket()");
>> +        return false;
>> +      }
>> +
>> +      // These URLs are available. Bind worker method to each of them.
>> +      // // Please group by api version. Also unchanged functions
>> must be copied to next version!
>> +        evhttp_set_cb(httpd, "/", process_root_request, NULL);
>> +         // API 0.1
>> +        evhttp_set_cb(httpd, "/0.1/version", process_api01_version_req, 
>> NULL);
>> +        evhttp_set_cb(httpd, "/0.1/sql", process_api01_sql_req, NULL);
>> +        // API 0.2
>> +        evhttp_set_cb(httpd, "/0.2/version", process_api01_version_req, 
>> NULL);
>> +        evhttp_set_cb(httpd, "/0.2/sql", process_api01_sql_req, NULL);
>> +        evhttp_set_cb(httpd, "/0.2/json", process_api02_json_req, NULL);
>> +        // API "latest" and also available in top level
>> +        evhttp_set_cb(httpd, "/latest/version",
>> process_api01_version_req, NULL);
>> +        evhttp_set_cb(httpd, "/latest/sql", process_api01_sql_req, NULL);
>> +        evhttp_set_cb(httpd, "/latest/json", process_api02_json_req, NULL);
>> +        evhttp_set_cb(httpd, "/version", process_api01_version_req, NULL);
>> +        evhttp_set_cb(httpd, "/sql", process_api01_sql_req, NULL);
>> +        evhttp_set_cb(httpd, "/json", process_api02_json_req, NULL);
>> +        // Catch all does nothing and returns generic message.
>> +        //evhttp_set_gencb(httpd, process_request, NULL);
>> +
>>
>> I've been thinking you could just remove all the /0.1/* and /0.2/ and
>> /latest/ URIs. We are not strictly leaving old versions of the
>> functions in place (also because they had crashing bugs) so let's just
>> simplify and just provide /version /sql and /json and nothing more.
>>
>
> Here you have missed the discussion we had with Stewart. The new directions 
> are:
>
> 1) Remove /0.1/sql, /0.2/sql and /0.2/json on the grounds that we have
> found crashing bugs in the old code so it is no longer supported.
>
> 2) We still continue the approach to make functionality available via
> a URL that starts with the version number. Hence, you need to now
> support these urls:
> /0.1/version * = see below
> /0.2/version * = see below
> /0.3/version
> /0.3/sql
> /0.3/json
> /latest/version
> /latest/sql
> /latest/json
> /version
> /sql
> /json
> /
>
> * For these two, you should use the original function that was
> actually used in those versions of the plugin:
>
> extern "C" void process_api01_version_req(struct evhttp_request *req, void* )
> {
>   struct evbuffer *buf = evbuffer_new();
>   if (buf == NULL) return;
>
>   Json::Value root;
>   root["version"]= ::drizzled::version();
>
>   Json::StyledWriter writer;
>   std::string output= writer.write(root);
>
>   evbuffer_add(buf, output.c_str(), output.length());
>   evhttp_send_reply(req, HTTP_OK, "OK", buf);
> }
>
I just change the function . And it doesn't represent api now. Because
/0.1/version ,/0.2/version will behave same.
>> You need to update documentation to reflect this change.
>>
>
> I have updated documentation so it reflects the above urls.
>
>
>> **** Not in diff:
>>
>> You can now remove this todo at line 303:
>>
>>  * @todo allow DBA to set default schema (also in post,del methods)
>
> Ok.
>
>
>> In this function, To avoid confusion, please change "fd" to "wakeup_fd":
>>
>> static void shutdown_event(int fd, short, void *arg)
>> {
>>   struct event_base *base= (struct event_base *)arg;
>>   event_base_loopbreak(base);
>>   close(fd);
>> }
>>
>
> You changed the other file descriptor to nfd instead. This is ok.
>
>
> Please merge lp:~hingo/drizzle/drizzle-json_server-multithread-docs to
> get my edits of the documentation.
>
> Please correct the URLs as explained above and the issues with the
> updateMaxThreads() code.
>
> Please push all of that to a branch with a more descriptive name. Then
> issue merge request.
>
> Please add the remaining todo items to the blueprint.
>
> henrik
>
> --
> 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

Reply via email to