[patches] Re: [daemon 1/1] daemon: Introduce feedback daemon

Konstantin Osipov kostja at tarantool.org
Mon Feb 12 21:15:14 MSK 2018


* imarkov <imarkov at tarantool.org> [18/02/12 10:39]:
> From: Roman Proskin <opomuc at gmail.com>
> 
> * feedback daemon sends information about instance to the
> specified host.
> * Add new options to box.cfg:
>     - feedback_enabled - switch on/off daemon, default=true.
>     - feedback_host - host to which feedbacks are sent,
>       default="https://report.tarantool.io".
>     - feedback_interval - time interval in seconds of feedbacks
>     sending, default=3600.

This looks good.

> * Add possibility to generate feedback file in json format with
> function box.feedback_save

box.feedback.save then.

> +
> +local function fill_in_feedback(feedback)
> +    if box.info.status ~= "running" then
> +        return false
> +    end
> +    feedback.tarantool_version = box.info.version
> +    feedback.server_id         = box.info.uuid
> +    feedback.cluster_id        = box.info.cluster.uuid
> +    return feedback
> +end

Please follow our Lua coding style for return values.

> +        elseif feedback ~= false then
> +            pcall(http.post, self.host, json.encode(feedback), {timeout=1})
> +        end

Did you test if this blocks? How many send per second can you
perform? Could you play with iptables and see what happens if the
address is behind a firewall?

> +box.feedback_save = function(file_name)
> +    local feedback = json.encode(box.internal.feedback_daemon.generate_feedback())
> +    local fh, err = fio.open(file_name, {'O_CREAT', 'O_RDWR', 'O_TRUNC'},
> +        tonumber('0777', 8))
> +    if not fh then
> +        error(err)
> +    end
> +    fh:write(feedback)
> +    fh:close()
> +end

Does mariadb save it to a file? Would it help to add
feedback.post() as well?

> +-- set up mock for feedback server
> +local function get_feedback(self, req)
> +    local body = req:read()
> +    local ok, data = pcall(json.decode, body)
> +    if ok then
> +        self:put({ 'feedback', body })
> +    end
> +end
> +
> +local interval = 0.1

0.01

> +
> +box.cfg{
> +    feedback_host = '0.0.0.0:4444/feedback',
> +    feedback_interval = interval,
> +}
> +
> +-- check it does not fail without server
> +local daemon = box.internal.feedback_daemon
> +daemon.start()
> +daemon.send_test()
> +local httpd = require('http.server').new('0.0.0.0', '4444')
> +httpd:route(
> +    { path = '/feedback', method = 'POST' },
> +    self_decorator(box.space._schema)(get_feedback)
> +)
> +httpd:start()
> +
> +local function check(message)
> +    while box.space._schema:get('feedback') == nil do fiber.sleep(0.001) end
> +    local data = box.space._schema:get('feedback')
> +    test:ok(data ~= nil, message)
> +    box.space._schema:delete('feedback')
> +end
> +
> +-- check if feedback has been sent and received
> +daemon.reload()
> +check("feedback received after reload")
> +
> +local errinj = box.error.injection
> +errinj.set("ERRINJ_HTTPC", true)
> +check('feedback received after errinj')
> +errinj.set("ERRINJ_HTTPC", false)
> +
> +daemon.send_test()
> +check("feedback received after explicit sending")
> +
> +box.cfg{feedback_enabled = false}
> +daemon.send_test()
> +fiber.sleep(2 * interval)
> +test:ok(box.space._schema:get('feedback') == nil, "no feedback after disabling")
> +
> +box.cfg{feedback_enabled = true}
> +daemon.send_test()
> +check("feedback after start")
> +
> +daemon.stop()
> +daemon.send_test()
> +fiber.sleep(2 * interval)
> +test:ok(box.space._schema:get('feedback') == nil, "no feedback after stop")
> +
> +daemon.start()
> +daemon.send_test()
> +check("feedback after start")
> +
> +box.feedback_save("feedback.json")
> +daemon.send_test()
> +while box.space._schema:get('feedback') == nil do fiber.sleep(0.001) end
> +local data = box.space._schema:get('feedback')
> +local fio = require("fio")
> +local fh = fio.open("feedback.json")
> +test:ok(fh, "file is created")
> +local file_data = fh:read()
> +test:is(file_data, data[2], "data is equal")
> +fh:close()
> +fio.unlink("feedback.json")
> +
> +test:check()
> +os.exit(0)

Looks like a good test to me, thanks!



-- 
Konstantin Osipov, Moscow, Russia, +7 903 626 22 32
http://tarantool.org - www.twitter.com/kostja_osipov



More information about the Tarantool-patches mailing list