neutron log

erlang@conference.jabber.ru

Thursday, September 17, 2009


[03:47] <cfi/1> >похоже стек индусы писали.

на пАттернах с шаблонАми. не иначе
[03:47] <zert> а ерланговский стек откуда?
[03:47] <cfi/1> хе
[03:48] <cfi/1> проснулись =3
[03:48] <zert> да никто и не спал
[03:48] <zert> просто повода не было
[03:49] <cfi/1> хы
[03:49] * cfi/1 чувствует себя провокатором
[03:49] <cfi/1> а он нужен?
[03:49] <cfi/1> хотя да... забываю что только я тут не занят работой ((
[03:49] <zert> ну, как видишь :)
[03:49] <cfi/1> порочная практика имхо
[03:50] <cfi/1> провоцирует аппаратные дедлоки
[03:50] <cfi/1> которые хрен разрешишь за невозможностью перезапуска фирмвари в мозгах
[03:51] <zert> в мозгах нет фирмвари
[03:52] <cfi/1> хехе
[03:52] <cfi/1> а что же там тогда?
[03:52] <cfi/1> пустота? говно? картошка?
[03:52] <zert> у всех своё
[03:53] <cfi/1> выражение хоть и образное, но я думаю какой-то функциональный аналог есть
[03:53] <cfi/1> свой сорт картошки? (-;
[03:53] <zert> фирмварь подразумевает наличие точно такого же набора данных в мозгах, количеством больше одного
[03:54] <cfi/1> ммм
[03:54] <cfi/1> ну так не обязательно прям все программировать. базовая прошивка + нарабатываемые за жизнь данные
[03:54] <cfi/1> схожее поведение детей на ранних этапах очень даже подтверждает предположение
[03:55] <cfi/1> интересное вообще в другом - возникший дедлок так просто не разрешишь
[03:55] <cfi/1> в том числе излюбленым программистским методом - перезагрузкой
[03:55] <zert> приведи пример дедлока в мозгах
[03:56] <cfi/1> фанатизм
[03:56] <cfi/1> как глобально-клинический так и в мелочах
[03:56] <zert> это не дедлок, а косяк
[03:56] <cfi/1> имхо суть - дедлок
[03:56] <zert> нет
[03:56] <cfi/1> поцчему?
[03:57] <cfi/1> обычно это все прекрывается некими размышлениями
[03:57] <cfi/1> из которых делаются неправильные выводы
[03:58] <cfi/1> возможно именно в силу взаимоблокировок разных вариантов
[04:01] <Guybrush> ну если употреблять дедлок в широком смысле, как синоним слова жеппа, тогда можно и так сказать... а вообще никаких взаимоблокировок в данном примере не вижу
[04:01] <cfi/1> не
[04:01] <cfi/1> я берусь утверждать, что процессы в мозгу носят массовопараллельных характер
[04:01] <cfi/1> и всякие взаимоблокировки там имеют место быть в прямом смысле
[04:02] <Guybrush> а доказательства?
[04:03] <cfi/1> хе
[04:03] <cfi/1> позже, надо в универ убегать
[06:02] <valexey> у кого логи сохранились, киньте плиз результаты тестирования на производительность разных sip-стэков.
[06:02] <valexey> % и не плохо бы включить ведение логов для канала
[06:11] <iNode> [2009-09-15 16:12:52] willi> сравнивал недавно производительность H.323 разных стеков, может кому
интересно. Замерял декодинг TerminalCapabilitySet. На одно сообщение в микросекундах: ooh323c (C) -
24.50, erlang - 179.10, pwlib(openh323, C++) - 564.39.
[2009-09-15 16:13:54] willi> результаты плюсовой проги порадовали, похоже стек индусы писали.
[09:28] <catap> syn
[09:29] <cfi/1> ack
[09:30] <catap> а тут никто с thrift не работал с erlang?
[09:30] <catap> а то меня он обижает
[09:30] <catap> =ERROR REPORT==== 17-Sep-2009::13:26:01 ===
Bad value on output port 'tcp_inet'
[09:31] <Guybrush> facebook?
[09:31] <catap> Guybrush: thrift? да, их
[09:32] <Guybrush> а ты уверен что это он тебя обижает?
[09:32] <zert> catap: в iolist сконверть данные, потом передавай
[09:32] <catap> Guybrush: могу и я его, верю
[09:32] <catap> 1> {ok, C} = thrift_client:start_link("127.0.0.1", 9160, cassandra_thrift).
{ok,<0.33.0>}
2> thrift_client:call(C, insert, ["Keyspace1", "Standard2", {"qwe", "qwa"}, "q", 3, 0]).

=ERROR REPORT==== 17-Sep-2009::13:26:01 ===
Bad value on output port 'tcp_inet'

** exception exit: {timeout,{gen_server,call,
[<0.33.0>,
{call,insert,
["Keyspace1","Standard2",{"qwe","qwa"},"q",3,0]}]}}
in function gen_server:call/2
in call from thrift_client:call/3
3>
[09:32] <catap> собственно вся сессия выглядит так
[09:34] <Guybrush> и во что эта штука превращается при передаче?
[09:34] <catap> Guybrush: в tcpdump тихо
[09:34] <Guybrush> естессно
[09:34] <catap> Guybrush: почему?
[09:35] <Guybrush> потому что tcp_port-у не нравится что ты ему суеш
[09:35] <Guybrush> tcp_inet-у или как его там
[09:35] <zert> вот надо перед суванием в него сделать binary_to_iolist
[09:35] <Guybrush> угу
[09:36] <zert> хотя не
[09:36] <zert> binary уже iolist
[09:36] <zert> значит там не binary
[09:36] <zert> посмотри, что в сокет пихается
[10:34] <catap> zert: в каком моменте?
[10:34] <zert> ну где gen_tcp:send вызывается
[10:45] <catap> zert: а как сделать данные binary?
[10:46] <zert> у тебя туда что пихуется?
[10:46] <zert> должен iolist быть
[10:47] <catap> thrift_client:call(C, insert, ["Keyspace1", "Standard2", {"qwe", "qwa"}, "q", 3, 0]).
[10:47] <zert> а это либо binary, либо список из binary и iolist
[10:47] <zert> не, в том месте, где gen_tcp:send дёргается
[10:47] <Guybrush> не вижу вызова send в упор
[10:47] <catap> call(Client, Function, Args)
when is_pid(Client), is_atom(Function), is_list(Args) ->
case gen_server:call(Client, {call, Function, Args}) of
R = {ok, _} -> R;
R = {error, _} -> R;
{exception, Exception} -> throw(Exception)
end.
[10:47] <catap> ну а дальше оно доводится до
[10:47] <catap> write(#data{socket = Socket}, Data) ->
gen_tcp:send(Socket, Data).
[10:48] <zert> вот
[10:48] <zert> в этом месте Data - что?
[10:48] <catap> в example к thrift
[10:48] <catap> 118> f(), {ok, C} = thrift_client:start_link("localhost", 9090, thriftTest_thrif
t).
{ok,<0.271.0>}
119> thrift_client:call(C, testVoid, []).
{ok,ok}
120> thrift_client:call(C, testVoid, [asdf]).
{error,{bad_args,testVoid,[asdf]}}
121>
[10:48] <Guybrush> брр
[10:49] <zert> котап, зачем тебе трифт?
[10:49] <Guybrush> ты как будто специально запутать хочешь
[10:49] <catap> zert: затем что я хочу сходить к сервису, а это недо чудо умеет только thrift
[10:51] <catap> zert: если ты мне предложишь иной вариант, я с радостью им воспользуюсь
[10:52] <zert> не, не предложу
[10:53] <zert> ты дамп Data сделай
[10:53] <zert> что там за тип данных?
[10:53] <catap> io:format("~p~n", [Data]),
[10:53] <zert> да
[10:54] <catap> http://paste.org.ru/?urko3y
[10:54] <zert> во
[10:54] <zert> там кал какой-то, а не iolist
[10:55] <catap> zert: и как мне этот калл перевести в iolist?
[10:55] <zert> косяк где-то в thrift
[10:55] <Guybrush> какая жесть
[10:55] <zert> никак
[10:55] <zert> править надо кодировщик
[10:55] * catap хочет кому-то что-то оторвать
[10:55] <zert> {{struct,{cassandra_types,columnPath}},{"qwe","qwa"}}]
[10:55] <zert> вот этого там точно не должно быть
[10:55] <Guybrush> кто автор этого thrift_client?
[10:55] <catap> Guybrush: facebook :)
[10:56] <Guybrush> они явно против ерланга
[10:56] <zert> STOP ERLANG
[10:56] <catap> zert: ага
[10:56] <catap> тряхнем стариной!
[10:57] <Guybrush> надо смотреть сырки откуда вообще этот структ берется
[10:58] <catap> ага, я кажется понимаю
[11:00] <Guybrush> вообще вся эта конструкция как-то странно выглядит
[11:00] <zert> почему?
[11:00] <zert> как iolist проканывает и ладно
[11:01] <Guybrush> ну в принципе да, но уж больно крутой список списков
[11:01] <Guybrush> неужели нельзя было как-нить в начало вставлять там
[11:01] <Guybrush> ну это в принципе фигня конечно
[11:02] <catap> есть вероятность что я не правильно опнимаю как использовать этот thrift_client:call
[11:03] <Guybrush> а там нет обертки какой-нить вокруг него? вроде калл обычно напрямую не вызвается
[11:03] <catap> % insert(This, Keyspace, Key, Column_path, Value, Timestamp, Consistency_level)
function_info('insert', params_type) ->
{struct, [{1, string},
{2, string},
{3, {struct, {'cassandra_types', 'columnPath'}}},
{4, string},
{5, i64},
{6, i32}]}
;
[11:03] <catap> собственно thrift дает API
[11:03] <catap> %% API
-export([start_link/2, start_link/3, start_link/4,
start/3, start/4,
call/3, send_call/3, close/1]).
[11:03] <Guybrush> мда
[11:04] <zert> catap: кинь им линку на STOP ERLANG
[11:04] <catap> zert: не, я докурю :)
[11:07] <catap> zert: http://gitweb.thrift-rpc.org/?p=thrift.git;a=tree;f=lib/erl;h=5fe51f4266de7b32d9886fdec3ca02ec53c4e4d6;hb=HEAD
[11:08] <Guybrush> может я туплю, но что значит атом struct первым элементом tuple? это у них такое название record?
[11:09] <zert> catap: та меня харит вкуривать
[11:10] <catap> http://paste.org.ru/?dfbykk
[11:11] <catap> а как посмотреть trace как попал он в место?
[11:13] <zert> ну хз
[11:13] <zert> где-то видимо обрабатывается не так, как надо
[11:16] <zert> catap: мне кажется, что ожидается 3 параметра, а ты даёшь два
[11:16] <catap> в каком месте?
[11:17] <zert> {"qwe","qwa"}
[11:17] <zert> и его клинит из-за этого
[11:17] <zert> хотя могу и ошибаться
[11:17] <Guybrush> не, я так понял там надо record по имени columnPath
[11:18] <Guybrush> record этот в файле cassandra_types.hrl
[11:18] <catap> Guybrush: только странно что в интерфейсе
[11:18] <catap> а, понял, дурак
[11:19] <catap> тоже самое :)
[11:19] <Guybrush> хехе
[11:19] <catap> {{struct,{cassandra_types,columnPath}},{"qwe","qwa","qaz"}}],
[11:19] <catap> только соотвественно
[11:19] <Guybrush> ты как передал?
[11:19] <catap> thrift_client:call(C, insert, ["Keyspace1", "Standard2", {"qwe", "qwa", "qaz"}, "q", 3, 0]).
[11:20] <catap> я через erl сижу играюсь
[11:20] <Guybrush> ты не понял мои слова... record подсунь
[11:20] <zert> в erl можно прочитать файл с рекордами
[11:20] <catap> zert: как?
[11:20] <catap> я только rd() умею
[11:21] <zert> rr("file.hrl").
[11:21] <zert> help(). напиши, он много чего выдаст
[11:29] <catap> 9> thrift_client:call(C, insert, ["Keyspace1", "Standard2", #columnPath{column_family="asd", super_column="qsd", column="asd"}, "q", 3, 0]).
** exception exit: {noproc,{gen_server,call,
[<0.33.0>,
{call,insert,
["Keyspace1","Standard2",
#columnPath{column_family = "asd",super_column = "qsd",
column = "asd"},
"q",3,0]}]}}
in function gen_server:call/2
in call from thrift_client:call/3
10>
[11:30] <zert> C новый надо запустить
[11:30] <zert> тот у тебя сломался
[11:31] <valexey> а что thrift, что не ASN.1 ?
[11:31] <zert> там его не принимают
[11:31] <catap> valexey: авторы то, к чему я хочу ходить не асилили asn.1
[11:31] <zert> он клиента лабає
[11:32] <valexey> ясно
[11:32] <catap> valexey: я бы и сам взял asn1 :)
[11:32] <valexey> ну, asn.1 действительно осилить не каждый сумеет. дюже сложен он в т.ч. в реализации.
[11:32] <catap> valexey: а свой недо asn1 уже сколько человек написало?
[11:33] <valexey> ну, под плюсы например свободной приличной asn.1 либы вроде как нету.
[11:35] <zert> asn1c можно юзать
[11:35] <zert> оно под C
[11:35] <valexey> фикакаягадость
[11:35] <valexey> ;-)
[11:36] <zert> я начал писать ASN.1 канпелятор под разные языки, но дело заглохло на стадии набивки правил для парсера :)
[11:36] <zert> сын родился, теперь не до этого :)