예제 #1
0
void masterconn_connected(masterconn *eptr) {
	double now;

	now = monotonic_seconds();

	tcpnodelay(eptr->sock);
	eptr->mode = DATA;
	eptr->lastread = now;
	eptr->lastwrite = now;
	eptr->input_bytesleft = 8;
	eptr->input_startptr = eptr->input_hdr;
	eptr->input_end = 0;
	eptr->input_packet = NULL;
	eptr->inputhead = NULL;
	eptr->inputtail = &(eptr->inputhead);
	eptr->outputhead = NULL;
	eptr->outputtail = &(eptr->outputhead);
	eptr->conncnt++;
	eptr->masterversion = 0;
	eptr->hlstatus = 0;
	eptr->gotrndblob = 0;
	memset(eptr->rndblob,0,32);
	eptr->registerstate = UNREGISTERED;

	masterconn_sendregister(eptr);
}
예제 #2
0
void masterconn_connected(serventry *eptr) {
	tcpnodelay(eptr->sock);
	eptr->mode=HEADER;
	eptr->inputpacket.next = NULL;
	eptr->inputpacket.bytesleft = 8;
	eptr->inputpacket.startptr = eptr->hdrbuff;
	eptr->inputpacket.packet = NULL;
	eptr->outputtail = &(eptr->outputhead);

	masterconn_sendregister(eptr);
	eptr->lastread = eptr->lastwrite = get_current_time();
}
예제 #3
0
파일: masterconn.c 프로젝트: qqqxing/jmfs
void masterconn_connected(masterconn *eptr) {
    tcpnodelay(eptr->sock);
    eptr->mode=HEADER;
    eptr->inputpacket.next = NULL;
    eptr->inputpacket.bytesleft = 8;
    eptr->inputpacket.startptr = eptr->hdrbuff;
    eptr->inputpacket.packet = NULL;
    eptr->outputhead = NULL;
    eptr->outputtail = &(eptr->outputhead);

    masterconn_sendregister(eptr);
    masterconn_metadownloadinit();
    eptr->lastread = eptr->lastwrite = main_time();
}
예제 #4
0
//向Master注册,调用masterconn_sendregister()封装注册packet
//调用:masterconn_initconnect()
void masterconn_connected(masterconn *eptr) {
#ifdef BGJOBS
	eptr->jpool = job_pool_new(10,BGJOBSCNT,&(eptr->jobfd));
#endif
	tcpnodelay(eptr->sock);
	eptr->mode=HEADER;
	eptr->inputpacket.next = NULL;
	eptr->inputpacket.bytesleft = 8;
	eptr->inputpacket.startptr = eptr->hdrbuff;
	eptr->inputpacket.packet = NULL;
	eptr->outputhead = NULL;
	eptr->outputtail = &(eptr->outputhead);

	masterconn_sendregister(eptr);
	eptr->lastread = eptr->lastwrite = main_time();
}
예제 #5
0
void masterconn_connected(masterconn *eptr) {
    double now;

    now = monotonic_seconds();
    tcpnodelay(eptr->sock);
    eptr->mode = DATA;
    eptr->lastread = now;
    eptr->lastwrite = now;
    eptr->input_bytesleft = 8;
    eptr->input_startptr = eptr->input_hdr;
    eptr->input_end = 0;
    eptr->input_packet = NULL;
    eptr->inputhead = NULL;
    eptr->inputtail = &(eptr->inputhead);
    eptr->outputhead = NULL;
    eptr->outputtail = &(eptr->outputhead);

    masterconn_sendregister(eptr);
    if (lastlogversion==0) {
        masterconn_metadownloadinit();
    }
}
예제 #6
0
void masterconn_master_ack(masterconn *eptr,const uint8_t *data,uint32_t length) {
	uint8_t atype;
	uint64_t metaid;
	uint16_t csid;
	if (length!=33 && length!=17 && length!=15 && length!=9 && length!=7 && length!=5 && length!=1) {
		syslog(LOG_NOTICE,"MATOCS_MASTER_ACK - wrong size (%"PRIu32"/1|5|7|9|15|17|33)",length);
		eptr->mode = KILL;
		return;
	}
	atype = get8bit(&data);
	if (atype==0) {
		csid = 0;
		metaid = 0;
		if (length>=5) {
			eptr->masterversion = get32bit(&data);
		}
		if (length>=9) {
			if (Timeout==0) {
				eptr->timeout = get16bit(&data);
			} else {
				data+=2;
			}
			csid = get16bit(&data);
		}
		if (length>=17) {
			metaid = get64bit(&data);
			if (metaid>0 && MetaID>0 && metaid!=MetaID) { // wrong MFS instance - abort
				syslog(LOG_WARNING,"MATOCS_MASTER_ACK - wrong meta data id. Can't connect to master");
				eptr->registerstate = REGISTERED; // do not switch to register ver. 5
				eptr->mode = KILL;
				return;
			}
		}
		if (csid>0 || metaid>0) {
			masterconn_setcsid(csid,metaid);
		}
		if (eptr->masterversion<VERSION2INT(2,0,0)) {
			if (eptr->registerstate != REGISTERED) {
				if (eptr->registerstate == INPROGRESS) {
					hdd_get_chunks_end();
				}
				eptr->registerstate = REGISTERED;
				masterconn_sendchunksinfo(eptr);
			}
		} else {
			if (eptr->registerstate == UNREGISTERED || eptr->registerstate == WAITING) {
				hdd_get_chunks_begin(1);
				eptr->registerstate = INPROGRESS;
				if (eptr->masterversion>=VERSION2INT(2,1,0)) {
					masterconn_sendlabels(eptr);
				}
			}
			if (eptr->registerstate == INPROGRESS) {
				masterconn_sendnextchunks(eptr);
			}
		}
	} else if (atype==1 && length==5) {
		uint32_t mip;
		mip = get32bit(&data);
		if (mip) {
			// redirect to leader
			eptr->masterip = mip;
			eptr->new_register_mode = 3;
			if (eptr->registerstate == INPROGRESS) {
				hdd_get_chunks_end();
			}
			eptr->registerstate = WAITING;
#ifdef MFSDEBUG
			syslog(LOG_NOTICE,"masterconn: redirected to other master");
#endif
		} else {
			// leader not known - just reconnect
			eptr->masteraddrvalid = 0;
			syslog(LOG_NOTICE,"masterconn: follower doesn't know who is the leader, reconnect to another master");
		}
		eptr->mode = CLOSE;
	} else if (atype==2 && (length==7 || length==15)) {
#ifdef MFSDEBUG
		syslog(LOG_NOTICE,"masterconn: wait for acceptance");
#endif
		if (eptr->registerstate == INPROGRESS) {
			hdd_get_chunks_end();
		}
		eptr->registerstate = WAITING;
		eptr->masterversion = get32bit(&data);
		if (Timeout==0) {
			eptr->timeout = get16bit(&data);
		} else {
			data+=2;
		}
		if (length>=15) {
			metaid = get64bit(&data);
			if (metaid>0 && MetaID>0 && metaid!=MetaID) { // wrong MFS instance - abort
				syslog(LOG_WARNING,"MATOCS_MASTER_ACK - wrong meta data id. Can't connect to master");
				eptr->registerstate = REGISTERED; // do not switch to register ver. 5
				eptr->mode = KILL;
				return;
			}
		}
	} else if (atype==3 && length==33) {
#ifdef MFSDEBUG
		syslog(LOG_NOTICE,"masterconn: authorization needed");
#endif
		if (AuthCode==NULL) {
			syslog(LOG_WARNING,"MATOCS_MASTER_ACK - master needs authorization, but password was not defined");
			eptr->registerstate = REGISTERED; // do not switch to register ver. 5
			eptr->mode = KILL;
			return;
		}
		memcpy(eptr->rndblob,data,32);
		eptr->gotrndblob = 1;
		masterconn_sendregister(eptr);
	} else {
		syslog(LOG_NOTICE,"MATOCS_MASTER_ACK - bad type/length: %u/%u",atype,length);
		eptr->mode = KILL;
	}
}