// LoadPinner loads a pinner and its keysets from the given datastore func LoadPinner(d ds.ThreadSafeDatastore, dserv mdag.DAGService) (Pinner, error) { p := new(pinner) { // load recursive set var recurseKeys []key.Key if err := loadSet(d, recursePinDatastoreKey, &recurseKeys); err != nil { return nil, err } p.recursePin = set.SimpleSetFromKeys(recurseKeys) } { // load direct set var directKeys []key.Key if err := loadSet(d, directPinDatastoreKey, &directKeys); err != nil { return nil, err } p.directPin = set.SimpleSetFromKeys(directKeys) } { // load indirect set var err error p.indirPin, err = loadIndirPin(d, indirectPinDatastoreKey) if err != nil { return nil, err } } // assign services p.dserv = dserv p.dstore = d return p, nil }
// LoadPinner loads a pinner and its keysets from the given datastore func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) { p := new(pinner) rootKeyI, err := d.Get(pinDatastoreKey) if err != nil { return nil, fmt.Errorf("cannot load pin state: %v", err) } rootKeyBytes, ok := rootKeyI.([]byte) if !ok { return nil, fmt.Errorf("cannot load pin state: %s was not bytes", pinDatastoreKey) } rootKey := key.Key(rootKeyBytes) ctx, cancel := context.WithTimeout(context.TODO(), time.Second*5) defer cancel() root, err := dserv.Get(ctx, rootKey) if err != nil { return nil, fmt.Errorf("cannot find pinning root object: %v", err) } internalPin := map[key.Key]struct{}{ rootKey: struct{}{}, } recordInternal := func(k key.Key) { internalPin[k] = struct{}{} } { // load recursive set recurseKeys, err := loadSet(ctx, dserv, root, linkRecursive, recordInternal) if err != nil { return nil, fmt.Errorf("cannot load recursive pins: %v", err) } p.recursePin = set.SimpleSetFromKeys(recurseKeys) } { // load direct set directKeys, err := loadSet(ctx, dserv, root, linkDirect, recordInternal) if err != nil { return nil, fmt.Errorf("cannot load direct pins: %v", err) } p.directPin = set.SimpleSetFromKeys(directKeys) } p.internalPin = internalPin // assign services p.dserv = dserv p.dstore = d return p, nil }
func loadIndirPin(d ds.Datastore, k ds.Key) (*indirectPin, error) { var rcStore map[string]int err := loadSet(d, k, &rcStore) if err != nil { return nil, err } refcnt := make(map[key.Key]int) var keys []key.Key for encK, v := range rcStore { if v > 0 { k := key.B58KeyDecode(encK) keys = append(keys, k) refcnt[k] = v } } // log.Debugf("indirPin keys: %#v", keys) return &indirectPin{blockset: set.SimpleSetFromKeys(keys), refCounts: refcnt}, nil }