This commit is contained in:
Daniel Byrne 2022-06-14 20:34:03 -04:00
parent e878bbfd7b
commit 457d183bf2
5 changed files with 112 additions and 78 deletions

View File

@ -733,8 +733,10 @@ public:
bipbuf_t* bipbuf_out[3]; bipbuf_t* bipbuf_out[3];
pthread_mutex_t* lock_in[3]; pthread_mutex_t* lock_in[3];
pthread_mutex_t* lock_out[3]; pthread_mutex_t* lock_out[3];
pthread_cond_t* cond_in[3]; pthread_cond_t* cond_in_not_empty[3];
pthread_cond_t* cond_out[3]; pthread_cond_t* cond_in_not_full[3];
pthread_cond_t* cond_out_not_empty[3];
pthread_cond_t* cond_out_not_full[3];
private: private:
string hostname1; string hostname1;
@ -885,8 +887,13 @@ public:
bipbuf_t* bipbuf_out[3]; bipbuf_t* bipbuf_out[3];
pthread_mutex_t* lock_in[3]; pthread_mutex_t* lock_in[3];
pthread_mutex_t* lock_out[3]; pthread_mutex_t* lock_out[3];
pthread_cond_t* cond_in[3];
pthread_cond_t* cond_out[3]; int *bipbuf_out_bytes[3];
int *bipbuf_in_bytes[3];
pthread_cond_t* cond_in_not_empty[3];
pthread_cond_t* cond_in_not_full[3];
pthread_cond_t* cond_out_not_empty[3];
pthread_cond_t* cond_out_not_full[3];
private: private:
string hostname1; string hostname1;

View File

