예제 #1
0
파일: list.go 프로젝트: dgraph-io/dgraph
// getPostingList tries to get posting list from l.pbuffer. If it is nil, then
// we query RocksDB. There is no need for lock acquisition here.
func (l *List) getPostingList(loop int) *types.PostingList {
	if loop >= 10 {
		x.Fatalf("This is over the 10th loop: %v", loop)
	}
	l.AssertRLock()
	// Wait for any previous commits to happen before retrieving posting list again.
	l.Wait()

	pb := atomic.LoadPointer(&l.pbuffer)
	plist := (*types.PostingList)(pb)

	if plist == nil {
		x.AssertTrue(l.pstore != nil)
		plist = new(types.PostingList)

		if slice, err := l.pstore.Get(l.key); err == nil && slice != nil {
			x.Checkf(plist.Unmarshal(slice.Data()), "Unable to Unmarshal PostingList from store")
			slice.Free()
		}
		if atomic.CompareAndSwapPointer(&l.pbuffer, pb, unsafe.Pointer(plist)) {
			return plist
		}
		// Someone else replaced the pointer in the meantime. Retry recursively.
		return l.getPostingList(loop + 1)
	}
	return plist
}
예제 #2
0
파일: sort.go 프로젝트: dgraph-io/dgraph
// Less returns true if a is strictly less than b.
func (s Scalar) Less(a, b Value) bool {
	switch s.ID() {
	case DateID:
		return a.(*Date).Time.Before(b.(*Date).Time)
	case DateTimeID:
		return a.(*Time).Time.Before(b.(*Time).Time)
	case Int32ID:
		return *(a.(*Int32)) < *(b.(*Int32))
	case FloatID:
		return *(a.(*Float)) < *(b.(*Float))
	case StringID:
		return *(a.(*String)) < *(b.(*String))
	case BytesID:
		return bytes.Compare(*(a.(*Bytes)), *(b.(*Bytes))) < 0
	}
	x.Fatalf("Unexpected scalar: %v", s)
	return false
}
예제 #3
0
파일: assign.go 프로젝트: dgraph-io/dgraph
// AssignUids is used to assign new uids by communicating with the leader of the RAFT group
// responsible for handing out uids.
func (w *grpcWorker) AssignUids(ctx context.Context, num *task.Num) (*task.List, error) {
	if ctx.Err() != nil {
		return &emptyUIDList, ctx.Err()
	}

	if !groups().ServesGroup(num.Group) {
		x.Fatalf("groupId: %v. GetOrAssign. We shouldn't be getting this req", num.Group)
	}

	reply := &emptyUIDList
	c := make(chan error, 1)
	go func() {
		var err error
		reply, err = assignUids(ctx, num)
		c <- err
	}()

	select {
	case <-ctx.Done():
		return reply, ctx.Err()
	case err := <-c:
		return reply, err
	}
}