2 * Copyright (c) 2016 Mohamed Aslan <maslan@sce.carleton.ca>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
40 static struct v_node vnodes
[] = {
41 {"A", "127.0.0.1", 5000, 2,
45 {"B", "127.0.0.1", 5001, 2,
49 {"C", "127.0.0.1", 5002, 2,
50 {"12hello", "world12"},
58 char *keys
[MAX_RKEYS
];
59 char *vals
[MAX_RKEYS
];
60 int visited
[MAX_RKEYS
];
63 static struct result results
[] = {
66 {"hello", "1hello", "12hello", "world1", "world12"},
67 {"world", "world", "world", "hello", "hello"},
72 {"1hello", "world", "world1"},
73 {"world", "hello", "hello"},
78 {"hello", "12hello", "world", "world12"},
79 {"world", "world", "hello", "hello"},
86 struct dht_node
*node
;
91 lfind(const char *key
, const char *val
, struct result
*r
)
95 for (i
= 0 ; i
< r
->n
; i
++) {
96 if (!strcmp(key
, r
->keys
[i
]) && !strcmp(val
, r
->vals
[i
]) && !r
->visited
[i
]) {
105 test_thread(void *arg
)
108 int me
= ((struct args
*)arg
)->nidx
;
109 struct dht_node
*n
= ((struct args
*)arg
)->node
;
110 struct hashtab
*ht
= (struct hashtab
*)n
->ht
;
112 size_t key_size
, val_size
;
118 for (i
= 0 ; i
< vnodes
[me
].n_keys
; i
++) {
119 if (!dht_put_tunable(n
, vnodes
[me
].keys
[i
], vnodes
[me
].vals
[i
], N_REPLICAS
))
120 printf("FAILED [%s] dht_put_tunable.\n", n
->id
);
124 HASHTAB_FOREACH(*ht
, iter
, key
, key_size
, val
, val_size
) {
125 if (lfind(key
, val
, &results
[me
])) {
129 printf("FAILED [%s] %s -> %s\n", n
->id
, key
, val
);
146 n
= malloc(sizeof(struct dht_node
));
147 if (!dht_init(n
, vnodes
[me
].id
, vnodes
[me
].port
, N_REPLICAS
, 0, NULL
))
150 for (i
= 0 ; i
< N_NODES
; i
++)
152 dht_add_peer(n
, vnodes
[i
].id
, vnodes
[i
].ip
, vnodes
[i
].port
);
154 a
= malloc(sizeof(struct args
));
157 if (pthread_create(&tt
, NULL
, test_thread
, a
))
158 err(1, "pthread_create");
161 errx(1, "should not reach here!");
166 main(int argc
, char **argv
)
168 int i
, status
, fail
= 0;
171 for (i
= 0 ; i
< N_NODES
; i
++) {
185 if (WIFEXITED(status
) && WEXITSTATUS(status
))