Beispiel #1
0
// Prepare send a block to datanode
func (self *DataServer) PrepareSendBlock(param *proc.PrepareBlockParam, lease *proc.CatLease) error {
	var nextLease proc.CatLease
	var deliverChan chan []byte
	nextParam := param.NextPipeParam()
	if nextParam != nil {
		// if there is another replica
		location := nextParam.ServerLocation()
		nextDataServer := self.pool.DataServer(location)
		// prepare next data server
		err := nextDataServer.PrepareSendBlock(nextParam, &nextLease)
		if err != nil {
			return err
		}
		// prepare deliverChan block to next data server
		nextBlockClient := self.pool.NewBlockClient(location)
		deliverChan = make(chan []byte)
		go nextBlockClient.SendBlock(deliverChan, nextLease.ID)
	}

	writeDiskChan := make(chan []byte, DEFAULT_CHAN_SIZE)
	done := make(chan bool, 1)

	// init the lease
	lease.New()
	self.leaseMap[lease.ID] = lease
	self.pipelineMap[lease.ID] = NewPipelineParam(&nextLease, nextParam)

	trans := NewReadTransaction(lease.ID, done, deliverChan, writeDiskChan)
	go self.writeBlockToDisk(writeDiskChan, param.Block)
	// init data receiver
	self.blockServer.StartTransaction(trans)
	return nil
}
Beispiel #2
0
// Get the block from data server
// Will start an tcp connect to request block
func (self *DataServer) GetBlock(param *proc.GetBlockParam, lease *proc.CatLease) error {
	// init lease
	lease.New()
	self.leaseMap[lease.ID] = lease

	block := param.Block
	data := make(chan []byte)
	go self.readBlockFromDisk(data, block)
	trans := NewProviderTransaction(lease.ID, data)
	self.blockServer.StartTransaction(trans)
	return nil
}