Skip to content

Commit

Permalink
Merge pull request #607 from Netflix/dev
Browse files Browse the repository at this point in the history
Merge dev to v0.6
  • Loading branch information
smukil authored Sep 25, 2018
2 parents bf6b7af + caa7995 commit 6147d56
Show file tree
Hide file tree
Showing 105 changed files with 24,910 additions and 26,245 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ Dynomite can be configured through a YAML file specified by the -c or --conf-fil
+ **gos_interval**: The sleeping time in milliseconds at the end of a gossip round.
+ **tokens**: The token(s) owned by a node. Currently, we don't support vnode yet so this only works with one token for the time being.
+ **dyn_seed_provider**: A seed provider implementation to provide a list of seed nodes.
+ **dyn_seeds**: A list of seed nodes in the format: address:port:rack:dc:tokens (node that vnode is not supported yet)
+ **dyn_seeds**: A list of seed nodes in the format: address:port:rack:dc:tokens (note that vnode is not supported yet)
+ **listen**: The listening address and port (name:port or ip:port) for this server pool.
+ **timeout**: The timeout value in msec that we wait for to establish a connection to the server or receive a response from a server. By default, we wait indefinitely.
+ **preconnect**: A boolean value that controls if dynomite should preconnect to all the servers in this pool on process start. Defaults to false.
Expand Down
247 changes: 112 additions & 135 deletions src/dyn_array.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* Dynomite - A thin, distributed replication layer for multi non-distributed storages.
* Copyright (C) 2014 Netflix, Inc.
*/
* Dynomite - A thin, distributed replication layer for multi non-distributed
* storages. Copyright (C) 2014 Netflix, Inc.
*/

/*
* twemproxy - A fast and lightweight proxy for memcached protocol.
Expand All @@ -20,209 +20,186 @@
* limitations under the License.
*/

#include "dyn_array.h"

#include <stdlib.h>

#include "dyn_core.h"
#include "dyn_util.h"

