예제 #1
0
파일: replication.go 프로젝트: coreos/torus
func (b *replicationBlockset) Unmarshal(data []byte) error {
	r := bytes.NewReader(data)
	var rep int32
	err := binary.Read(r, binary.LittleEndian, &rep)
	if err != nil {
		return err
	}
	b.rep = int(rep)
	b.repBlocks = make([][]torus.BlockRef, rep)
	for rep := 0; rep < (b.rep - 1); rep++ {
		var l int32
		err := binary.Read(r, binary.LittleEndian, &l)
		if err != nil {
			return err
		}
		out := make([]torus.BlockRef, l)
		for i := 0; i < int(l); i++ {
			buf := make([]byte, torus.BlockRefByteSize)
			_, err := r.Read(buf)
			if err != nil {
				return err
			}
			out[i] = torus.BlockRefFromBytes(buf)
		}
		b.repBlocks[rep] = out
	}
	return nil
}
예제 #2
0
파일: tdp.go 프로젝트: coreos/torus
func (s *Server) handleRebalanceCheck(conn net.Conn, len int, refbuf []byte) error {
	refs := make([]torus.BlockRef, len)
	for i := 0; i < len; i++ {
		err := readConnIntoBuffer(conn, refbuf)
		if err != nil {
			return err
		}
		refs[i] = torus.BlockRefFromBytes(refbuf)
	}
	bools, err := s.handler.RebalanceCheck(context.TODO(), refs)
	respheader := headerOk
	if err != nil {
		clog.Warningf("failed to rebalance check: %v", err)
		respheader = headerErr
	}
	_, err = conn.Write(respheader)
	if err != nil {
		return err
	}
	bs := bitsetFromBool(bools)
	_, err = conn.Write(bs)
	if err != nil {
		return err
	}
	return nil
}
예제 #3
0
파일: tdp.go 프로젝트: coreos/torus
func (s *Server) handlePutBlock(conn net.Conn, refbuf []byte, null []byte) error {
	err := readConnIntoBuffer(conn, refbuf)
	if err != nil {
		return err
	}
	ref := torus.BlockRefFromBytes(refbuf)
	data, err := s.handler.WriteBuf(context.TODO(), ref)
	if err != nil {
		if err == torus.ErrExists {
			data = null
		} else {
			return err
		}
	}
	err = readConnIntoBuffer(conn, data)
	if err != nil {
		return err
	}
	respheader := headerOk
	if err != nil {
		respheader = headerErr
	}
	_, err = conn.Write(respheader)
	return err
}
func (b *baseBlockset) Unmarshal(data []byte) error {
	l := len(data) / torus.BlockRefByteSize
	out := make([]torus.BlockRef, l)
	for i := 0; i < l; i++ {
		out[i] = torus.BlockRefFromBytes(data[(i * torus.BlockRefByteSize) : (i+1)*torus.BlockRefByteSize])
	}
	b.blocks = out
	return nil
}
func (s *Server) handleBlock(conn net.Conn, refbuf []byte) error {
	err := readConnIntoBuffer(conn, refbuf)
	if err != nil {
		return err
	}
	ref := torus.BlockRefFromBytes(refbuf)
	data, err := s.handler.Block(context.TODO(), ref)
	respheader := headerOk
	if err != nil {
		respheader = headerErr
	}
	_, err = conn.Write(respheader)
	if err != nil {
		return err
	}
	_, err = conn.Write(data)
	if err != nil {
		return err
	}
	return nil
}
func loadIndex(m *MFile) (map[torus.BlockRef]int, error) {
	clog.Infof("loading block index...")
	var membefore uint64
	if clog.LevelAt(capnslog.DEBUG) {
		var mem runtime.MemStats
		runtime.ReadMemStats(&mem)
		membefore = mem.Alloc
	}
	out := make(map[torus.BlockRef]int)
	for i := uint64(0); i < m.NumBlocks(); i++ {
		b := m.GetBlock(i)
		if bytes.Equal(blankRefBytes, b) {
			continue
		}
		out[torus.BlockRefFromBytes(b)] = int(i)
	}
	if clog.LevelAt(capnslog.DEBUG) {
		var mem runtime.MemStats
		runtime.ReadMemStats(&mem)
		clog.Debugf("index memory usage: %dK", ((mem.Alloc - membefore) / 1024))
	}
	clog.Infof("done loading block index")
	return out, nil
}