@ -463,8 +463,12 @@ int ConnectionMultiApproxBatchShm::do_connect() {
bipbuf_t bipbuf_out; bipbuf_t bipbuf_out;
pthread_mutex_t lock_in; pthread_mutex_t lock_in;
pthread_mutex_t lock_out; pthread_mutex_t lock_out;
pthread_cond_t cond_in; pthread_cond_t cond_in_not_empty;
pthread_cond_t cond_out; pthread_cond_t cond_in_not_full;
pthread_cond_t cond_out_not_empty;
pthread_cond_t cond_out_not_full;
int bipbuf_in_bytes;
int bipbuf_out_bytes;
int shared_id; int shared_id;
} shared_t; } shared_t;
@ -504,15 +508,24 @@ int ConnectionMultiApproxBatchShm::do_connect() {
bipbuf_out[1] = &share_l1->bipbuf_in; bipbuf_out[1] = &share_l1->bipbuf_in;
bipbuf_out[2] = &share_l2->bipbuf_in; bipbuf_out[2] = &share_l2->bipbuf_in;
bipbuf_in_bytes[1] = &share_l1->bipbuf_out_bytes;
bipbuf_in_bytes[2] = &share_l2->bipbuf_out_bytes;
bipbuf_out_bytes[1] = &share_l1->bipbuf_in_bytes;
bipbuf_out_bytes[2] = &share_l2->bipbuf_in_bytes;
lock_in[1] = &share_l1->lock_out; lock_in[1] = &share_l1->lock_out;
lock_in[2] = &share_l2->lock_out; lock_in[2] = &share_l2->lock_out;
lock_out[1] = &share_l1->lock_in; lock_out[1] = &share_l1->lock_in;
lock_out[2] = &share_l2->lock_in; lock_out[2] = &share_l2->lock_in;
cond_in[1] = &share_l1->cond_out; cond_in_not_empty[1] = &share_l1->cond_out_not_empty;
cond_in[2] = &share_l2->cond_out; cond_in_not_empty[2] = &share_l2->cond_out_not_empty;
cond_out[1] = &share_l1->cond_in; cond_in_not_full[1] = &share_l1->cond_out_not_full;
cond_out[2] = &share_l2->cond_in; cond_in_not_full[2] = &share_l2->cond_out_not_full;
cond_out_not_empty[1] = &share_l1->cond_in_not_empty;
cond_out_not_empty[2] = &share_l2->cond_in_not_empty;
cond_out_not_full[1] = &share_l1->cond_in_not_full;
cond_out_not_full[2] = &share_l2->cond_in_not_full;
read_state = IDLE; read_state = IDLE;
return connected; return connected;
} }
@ -631,24 +644,25 @@ int ConnectionMultiApproxBatchShm::send_write_buffer(int level) {
pthread_mutex_lock(lock_out[level]); pthread_mutex_lock(lock_out[level]);
int to_write = buffer_write_nbytes[level]; int to_write = buffer_write_nbytes[level];
int gtg = bipbuf_unused(bipbuf_out[level]) >= to_write ? 1 : 0; int gtg = bipbuf_unused(bipbuf_out[level]) >= to_write ? 1 : 0;
if (gtg) { while (gtg == 0) {
int ret = bipbuf_offer(bipbuf_out[level],buffer_write[level],to_write); pthread_cond_wait(cond_out_not_full[level],lock_out[level]);
if (ret != to_write) { gtg = bipbuf_unused(bipbuf_out[level]) >= to_write ? 1 : 0;
fprintf(stderr,"error writing buffer! level %d, size %d\n",level,to_write);
}
issued_queue[level] = buffer_write_n[level];
buffer_write_n[level] = 0;
buffer_write_pos[level] = buffer_write[level];
memset(buffer_write_pos[level],0,buffer_write_nbytes[level]);
stats.tx_bytes += buffer_write_nbytes[level];
buffer_write_nbytes[level] = 0;
rc = 2;
pthread_cond_signal(cond_out[level]);
pthread_mutex_unlock(lock_out[level]);
} else {
pthread_mutex_unlock(lock_out[level]);
rc = 1;
} }
int ret = bipbuf_offer(bipbuf_out[level],buffer_write[level],to_write);
if (ret != to_write) {
fprintf(stderr,"error writing buffer! level %d, size %d\n",level,to_write);
}
*bipbuf_out_bytes[level] += to_write;
//fprintf(stderr,"writing %d to %d, total %d\n",to_write,level,*bipbuf_out_bytes[level]);
issued_queue[level] = buffer_write_n[level];
buffer_write_n[level] = 0;
buffer_write_pos[level] = buffer_write[level];
memset(buffer_write_pos[level],0,buffer_write_nbytes[level]);
stats.tx_bytes += buffer_write_nbytes[level];
buffer_write_nbytes[level] = 0;
rc = 2;
pthread_cond_signal(cond_out_not_empty[level]);
pthread_mutex_unlock(lock_out[level]);
return rc; return rc;
} }
@ -675,18 +689,6 @@ int ConnectionMultiApproxBatchShm::add_get_op_to_queue(Operation *pop, int level
//} //}
h.opaque = htonl(pop->opaque); h.opaque = htonl(pop->opaque);
//int to_write = buffer_write_nbytes[level] + 24 + keylen;
//int gtg = bipbuf_unused(bipbuf_out[level]) >= to_write ? 1 : 0;
//if (gtg == 0) {
// switch (level) {
// case 1:
// read_callback1();
// break;
// case 2:
// read_callback2();
// break;
// }
//}
memcpy(buffer_write_pos[level], &h, 24); memcpy(buffer_write_pos[level], &h, 24);
buffer_write_pos[level] += 24; buffer_write_pos[level] += 24;
@ -696,7 +698,7 @@ int ConnectionMultiApproxBatchShm::add_get_op_to_queue(Operation *pop, int level
buffer_write_nbytes[level] += 24 + keylen; buffer_write_nbytes[level] += 24 + keylen;
int res = 1; int res = 1;
if (buffer_write_n[level] >= (uint32_t)options.depth && cb == 0) { if (buffer_write_n[level] >= (uint32_t)options.depth) { // && cb == 0) {
res = send_write_buffer(level); res = send_write_buffer(level);
} }
return res; return res;
@ -733,7 +735,7 @@ int ConnectionMultiApproxBatchShm::issue_get_with_len(Operation *pop, double now
} }
//put op into queue //put op into queue
return add_get_op_to_queue(pop,level); return add_get_op_to_queue(pop,level,0);
} }
/** /**
@ -771,7 +773,7 @@ int ConnectionMultiApproxBatchShm::issue_get_with_len(const char* key, int value
pop->l1 = l1; pop->l1 = l1;
} }
return add_get_op_to_queue(pop,level,0); return add_get_op_to_queue(pop,level,1);
} }
@ -978,7 +980,7 @@ int ConnectionMultiApproxBatchShm::add_set_to_queue(Operation *pop, int level, c
buffer_write_nbytes[level] += length + 32 + keylen; buffer_write_nbytes[level] += length + 32 + keylen;
int ret = 1; int ret = 1;
if (buffer_write_n[level] >= (uint32_t)options.depth && cb == 0) { if (buffer_write_n[level] >= (uint32_t)options.depth) { // && cb == 0) {
ret = send_write_buffer(level); ret = send_write_buffer(level);
} }
return ret; return ret;
@ -1001,7 +1003,7 @@ int ConnectionMultiApproxBatchShm::issue_set(Operation *pop, const char* value,
pop->opaque = opaque[level]++; pop->opaque = opaque[level]++;
pop->flags = flags; pop->flags = flags;
return add_set_to_queue(pop,level,value); return add_set_to_queue(pop,level,value,0);
} }
@ -1027,7 +1029,7 @@ int ConnectionMultiApproxBatchShm::issue_set(const char* key, const char* value,
pop->flags = flags; pop->flags = flags;
pop->clsid = get_class(length,strlen(key)); pop->clsid = get_class(length,strlen(key));
return add_set_to_queue(pop,level,value,0); return add_set_to_queue(pop,level,value,1);
} }
@ -1202,7 +1204,7 @@ size_t ConnectionMultiApproxBatchShm::handle_response_batch(unsigned char *rbuf_
size_t read_bytes, size_t consumed_bytes, size_t read_bytes, size_t consumed_bytes,
int level, int extra) { int level, int extra) {
if (rbuf_pos[0] != 129) { if (rbuf_pos[0] != 129) {
//fprintf(stderr,"cid %d we don't have a valid header %u\n",cid,rbuf_pos[0]); fprintf(stderr,"cid %d we don't have a valid header %u\n",cid,rbuf_pos[0]);
//buffer_read_pos[level] = rbuf_pos; //buffer_read_pos[level] = rbuf_pos;
//buffer_read_n[level] = 1; //buffer_read_n[level] = 1;
return 0; return 0;
@ -1216,7 +1218,7 @@ size_t ConnectionMultiApproxBatchShm::handle_response_batch(unsigned char *rbuf_
//buffer_lasthdr[level] = rbuf_pos; //buffer_lasthdr[level] = rbuf_pos;
//buffer_read_n[level] = need; //buffer_read_n[level] = need;
//buffer_read_nbytes[level] = have; //buffer_read_nbytes[level] = have;
//fprintf(stderr,"cid %d - we don't have enough header data, need %lu more bytes, have %lu (targetLen: %d) (read_bytes %ld) (extra %d) %d)\n",cid,need,have,24,read_bytes,extra,level); fprintf(stderr,"cid %d - we don't have enough header data, need %lu more bytes, have %lu (targetLen: %d) (read_bytes %ld) (extra %d) %d)\n",cid,need,have,24,read_bytes,extra,level);
return 0; return 0;
} }
@ -1232,7 +1234,7 @@ size_t ConnectionMultiApproxBatchShm::handle_response_batch(unsigned char *rbuf_
buffer_read_n[level] = need; buffer_read_n[level] = need;
buffer_read_nbytes[level] = have; buffer_read_nbytes[level] = have;
memcpy(buffer_leftover[level],rbuf_pos,have); memcpy(buffer_leftover[level],rbuf_pos,have);
//fprintf(stderr,"cid %d - we don't have enough data, need %lu more bytes, have %lu (targetLen: %d) (read_bytes %ld) (extra %d) %d)\n",cid,need,have,targetLen,read_bytes,extra,level); fprintf(stderr,"cid %d - we don't have enough data, need %lu more bytes, have %lu (targetLen: %d) (read_bytes %ld) (extra %d) %d)\n",cid,need,have,targetLen,read_bytes,extra,level);
return 0; return 0;
} }
@ -1298,43 +1300,51 @@ size_t ConnectionMultiApproxBatchShm::fill_read_buffer(int level, int *extra) {
size_t read_bytes = 0; size_t read_bytes = 0;
pthread_mutex_lock(lock_in[level]); pthread_mutex_lock(lock_in[level]);
//int len = *bipbuf_in_bytes[level];
int len = bipbuf_used(bipbuf_in[level]); int len = bipbuf_used(bipbuf_in[level]);
while (len == 0) { while (len == 0) {
pthread_cond_wait(cond_in[level],lock_in[level]); pthread_cond_wait(cond_in_not_empty[level],lock_in[level]);
//len = *bipbuf_in_bytes[level];
len = bipbuf_used(bipbuf_in[level]); len = bipbuf_used(bipbuf_in[level]);
} }
unsigned int all = 0;
if (buffer_read_n[level] != 0) { if (buffer_read_n[level] != 0) {
uint32_t have = buffer_read_nbytes[level]; uint32_t have = buffer_read_nbytes[level];
fprintf(stderr,"already have %u\n",have);
//if ((size_t)len < buffer_read_n[level]) { //if ((size_t)len < buffer_read_n[level]) {
// pthread_mutex_unlock(lock_in[level]); // pthread_mutex_unlock(lock_in[level]);
// return 0; // return 0;
//} //}
unsigned char* input = bipbuf_poll(bipbuf_in[level],len); unsigned char* input = bipbuf_peek_all(bipbuf_in[level],&all);
if (!input || len == 0) { if (!input || all == 0) {
if (!input && len > 0) if (!input && all > 0)
fprintf(stderr,"cid %d expected %d on level %d (already have %u)\n",cid,len,level,have); fprintf(stderr,"cid %d expected %d on level %d (already have %u)\n",cid,all,level,have);
pthread_mutex_unlock(lock_in[level]); pthread_mutex_unlock(lock_in[level]);
return 0; return 0;
} }
memcpy(buffer_read[level],buffer_leftover[level],have); memcpy(buffer_read[level],buffer_leftover[level],have);
buffer_read_pos[level] = buffer_read[level]; buffer_read_pos[level] = buffer_read[level];
memcpy(buffer_read_pos[level]+have,input,len); memcpy(buffer_read_pos[level]+have,input,all);
read_bytes = len; read_bytes = all;
*extra = have; *extra = have;
buffer_read_n[level] = 0; buffer_read_n[level] = 0;
buffer_read_nbytes[level] = 0; buffer_read_nbytes[level] = 0;
} else { } else {
unsigned char *input = bipbuf_poll(bipbuf_in[level],len); unsigned char *input = bipbuf_peek_all(bipbuf_in[level],&all);
if (!input || len == 0) { if (!input || all == 0) {
if (!input && len > 0) if (!input && all > 0)
fprintf(stderr,"cid %d expected %d on level %d\n",cid,len,level); fprintf(stderr,"cid %d expected %d on level %d\n",cid,all,level);
pthread_mutex_unlock(lock_in[level]); pthread_mutex_unlock(lock_in[level]);
return 0; return 0;
} }
read_bytes = len; read_bytes = all;
buffer_read_pos[level] = input; buffer_read_pos[level] = input;
#ifdef DEBUGMC
fprintf(stderr,"read %d of %d (avail: %d) on l%d\n",all,*bipbuf_in_bytes[level],len,level);
#endif
//memcpy(buffer_read_pos[level],input,len); //memcpy(buffer_read_pos[level],input,len);
*extra = 0; *extra = 0;
@ -1356,6 +1366,9 @@ void ConnectionMultiApproxBatchShm::read_callback1() {
read_bytes = fill_read_buffer(level,&extra); read_bytes = fill_read_buffer(level,&extra);
if (read_bytes == 0) { if (read_bytes == 0) {
pthread_mutex_lock(lock_in[level]);
pthread_cond_signal(cond_in_not_full[level]);
pthread_mutex_unlock(lock_in[level]);
return; return;
} }
@ -1468,16 +1481,19 @@ void ConnectionMultiApproxBatchShm::read_callback1() {
free(evict); free(evict);
} }
nread_ops++; nread_ops++;
if (buffer_read_pos[level][0] == 0) { if (buffer_read_pos[level][0] != 129 || (read_bytes - consumed_bytes == 0)) {
break;
}
if (buffer_read_pos[level][0] != 129) {
//fprintf(stderr,"cid %d we don't have a valid header post %u\n",cid,buffer_read_pos[level][0]);
break; break;
} }
//if (buffer_read_pos[level][0] != 129) {
// //fprintf(stderr,"cid %d we don't have a valid header post %u\n",cid,buffer_read_pos[level][0]);
// break;
//}
} }
pthread_mutex_lock(lock_in[level]);
bipbuf_poll(bipbuf_in[level],read_bytes);
*bipbuf_in_bytes[level] = *bipbuf_in_bytes[level] - read_bytes;
pthread_cond_signal(cond_in_not_full[level]);
pthread_mutex_unlock(lock_in[level]);
double now = get_time(); double now = get_time();
last_tx = now; last_tx = now;
stats.log_op(op_queue_size[1]); stats.log_op(op_queue_size[1]);
@ -1498,6 +1514,9 @@ void ConnectionMultiApproxBatchShm::read_callback2() {
read_bytes = fill_read_buffer(level,&extra); read_bytes = fill_read_buffer(level,&extra);
if (read_bytes == 0) { if (read_bytes == 0) {
pthread_mutex_lock(lock_in[level]);
pthread_cond_signal(cond_in_not_full[level]);
pthread_mutex_unlock(lock_in[level]);
return; return;
} }
@ -1599,11 +1618,7 @@ void ConnectionMultiApproxBatchShm::read_callback2() {
DIE("not implemented"); DIE("not implemented");
} }
nread_ops++; nread_ops++;
if (buffer_read_pos[level][0] == 0) { if (buffer_read_pos[level][0] != 129 || (read_bytes - consumed_bytes == 0)) {
break;
}
if (buffer_read_pos[level][0] != 129) {
//fprintf(stderr,"l2 cid %d we don't have a valid header post %u\n",cid,buffer_read_pos[level][0]);
break; break;
} }
} }
@ -1613,6 +1628,12 @@ void ConnectionMultiApproxBatchShm::read_callback2() {
//if (nread_ops == 0) { //if (nread_ops == 0) {
// fprintf(stderr,"ugh l2 only got: %lu ops expected %lu\n",nread_ops,batch); // fprintf(stderr,"ugh l2 only got: %lu ops expected %lu\n",nread_ops,batch);
//} //}
pthread_mutex_lock(lock_in[level]);
bipbuf_poll(bipbuf_in[level],read_bytes);
*bipbuf_in_bytes[level] = *bipbuf_in_bytes[level] - read_bytes;
pthread_cond_signal(cond_in_not_full[level]);
pthread_mutex_unlock(lock_in[level]);
double now = get_time(); double now = get_time();

View File

@ -44,10 +44,10 @@ if not conf.CheckFunc('pthread_barrier_init'):
env = conf.Finish() env = conf.Finish()
env.Append(CFLAGS = '-O0 -Wall -g --std=c++17 -lstdc++fs') #env.Append(CFLAGS = '-O0 -Wall -g --std=c++17 -lstdc++fs -fsanitize=address')
env.Append(CPPFLAGS = '-O0 -Wall -g --std=c++17 -lstdc++fs') #env.Append(CPPFLAGS = '-O0 -Wall -g --std=c++17 -lstdc++fs -fsanitize=address')
#env.Append(CFLAGS = ' -O3 -Wall -g --std=c++17 -lstdc++fs') env.Append(CFLAGS = ' -O2 -Wall -g --std=c++17 -lstdc++fs')
#env.Append(CPPFLAGS = ' -O3 -Wall -g --std=c++17 -lstdc++fs') env.Append(CPPFLAGS = ' -O2 -Wall -g --std=c++17 -lstdc++fs')
#env.Append(CFLAGS = ' -O3 -Wall -g') #env.Append(CFLAGS = ' -O3 -Wall -g')
#env.Append(CPPFLAGS = ' -O3 -Wall -g') #env.Append(CPPFLAGS = ' -O3 -Wall -g')
#env.Append(LDFLAGS = '-fsantize=address') #env.Append(LDFLAGS = '-fsantize=address')
@ -62,7 +62,10 @@ env.Append(CPPFLAGS = '-O0 -Wall -g --std=c++17 -lstdc++fs')
env.Command(['cmdline.cc', 'cmdline.h'], 'cmdline.ggo', 'gengetopt < $SOURCE') env.Command(['cmdline.cc', 'cmdline.h'], 'cmdline.ggo', 'gengetopt < $SOURCE')
src = Split("""mutilate.cc cmdline.cc log.cc distributions.cc util.cc src = Split("""mutilate.cc cmdline.cc log.cc distributions.cc util.cc
Connection.cc ConnectionMulti.cc ConnectionMultiApprox.cc ConnectionMultiApproxBatch.cc ConnectionMultiApproxShm.cc Protocol.cc Generator.cc bipbuffer.cc""") Connection.cc ConnectionMulti.cc ConnectionMultiApprox.cc ConnectionMultiApproxBatchShm.cc ConnectionMultiApproxBatch.cc ConnectionMultiApproxShm.cc Protocol.cc Generator.cc bipbuffer.cc""")
#src = Split("""mutilate.cc cmdline.cc log.cc distributions.cc util.cc
# ConnectionMultiApprox.cc ConnectionMultiApproxBatchShm.cc Generator.cc bipbuffer.cc""")
if not env['HAVE_POSIX_BARRIER']: # USE_POSIX_BARRIER: if not env['HAVE_POSIX_BARRIER']: # USE_POSIX_BARRIER:
src += ['barrier.cc'] src += ['barrier.cc']

View File

@ -69,8 +69,10 @@ int bipbuf_is_empty(const bipbuf_t* me)
* ie. is the distance from A to buffer's end less than B to A? */ * ie. is the distance from A to buffer's end less than B to A? */
static void __check_for_switch_to_b(bipbuf_t* me) static void __check_for_switch_to_b(bipbuf_t* me)
{ {
if (me->size - me->a_end < me->a_start - me->b_end) if (me->size - me->a_end < me->a_start - me->b_end) {
//fprintf(stderr,"%p switching to b, a_start: %d, a_end: %d, b_end %d\n",me,me->a_start,me->a_end,me->b_end);
me->b_inuse = 1; me->b_inuse = 1;
}
} }
/* TODO: DOCUMENT THESE TWO FUNCTIONS */ /* TODO: DOCUMENT THESE TWO FUNCTIONS */

View File

@ -3,6 +3,7 @@
#define BIPBUFSIZE 4*1024*1024 #define BIPBUFSIZE 4*1024*1024
#include "binary_protocol.h" #include "binary_protocol.h"
#include <stdio.h>
extern "C" { extern "C" {
typedef struct typedef struct