Пример #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
}
Пример #2
0
func NewPipelineParam(lease *proc.CatLease, param *proc.PrepareBlockParam) *PipelineParam {
	p := &PipelineParam{
		lease: lease,
	}
	if param != nil {
		p.location = param.ServerLocation()
	}
	return p
}