|
From: Anthony G. <an...@fa...> - 2008-11-25 20:28:55
|
You are correct. Sorry, in my earlier email I should have you need to pass a *list* of LogEntry's when calling Log. See the declaration of the Log procedure in if/scribe.thrift.
-Anthony
On 11/25/08 7:19 AM, "Chandranshu ." <cha...@gm...> wrote:
Hi Anthony,
I changed the client.Log("message") line to be
client.Log(LogEntry.new(:category => "test", :message => "This is a
test message"));
Now, I'm getting the following exception:
/usr/local/lib/site_ruby/1.8/thrift/struct.rb:233:in
`write_container': undefined method `size' for <LogEntry
category:"test", message:"This is a test message">:LogEntry
(NoMethodError)
from /usr/local/lib/site_ruby/1.8/thrift/struct.rb:113:in `write'
from /usr/local/lib/site_ruby/1.8/thrift/struct.rb:69:in `each_field'
from /usr/local/lib/site_ruby/1.8/thrift/struct.rb:68:in `each'
from /usr/local/lib/site_ruby/1.8/thrift/struct.rb:68:in `each_field'
from /usr/local/lib/site_ruby/1.8/thrift/struct.rb:109:in `write'
from /usr/local/lib/site_ruby/1.8/thrift/client.rb:16:in `send_message'
from ../src/gen-rb/scribe.rb:22:in `send_Log'
from ../src/gen-rb/scribe.rb:17:in `Log'
from rscribe_cat:18
I'm suspecting that the size method should not have been called on the
LogEntry class but actually on the Thrift::Types::LIST class which is
the type of the :element attribute of :message field of Log_args
class.
Can you please verify that this should actually be the case because in
that case, it'll be a bug in Thrift rather than Scribe.
Regards
Chandranshu
P.S.: I think I understand the source of bug. It is the following
method in the Thrift::Struct class which is actually setting the
message field to the LogEntry instance that I'm passing rather than
creating a Thrift::LIST out of it. I didn't get time to check the
Thrift.check_type method to see if it changes the 'value' parameter.
def self.field_accessor(klass, *fields)
fields.each do |field|
klass.send :attr_reader, field
klass.send :define_method, "#{field}=" do |value|
Thrift.check_type(value, klass::FIELDS.values.find { |f|
f[:name].to_s == field.to_s }, field) if Thrift.type_checking
instance_variable_set("@#{field}", value)
end
end
end
On Tue, Nov 25, 2008 at 10:11 AM, Anthony Giardullo
<an...@fa...> wrote:
> Ok, it looks like your passing in a string to client.Log(). What you need
> to pass in is a LogEntry. This class is defined in the thrift -generated
> file scribe_types.rb.
>
> -Anthony
>
>
> On 11/24/08 3:51 AM, "Chandranshu ." <cha...@gm...> wrote:
>
> Hi Anthony,
>
> I am using the following code to log the messages. I didn't find any
> method to create a Log_Entry pair.
>
> The only methods I found were Log, send_Log and recv_Log. There are
> other classes called Log_args and Log_result but I'm not sure how I
> should be using them. Interestingly, there is the following line in
> the Log_args class which is using LogEntry but I don't see where it
> can find it:
> MESSAGES => {:type => Thrift::Types::LIST, :name => 'messages',
> :element => {:type => Thrift::Types::STRUCT, :class => LogEntry}}
>
> Regards
> Chandranshu
>
> ========= rscribe_cat.rb ===========
>
> # include thrift-generated code
> $:.push('../src/gen-rb')
>
> #require 'thrift/transport'
> require 'thrift/transport/tsocket'
> require 'thrift/protocol/tbinaryprotocol'
> require 'thrift/server/tserver'
>
> require '../src/gen-rb/scribe'
>
> begin
> socket = Thrift::Socket.new('localhost', 1463)
> transport = Thrift::FramedTransport.new(socket)
> protocol = Thrift::BinaryProtocol.new(transport)
> client = Scribe::Client.new(protocol)
>
> transport.open()
> client.Log(ARGV[1]);
>
> transport.close()
>
> rescue Thrift::Exception => tx
> print 'Thrift::Exception: ', tx.message, "\\n"
> end
>
> ============ rscribe_cat.rb ends ============
>
> On Sat, Nov 22, 2008 at 8:09 AM, Anthony Giardullo <an...@fa...>
> wrote:
>> Chandranshu,
>>
>> Glad to see you figured out many of these issues getting the Ruby code
>> generated. I am going to pass on your comments to our Thrift gurus.
>>
>> Quick question, can you show me how exactly you are calling your
>> rscribe_cat
>> script? Are you creating a Log_Entry pair with a category and message?
>>
>> -Anthony
>>
>> On 11/21/08 4:15 AM, "Chandranshu ." <cha...@gm...> wrote:
>>
>> Resending in plain text format:
>> I'm trying to use a Ruby Client named rscribe_cat.rb to post messages
>> to the scribed server started using the examples/example1.conf file
>> that came with the distribution. The file is attached herewith.
>>
>> I'm summarizing the problems I faced in setting up Scribe for Ruby:
>>
>> 1. Edit the <SCRIBE_BASE>/src/Makefile.in. Replace the following line
>>
>> $(eval $(call thrift_template,.,$(srcdir)/../if/scribe.thrift,
>> -I $(thrift_home)/share/ -I $(fb303_home)/share/ --cpp --py --php))
>>
>> with
>>
>> $(eval $(call thrift_template,.,$(srcdir)/../if/scribe.thrift,
>> -I $(thrift_home)/share/ -I $(fb303_home)/share/ --cpp --py --php
>> --gen rb))
>>
>> 2. Now run the following command from <SCRIBE_BASE> again:
>>
>> sudo make install
>>
>> Verify that a gen_rb folder has been created in the
>> <SCRIBE_BASE>/src directory and it contains the scribe.rb file. This
>> file contains the ruby module that'll enable us to use it from inside
>> ruby code. Also, add this path to $: in your Ruby Client.
>> 3. However, the generated module contains the module name as scribe
>> and trying to use it will result in Ruby complaining that
>>
>> ../src/gen-rb/scribe.rb:12: class/module name must be CONSTANT
>> (SyntaxError)
>>
>> The leading ".." is because I was writing the ruby client in the
>> examples directory. Open the "../src/gen-rb/scribe.rb" file and change
>> the module name to be Scribe with a capital 'S'.
>> 4. The next error you'll get is:
>>
>> ../src/gen-rb/scribe.rb:9:in `require': no such file to load
>> -- FacebookService (LoadError)
>>
>> This is because when installing fb303, ruby classes were left
>> out again. Generate the ruby classes for the fb303 service interface
>> from the <FB303_BASE> directory:
>>
>> sudo thrift -o /usr/local/share -I /usr/local/share --gen rb
>> if/fb303.thrift
>>
>> Unfortunately, ruby files in /usr/local/share are not picked up
>> Ruby by default. So, you'll have to manually copy over the files to
>> /usr/local/lib/site_ruby/1.8/ or the corresponding directory on your
>> machine.
>> 5. The next error is the one that consumed most of my time:
>>
>> /usr/local/lib/site_ruby/1.8/fb303_types.rb:8:in `require': no
>> such file to load --
>> /usr/local/lib/site_ruby/1.8/reflection_limited_types
>>
>> Looking at the code, I found that it was using
>> File.dirname(FILE) to load the reflection_limited_types file. Bad for
>> me. After a huge updatedb call, I was able to locate the corresponding
>> thrift file. Use the following to remedy this:
>>
>> sudo thrift -o /usr/local/lib/site_ruby/1.8 --gen rb
>> /usr/local/share/thrift/if/reflection_limited.thrift
>>
>> and then copy out the files from the gen-rb directory to the
>> /usr/local/lib/site_ruby/1.8 directory. After this point, you
>> shouldn't get any more syntax errors. Though it'd be great if the ruby
>> classes are also generated at the build time for Thrift, fb303 and
>> scribe. I think generating the ruby classes for the
>> thrift/if/reflection_limited.thrift, <fb303_base>/if/fb303.thrift and
>> $(srcdir)/../if/scribe.thrift files and putting them in the right
>> place should do.
>> 6. What I'm still struggling with:
>>
>> /usr/local/lib/site_ruby/1.8/thrift/protocol/binaryprotocol.rb:82:in
>> `read_message_begin': Missing version identifier
>> (Thrift::ProtocolException)
>> from /usr/local/lib/site_ruby/1.8/thrift/client.rb:26:in
>> `receive_message'
>>
>> from ../src/gen-rb/scribe.rb:26:in `recv_Log'
>> from ../src/gen-rb/scribe.rb:18:in `Log'
>> from rscribe_cat:18
>>
>> If someone has solved this problem or if the developers can guide me
>> as to what might be going wrong, I'll try and fix it and post a patch.
>>
>> Anyways, good framework Guys!!
>>
>> Thanks and regards,
>> Chandranshu
>>
>> -------------------------------------------------------------------------
>> This SF.Net email is sponsored by the Moblin Your Move Developer's
>> challenge
>> Build the coolest Linux based applications with Moblin SDK & win great
>> prizes
>> Grand prize is a trip for two to an Open Source event anywhere in the
>> world
>> http://moblin-contest.org/redirect.php?banner_id=100&url=/
>> _______________________________________________
>> Scribeserver-users mailing list
>> Scr...@li...
>> https://lists.sourceforge.net/lists/listinfo/scribeserver-users
>>
>>
>
>
|