Implement a pool that lives as long as the fiber.
The pool is destroyed when the fiber is destroyed
or goes to the fiber cache.

Move fiber->name to be allocated in this pool.
Remove a static array for palloc_pool->name.
Now that we have 2 pools per fiber,
and keep the same name in fiber->name, fiber->gc_pool->name
and fiber->eter_pool->name, reserving so much
space for names looks costly.

Fix a memory leak when remote address was allocated
in etet_pool (eternal memory pool) in recovery_follow_remote
(start of replication).

Remove fiber->data, as redundant and confusing.
fiber->f_data is sufficient for all possible needs.

Fix a bug when fiber_server::data was never initialized
but passed to "on_bind" callback of fiber_server
(this worked since no single "on_bind" callback uses
its "data" argument).
---
 core/admin.m         |    2 +-
 core/fiber.m         |   45 +++++++++++++++++++++++++++------------------
 core/log_io_remote.m |   11 ++++++-----
 core/palloc.m        |    5 ++---
 core/say.m           |    2 +-
 include/fiber.h      |   17 ++++++++++-------
 include/log_io.h     |    1 +
 include/palloc.h     |    1 +
 8 files changed, 49 insertions(+), 35 deletions(-)

diff --git a/core/admin.m b/core/admin.m
index 525c624..fc6a10e 100644
--- a/core/admin.m
+++ b/core/admin.m
@@ -1465,7 +1465,7 @@ case 107:
 
 
 static void
-admin_handler(void *_data __attribute__((unused)))
+admin_handler(void *data __attribute__((unused)))
 {
        for (;;) {
                if (admin_dispatch() <= 0)
diff --git a/core/fiber.m b/core/fiber.m
index 9531ede..6a5fef4 100644
--- a/core/fiber.m
+++ b/core/fiber.m
@@ -145,9 +145,9 @@ fiber_wakeup(struct fiber *f)
  * Currently cancellation can only be synchronous: this call
  * returns only when the subject fiber has terminated.
  *
- * The fiber which is cancelled, has tnt_FiberCancelException
- * raised in it. For cancellation to work, this exception type
- * should be re-raised whenever (if) it is caught.
+ * The fiber which is cancelled, has FiberCancelException raised
+ * in it. For cancellation to work, this exception type should be
+ * re-raised whenever (if) it is caught.
  */
 
 void
@@ -174,7 +174,7 @@ fiber_cancel(struct fiber *f)
 
 
 /** Test if this fiber is in a cancellable state and was indeed
- * cancelled, and raise an exception (tnt_FiberCancelException) if
+ * cancelled, and raise an exception (FiberCancelException) if
  * that's the case.
  */
 
@@ -419,13 +419,13 @@ fiber_gc(void)
 static void
 fiber_zombificate()
 {
-       fiber_set_name(fiber, "zombie");
        fiber->f = NULL;
-       fiber->data = NULL;
        unregister_fid(fiber);
        fiber->fid = 0;
        fiber->flags = 0;
+       prelease(fiber->eter_pool);
        fiber_alloc(fiber);
+       fiber_set_name(fiber, "zombie");
 
        SLIST_INSERT_HEAD(&zombie_fibers, fiber, zombie_link);
 }
@@ -467,7 +467,8 @@ void
 fiber_set_name(struct fiber *fiber, const char *name)
 {
        assert(name != NULL);
-       snprintf(fiber->name, sizeof(fiber->name), "%s", name);
+       fiber->name = palloc(fiber->eter_pool, strlen(name)+1);
+       strcpy((char *) fiber->name, name);
 }
 
 /* fiber never dies, just become zombie */
@@ -491,8 +492,9 @@ fiber_create(const char *name, int fd, int inbox_size, void 
(*f) (void *), void
                        return NULL;
 
                fiber->gc_pool = palloc_create_pool("");
+               fiber->eter_pool = palloc_create_pool("");
                fiber->inbox = palloc(eter_pool, (sizeof(*fiber->inbox) +
-                                                 inbox_size * sizeof(struct 
tbuf *)));
+                                      inbox_size * sizeof(struct tbuf *)));
                fiber->inbox->size = inbox_size;
 
                fiber_alloc(fiber);
@@ -514,6 +516,7 @@ fiber_create(const char *name, int fd, int inbox_size, void 
(*f) (void *), void
        fiber->waiter = NULL;
        fiber_set_name(fiber, name);
        palloc_set_name(fiber->gc_pool, fiber->name);
+       palloc_set_name(fiber->eter_pool, fiber->name);
        register_fid(fiber);
 
        return fiber;
@@ -533,6 +536,7 @@ fiber_destroy(struct fiber *f)
                return;
 
        palloc_destroy_pool(f->gc_pool);
+       palloc_destroy_pool(f->eter_pool);
        tarantool_coro_destroy(&f->coro);
 }
 
@@ -545,16 +549,17 @@ fiber_destroy_all()
 }
 
 
