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