struct array *
array_create(uint32_t n, size_t size)
{
struct array *a;
struct array *array_create(uint32_t n, size_t size) {
struct array *a;

ASSERT(n != 0 && size != 0);
ASSERT(n != 0 && size != 0);

a = dn_alloc(sizeof(*a));
if (a == NULL) {
return NULL;
}
a = dn_alloc(sizeof(*a));
if (a == NULL) {
return NULL;
}

a->elem = dn_alloc(n * size);
if (a->elem == NULL) {
dn_free(a);
return NULL;
}
a->elem = dn_alloc(n * size);
if (a->elem == NULL) {
dn_free(a);
return NULL;
}

a->nelem = 0;
a->size = size;
a->nalloc = n;
a->nelem = 0;
a->size = size;
a->nalloc = n;

return a;
return a;
}

void
array_destroy(struct array *a)
{
array_deinit(a);
dn_free(a);
void array_destroy(struct array *a) {
array_deinit(a);
dn_free(a);
}

rstatus_t
array_init(struct array *a, uint32_t n, size_t size)
{
ASSERT(n != 0 && size != 0);
rstatus_t array_init(struct array *a, uint32_t n, size_t size) {
ASSERT(n != 0 && size != 0);

a->elem = dn_alloc(n * size);
if (a->elem == NULL) {
return DN_ENOMEM;
}
a->elem = dn_alloc(n * size);
if (a->elem == NULL) {
return DN_ENOMEM;
}

a->nelem = 0;
a->size = size;
a->nalloc = n;
a->nelem = 0;
a->size = size;
a->nalloc = n;

return DN_OK;
return DN_OK;
}

void
array_deinit(struct array *a)
{
//ASSERT(a->nelem == 0);
void array_deinit(struct array *a) {
// ASSERT(a->nelem == 0);

if (a->elem != NULL) {
dn_free(a->elem);
}
if (a->elem != NULL) {
dn_free(a->elem);
}
}

uint32_t
array_idx(struct array *a, void *elem)
{
uint8_t *p, *q;
uint32_t off, idx;
uint32_t array_idx(struct array *a, void *elem) {
uint8_t *p, *q;
uint32_t off, idx;

ASSERT(elem >= a->elem);
ASSERT(elem >= a->elem);

p = a->elem;
q = elem;
off = (uint32_t)(q - p);
p = a->elem;
q = elem;
off = (uint32_t)(q - p);

ASSERT(off % (uint32_t)a->size == 0);
ASSERT(off % (uint32_t)a->size == 0);

idx = off / (uint32_t)a->size;
idx = off / (uint32_t)a->size;

return idx;
return idx;
}

void *
array_push(struct array *a)
{
void *elem, *new;
size_t size;

if (a->nelem == a->nalloc) {
void *array_push(struct array *a) {
void *elem, *new;
size_t size;

/* the array is full; allocate new array */
size = a->size * a->nalloc;
new = dn_realloc(a->elem, 2 * size);
if (new == NULL) {
return NULL;
}

a->elem = new;
a->nalloc *= 2;
if (a->nelem == a->nalloc) {
/* the array is full; allocate new array */
size = a->size * a->nalloc;
new = dn_realloc(a->elem, 2 * size);
if (new == NULL) {
return NULL;
}

elem = (uint8_t *)a->elem + a->size * a->nelem;
a->nelem++;
a->elem = new;
a->nalloc *= 2;
}

elem = (uint8_t *)a->elem + a->size * a->nelem;
a->nelem++;

return elem;
return elem;
}

void *
array_pop(struct array *a)
{
void *elem;
void *array_pop(struct array *a) {
void *elem;

ASSERT(a->nelem != 0);
ASSERT(a->nelem != 0);

a->nelem--;
elem = (uint8_t *)a->elem + a->size * a->nelem;
a->nelem--;
elem = (uint8_t *)a->elem + a->size * a->nelem;

return elem;
return elem;
}

void *
array_get(struct array *a, uint32_t idx)
{
void *elem;
void *array_get(struct array *a, uint32_t idx) {
void *elem;

ASSERT(a->nelem != 0);
ASSERT(idx < a->nelem);
ASSERT(a->nelem != 0);
ASSERT(idx < a->nelem);

elem = (uint8_t *)a->elem + (a->size * idx);
elem = (uint8_t *)a->elem + (a->size * idx);

return elem;
return elem;
}

void *
array_top(struct array *a)
{
ASSERT(a->nelem != 0);
void *array_top(struct array *a) {
ASSERT(a->nelem != 0);

return array_get(a, a->nelem - 1);
return array_get(a, a->nelem - 1);
}

void
array_swap(struct array *a, struct array *b)
{
struct array tmp;
void array_swap(struct array *a, struct array *b) {
struct array tmp;

tmp = *a;
*a = *b;
*b = tmp;
tmp = *a;
*a = *b;
*b = tmp;
}

/*
* Sort nelem elements of the array in ascending order based on the
* compare comparator.
*/
void
array_sort(struct array *a, array_compare_t compare)
{
ASSERT(a->nelem != 0);
void array_sort(struct array *a, array_compare_t compare) {
ASSERT(a->nelem != 0);

qsort(a->elem, a->nelem, a->size, compare);
qsort(a->elem, a->nelem, a->size, compare);
}

/*
* Calls the func once for each element in the array as long as func returns
* success. On failure short-circuits and returns the error status.
*/
rstatus_t
array_each(struct array *a, array_each_t func)
{
uint32_t i, nelem;
rstatus_t array_each(struct array *a, array_each_t func) {
uint32_t i, nelem;

ASSERT(func != NULL);
ASSERT(func != NULL);

for (i = 0, nelem = array_n(a); i < nelem; i++) {
void *elem = array_get(a, i);
rstatus_t status;
for (i = 0, nelem = array_n(a); i < nelem; i++) {
void *elem = array_get(a, i);
rstatus_t status;

status = func(elem);
if (status != DN_OK) {
return status;
}
status = func(elem);
if (status != DN_OK) {
return status;
}
}

return DN_OK;
return DN_OK;
}

rstatus_t
array_each_2(struct array *a, array_each_2_t func, void *data1, void *data2)
{
uint32_t i, nelem;
rstatus_t array_each_2(struct array *a, array_each_2_t func, void *data1,
void *data2) {
uint32_t i, nelem;

ASSERT(func != NULL);
ASSERT(func != NULL);

for (i = 0, nelem = array_n(a); i < nelem; i++) {
void *elem = array_get(a, i);
rstatus_t status;
for (i = 0, nelem = array_n(a); i < nelem; i++) {
void *elem = array_get(a, i);
rstatus_t status;

status = func(elem, data1, data2);
if (status != DN_OK) {
return status;
}
status = func(elem, data1, data2);
if (status != DN_OK) {
return status;
}
}

return DN_OK;
return DN_OK;
}
Loading

0 comments on commit 6147d56

Please sign in to comment.