-char *
+const char *
 fiber_peer_name(struct fiber *fiber)
 {
        struct sockaddr_in peer;
+       const int PEER_NAME_MAXLEN=32;
        socklen_t peer_len = sizeof(peer);
 
        if (!fiber->has_peer || fiber->fd < 3)
                return NULL;
 
-       if (fiber->peer_name[0] != 0)
+       if (fiber->peer_name != NULL)
                return fiber->peer_name;
 
        memset(&peer, 0, peer_len);
@@ -565,7 +570,9 @@ fiber_peer_name(struct fiber *fiber)
        if (memcmp(&peer.sin_addr, &zero, sizeof(zero)) == 0)
                return NULL;
 
-       snprintf(fiber->peer_name, sizeof(fiber->peer_name),
+       fiber->peer_name =  palloc(fiber->eter_pool, PEER_NAME_MAXLEN+1);
+
+       snprintf((char*) fiber->peer_name, PEER_NAME_MAXLEN,
                 "%s:%d", inet_ntoa(peer.sin_addr), ntohs(peer.sin_port));
 
        fiber->cookie = 0;
@@ -587,7 +594,7 @@ fiber_close(void)
 
        fiber->fd = -1;
        fiber->has_peer = false;
-       fiber->peer_name[0] = 0;
+       fiber->peer_name = 0;
 
        return r;
 }
@@ -1059,7 +1066,7 @@ spawn_child(const char *name, int inbox_size, struct tbuf 
*(*handler) (void *, s
                c->out->flags |= FIBER_READING_INBOX;
                return c;
        } else {
-               char child_name[sizeof(fiber->name)];
+               char child_name[FIBER_NAME_MAXLEN];
                /*
                 * Move to an own process group, to not receive
                 * signals from the controlling tty.
@@ -1078,7 +1085,7 @@ spawn_child(const char *name, int inbox_size, struct tbuf 
*(*handler) (void *, s
 static void
 tcp_server_handler(void *data)
 {
-       struct fiber_server *server = fiber->data;
+       struct fiber_server *server = (void*) data;
        struct fiber *h;
        char name[FIBER_NAME_MAXLEN];
        int fd;
@@ -1110,7 +1117,7 @@ tcp_server_handler(void *data)
                        }
 
                        snprintf(name, sizeof(name), "%i/handler", 
server->port);
-                       h = fiber_create(name, fd, -1, server->handler, data);
+                       h = fiber_create(name, fd, -1, server->handler, 
server->data);
                        if (h == NULL) {
                                say_error("can't create handler fiber, dropping 
client connection");
                                close(fd);
@@ -1137,12 +1144,13 @@ fiber_server(const char *name, int port, void 
(*handler) (void *data), void *dat
        struct fiber *s;
 
        snprintf(server_name, sizeof(server_name), "%i/%s", port, name);
-       s = fiber_create(server_name, -1, -1, tcp_server_handler, data);
-       s->data = server = palloc(eter_pool, sizeof(struct fiber_server));
+       server = palloc(eter_pool, sizeof(struct fiber_server));
        assert(server != NULL);
+       server->data = data;
        server->port = port;
        server->handler = handler;
        server->on_bind = on_bind;
+       s = fiber_create(server_name, -1, -1, tcp_server_handler, server);
 
        fiber_call(s);          /* give a handler a chance */
        return s;
@@ -1289,8 +1297,9 @@ fiber_init(void)
 
        memset(&sched, 0, sizeof(sched));
        sched.fid = 1;
+       sched.eter_pool = palloc_create_pool("sched");
        fiber_set_name(&sched, "sched");
-       sched.gc_pool = palloc_create_pool(sched.name);
+       sched.gc_pool = palloc_create_pool(fiber->name);
 
        sp = call_stack;
        fiber = &sched;
diff --git a/core/log_io_remote.m b/core/log_io_remote.m
index f8d11e4..55eb76c 100644
--- a/core/log_io_remote.m
+++ b/core/log_io_remote.m
@@ -75,7 +75,7 @@ remote_row_reader_v11()
 }
 
 static struct tbuf *
-remote_read_row(i64 initial_lsn)
+remote_read_row(struct sockaddr_in *remote_addr, i64 initial_lsn)
 {
        struct tbuf *row;
        bool warning_said = false;
@@ -85,7 +85,7 @@ remote_read_row(i64 initial_lsn)
 
        for (;;) {
                if (fiber->fd < 0) {
-                       if (fiber_connect(fiber->data) < 0) {
+                       if (fiber_connect(remote_addr) < 0) {
                                err = "can't connect to master";
                                goto err;
                        }
@@ -139,7 +139,7 @@ pull_from_remote(void *state)
 
        for (;;) {
                fiber_setcancelstate(true);
-               row = remote_read_row(r->confirmed_lsn + 1);
+               row = remote_read_row(r->remote_addr, r->confirmed_lsn + 1);
                fiber_setcancelstate(false);
 
                r->recovery_lag = ev_now() - row_v11(row)->tm;
@@ -208,12 +208,12 @@ recovery_follow_remote(struct recovery_state *r, const 
char *remote)
                return;
        }
 
-       addr = palloc(eter_pool, sizeof(*addr));
+       addr = palloc(f->eter_pool, sizeof(*addr));
        memset(addr, 0, sizeof(*addr));
        addr->sin_family = AF_INET;
        memcpy(&addr->sin_addr.s_addr, &server, sizeof(server));
        addr->sin_port = htons(port);
-       f->data = addr;
+       r->remote_addr = addr;
        memcpy(&r->cookie, &addr, MIN(sizeof(r->cookie), sizeof(addr)));
        fiber_call(f);
        r->remote_recovery = f;
@@ -225,4 +225,5 @@ recovery_stop_remote(struct recovery_state *r)
        say_info("shutting down the replica");
        fiber_cancel(r->remote_recovery);
        r->remote_recovery = NULL;
+       r->remote_addr = NULL;
 }
diff --git a/core/palloc.m b/core/palloc.m
index a8f7eb4..76f65b5 100644
--- a/core/palloc.m
+++ b/core/palloc.m
@@ -68,7 +68,7 @@ struct palloc_pool {
        struct chunk_list_head chunks;
         SLIST_ENTRY(palloc_pool) link;
        size_t allocated;
-       char name[PALLOC_POOL_NAME_MAXLEN];
+       const char *name;
 };
 
 SLIST_HEAD(palloc_pool_head, palloc_pool) pools;
@@ -395,8 +395,7 @@ palloc_stat(struct tbuf *buf)
 void
 palloc_set_name(struct palloc_pool *pool, const char *name)
 {
-       assert(name != NULL);
-       snprintf(pool->name, sizeof(pool->name), "%s", name);
+       pool->name = name;
 }
 
 size_t
diff --git a/core/say.m b/core/say.m
index c0aac43..fd3d517 100644
--- a/core/say.m
+++ b/core/say.m
@@ -113,7 +113,7 @@ say_logger_init(int nonblock)
 void
 vsay(int level, const char *filename, int line, const char *error, const char 
*format, va_list ap)
 {
-       char *peer_name = fiber_peer_name(fiber);
+       const char *peer_name = fiber_peer_name(fiber);
        size_t p = 0, len = PIPE_BUF;
        const char *f;
        static char buf[PIPE_BUF];
diff --git a/include/fiber.h b/include/fiber.h
index ec3caf6..d510f3c 100644
--- a/include/fiber.h
+++ b/include/fiber.h
@@ -77,6 +77,11 @@ struct fiber {
        struct tarantool_coro coro;
        /* A garbage-collected memory pool. */
        struct palloc_pool *gc_pool;
+       /*
+        * An "eternal" pool, all memory allocated in it
+        * is kept until fiber end.
+        */
+       struct palloc_pool *eter_pool;
        uint32_t fid;
        int fd;
 
@@ -92,17 +97,15 @@ struct fiber {
 
        struct ring *inbox;
 
-       char name[FIBER_NAME_MAXLEN];
+       /* ASCIIZ name of this fiber. */
+       const char *name;
        void (*f) (void *);
        void *f_data;
 
-       void *data;
-       /** Information about the last error. */
-       void *diagnostics;
-
        u64 cookie;
        bool has_peer;
-       char peer_name[32];
+       /* ASCIIZ name of the peer, if there is one. */
+       const char *peer_name;
 
        u32 flags;
 
@@ -173,7 +176,7 @@ bool write_inbox(struct fiber *recipient, struct tbuf *msg);
 int inbox_size(struct fiber *recipient);
 void wait_inbox(struct fiber *recipient);
 
-char *fiber_peer_name(struct fiber *fiber);
+const char *fiber_peer_name(struct fiber *fiber);
 ssize_t fiber_read(void *buf, size_t count);
 ssize_t fiber_write(const void *buf, size_t count);
 int fiber_close(void);
diff --git a/include/log_io.h b/include/log_io.h
index a1ce9bd..242a8c1 100644
--- a/include/log_io.h
+++ b/include/log_io.h
@@ -109,6 +109,7 @@ struct recovery_state {
        /* row_handler will be presented by most recent format of data
           log_io_class->reader is responsible of converting data from old 
format */
        row_handler *row_handler;
+       struct sockaddr_in *remote_addr;
        struct fiber *remote_recovery;
 
        ev_timer wal_timer;
diff --git a/include/palloc.h b/include/palloc.h
index 370f86e..4f6ad19 100644
--- a/include/palloc.h
+++ b/include/palloc.h
@@ -43,6 +43,7 @@ void prelease_after(struct palloc_pool *pool, size_t after);
 struct palloc_pool *palloc_create_pool(const char *name);
 void palloc_destroy_pool(struct palloc_pool *);
 void palloc_free_unused(void);
+/* Set a name of this pool. Does not copy the argument name. */
 void palloc_set_name(struct palloc_pool *, const char *);
 size_t palloc_allocated(struct palloc_pool *);
 
-- 
1.7.0.4


_______________________________________________
Mailing list: https://launchpad.net/~tarantool-developers
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~tarantool-developers
More help   : https://help.launchpad.net/ListHelp

Reply via email to