void masterconn_replicate(masterconn *eptr,const uint8_t *data,uint32_t length) { uint64_t chunkid; uint32_t version; uint32_t ip; uint16_t port; uint32_t xormasks[4]; uint8_t *ptr; void *packet; if (!(length==18 || (length>=28+18 && length<=28+8*18 && (length-28)%18==0))) { syslog(LOG_NOTICE,"MATOCS_REPLICATE - wrong size (%"PRIu32"/18|12+n*18[n:1..100]|28+n*18[n:1..8])",length); eptr->mode = KILL; return; } chunkid = get64bit(&data); version = get32bit(&data); packet = masterconn_create_detached_packet(eptr,CSTOMA_REPLICATE,8+4+1); ptr = masterconn_get_packet_data(packet); put64bit(&ptr,chunkid); put32bit(&ptr,version); if (length==8+4+4+2) { ip = get32bit(&data); port = get16bit(&data); // syslog(LOG_NOTICE,"start job replication (%08"PRIX64":%04"PRIX32":%04"PRIX32":%02"PRIX16")",chunkid,version,ip,port); job_replicate_simple(masterconn_replicationfinished,packet,chunkid,version,ip,port); } else { xormasks[0] = get32bit(&data); xormasks[1] = get32bit(&data); xormasks[2] = get32bit(&data); xormasks[3] = get32bit(&data); job_replicate_raid(masterconn_replicationfinished,packet,chunkid,version,(length-28)/18,xormasks,data); } }
void masterconn_replicate(masterconn *eptr,const uint8_t *data,uint32_t length) { uint64_t chunkid; uint32_t version; uint32_t ip; uint16_t port; uint8_t *ptr; void *packet; if (length!=8+4+4+2 && (length<12+18 || length>12+18*100 || (length-12)%18!=0)) { syslog(LOG_NOTICE,"MATOCS_REPLICATE - wrong size (%"PRIu32"/18|12+n*18[n:1..100])",length); eptr->mode = KILL; return; } chunkid = get64bit(&data); version = get32bit(&data); packet = masterconn_create_detached_packet(CSTOMA_REPLICATE,8+4+1); if (packet==NULL) { eptr->mode=KILL; return; } ptr = masterconn_get_packet_data(packet); put64bit(&ptr,chunkid); put32bit(&ptr,version); if (length==8+4+4+2) { ip = get32bit(&data); port = get16bit(&data); // syslog(LOG_NOTICE,"start job replication (%08"PRIX64":%04"PRIX32":%04"PRIX32":%02"PRIX16")",chunkid,version,ip,port); job_replicate_simple(eptr->jpool,masterconn_replicationfinished,packet,chunkid,version,ip,port); } else { job_replicate(eptr->jpool,masterconn_replicationfinished,packet,chunkid,version,(length-12)/18,data); } }
void masterconn_chunkop(masterconn *eptr,const uint8_t *data,uint32_t length) { uint64_t chunkid; uint32_t version,newversion; uint64_t copychunkid; uint32_t copyversion; uint32_t leng; uint8_t *ptr; void *packet; if (length!=8+4+8+4+4+4) { syslog(LOG_NOTICE,"MATOCS_CHUNKOP - wrong size (%"PRIu32"/32)",length); eptr->mode = KILL; return; } chunkid = get64bit(&data); version = get32bit(&data); newversion = get32bit(&data); copychunkid = get64bit(&data); copyversion = get32bit(&data); leng = get32bit(&data); packet = masterconn_create_detached_packet(eptr,CSTOMA_CHUNKOP,8+4+4+8+4+4+1); ptr = masterconn_get_packet_data(packet); put64bit(&ptr,chunkid); put32bit(&ptr,version); put32bit(&ptr,newversion); put64bit(&ptr,copychunkid); put32bit(&ptr,copyversion); put32bit(&ptr,leng); job_chunkop(masterconn_chunkopfinished,packet,chunkid,version,newversion,copychunkid,copyversion,leng); }
void masterconn_chunkopfinished(uint8_t status,void *packet) { uint8_t *ptr; masterconn *eptr = masterconnsingleton; if (eptr && eptr->conncnt==((out_packetstruct*)packet)->conncnt && eptr->mode==DATA) { ptr = masterconn_get_packet_data(packet); ptr[32]=status; masterconn_attach_packet(eptr,packet); } else { masterconn_delete_packet(packet); } }
//读取Master的packet,怀疑是复制chunk操作,待确定 //调用:masterconn_gotpacket() void masterconn_chunkop(masterconn *eptr,const uint8_t *data,uint32_t length) { uint64_t chunkid; uint32_t version,newversion; uint64_t copychunkid; uint32_t copyversion; uint32_t leng; uint8_t *ptr; #ifdef BGJOBS void *packet; #else /* BGJOBS */ uint8_t status; #endif /* BGJOBS */ if (length!=8+4+8+4+4+4) { syslog(LOG_NOTICE,"MATOCS_CHUNKOP - wrong size (%"PRIu32"/32)",length); eptr->mode = KILL; return; } chunkid = get64bit(&data); version = get32bit(&data); newversion = get32bit(&data); copychunkid = get64bit(&data); copyversion = get32bit(&data); leng = get32bit(&data); #ifdef BGJOBS packet = masterconn_create_detached_packet(CSTOMA_CHUNKOP,8+4+4+8+4+4+1); if (packet==NULL) { eptr->mode=KILL; return; } ptr = masterconn_get_packet_data(packet); put64bit(&ptr,chunkid); put32bit(&ptr,version); put32bit(&ptr,newversion); put64bit(&ptr,copychunkid); put32bit(&ptr,copyversion); put32bit(&ptr,leng); job_chunkop(eptr->jpool,masterconn_chunkopfinished,packet,chunkid,version,newversion,copychunkid,copyversion,leng); #else /* BGJOBS */ status = hdd_chunkop(chunkid,version,newversion,copychunkid,copyversion,leng); ptr = masterconn_create_attached_packet(eptr,CSTOMA_CHUNKOP,8+4+4+8+4+4+1); if (ptr==NULL) { eptr->mode=KILL; return; } put64bit(&ptr,chunkid); put32bit(&ptr,version); put32bit(&ptr,newversion); put64bit(&ptr,copychunkid); put32bit(&ptr,copyversion); put32bit(&ptr,leng); put8bit(&ptr,status); #endif /* BGJOBS */ }
void masterconn_chunkopfinished(uint8_t status,void *packet) { uint8_t *ptr; masterconn *eptr = masterconnsingleton; if (eptr->mode==DATA || eptr->mode==HEADER) { ptr = masterconn_get_packet_data(packet); ptr[32]=status; masterconn_attach_packet(eptr,packet); } else { masterconn_delete_packet(packet); } }
void masterconn_replicationfinished(uint8_t status,void *packet) { uint8_t *ptr; masterconn *eptr = masterconnsingleton; // syslog(LOG_NOTICE,"job replication status: %"PRIu8,status); if (eptr && eptr->conncnt==((out_packetstruct*)packet)->conncnt && eptr->mode==DATA) { ptr = masterconn_get_packet_data(packet); ptr[12]=status; masterconn_attach_packet(eptr,packet); } else { masterconn_delete_packet(packet); } }
void masterconn_delete(masterconn *eptr,const uint8_t *data,uint32_t length) { uint64_t chunkid; uint32_t version; uint8_t *ptr; void *packet; if (length!=8+4) { syslog(LOG_NOTICE,"MATOCS_DELETE - wrong size (%"PRIu32"/12)",length); eptr->mode = KILL; return; } chunkid = get64bit(&data); version = get32bit(&data); packet = masterconn_create_detached_packet(eptr,CSTOMA_DELETE,8+1); ptr = masterconn_get_packet_data(packet); put64bit(&ptr,chunkid); job_delete(masterconn_jobfinished,packet,chunkid,version); }
//读取Master的packet,删除chunk //调用:masterconn_gotpacket() void masterconn_delete(masterconn *eptr,const uint8_t *data,uint32_t length) { uint64_t chunkid; uint32_t version; uint8_t *ptr; #ifdef BGJOBS void *packet; #else /* BGJOBS */ uint8_t status; #endif /* BGJOBS */ if (length!=8+4) { syslog(LOG_NOTICE,"MATOCS_DELETE - wrong size (%"PRIu32"/12)",length); eptr->mode = KILL; return; } chunkid = get64bit(&data); version = get32bit(&data); #ifdef BGJOBS packet = masterconn_create_detached_packet(CSTOMA_DELETE,8+1); if (packet==NULL) { eptr->mode=KILL; return; } ptr = masterconn_get_packet_data(packet); put64bit(&ptr,chunkid); job_delete(eptr->jpool,masterconn_jobfinished,packet,chunkid,version); #else /* BGJOBS */ status = hdd_delete(chunkid,version); ptr = masterconn_create_attached_packet(eptr,CSTOMA_DELETE,8+1); if (ptr==NULL) { eptr->mode=KILL; return; } put64bit(&ptr,chunkid); put8bit(&ptr,status); #endif /* BGJOBS */ }
void masterconn_duptrunc(masterconn *eptr,const uint8_t *data,uint32_t length) { uint64_t chunkid; uint32_t version; uint64_t copychunkid; uint32_t copyversion; uint32_t leng; uint8_t *ptr; void *packet; if (length!=8+4+8+4+4) { syslog(LOG_NOTICE,"MATOCS_DUPTRUNC - wrong size (%"PRIu32"/28)",length); eptr->mode = KILL; return; } copychunkid = get64bit(&data); copyversion = get32bit(&data); chunkid = get64bit(&data); version = get32bit(&data); leng = get32bit(&data); packet = masterconn_create_detached_packet(eptr,CSTOMA_DUPTRUNC,8+1); ptr = masterconn_get_packet_data(packet); put64bit(&ptr,copychunkid); job_duptrunc(masterconn_jobfinished,packet,chunkid,version,version,copychunkid,copyversion,leng); }