// versionedRange sends a range of key-value pairs for a particular version down a channel. func (db *KVAutobus) versionedRange(vctx storage.VersionedCtx, kStart, kEnd storage.TKey, ch chan errorableKV, keysOnly bool) { minKey, err := vctx.MinVersionKey(kStart) if err != nil { ch <- errorableKV{nil, err} return } maxKey, err := vctx.MaxVersionKey(kEnd) if err != nil { ch <- errorableKV{nil, err} return } maxVersionKey, err := vctx.MaxVersionKey(kStart) if err != nil { ch <- errorableKV{nil, err} return } kvs, err := db.getRange(minKey, maxKey) if err != nil { ch <- errorableKV{nil, err} return } versions := []*storage.KeyValue{} for _, kv := range kvs { if !keysOnly { storage.StoreValueBytesRead <- len(kv.V) } storage.StoreKeyBytesRead <- len(kv.K) // Did we pass all versions for last key read? if bytes.Compare(kv.K, maxVersionKey) > 0 { indexBytes, err := vctx.TKeyFromKey(kv.K) if err != nil { ch <- errorableKV{nil, err} return } maxVersionKey, err = vctx.MaxVersionKey(indexBytes) if err != nil { ch <- errorableKV{nil, err} return } // log.Printf("->maxVersionKey %v (transmitting %d values)\n", maxVersionKey, len(values)) sendKV(vctx, versions, ch) versions = []*storage.KeyValue{} } // Did we pass the final key? if bytes.Compare(kv.K, maxKey) > 0 { if len(versions) > 0 { sendKV(vctx, versions, ch) } ch <- errorableKV{nil, nil} return } // log.Printf("Appending value with key %v\n", itKey) versions = append(versions, kv) } }
// versionedRange sends a range of key-value pairs for a particular version down a channel. func (db *LevelDB) versionedRange(vctx storage.VersionedCtx, kStart, kEnd storage.TKey, ch chan errorableKV, keysOnly bool) { dvid.StartCgo() ro := levigo.NewReadOptions() it := db.ldb.NewIterator(ro) defer func() { it.Close() dvid.StopCgo() }() minKey, err := vctx.MinVersionKey(kStart) if err != nil { ch <- errorableKV{nil, err} return } maxKey, err := vctx.MaxVersionKey(kEnd) if err != nil { ch <- errorableKV{nil, err} return } values := []*storage.KeyValue{} maxVersionKey, err := vctx.MaxVersionKey(kStart) if err != nil { ch <- errorableKV{nil, err} return } // log.Printf(" minKey %v\n", minKey) // log.Printf(" maxKey %v\n", maxKey) // log.Printf(" maxVersionKey %v\n", maxVersionKey) it.Seek(minKey) var itValue []byte for { if it.Valid() { if !keysOnly { itValue = it.Value() storage.StoreValueBytesRead <- len(itValue) } itKey := it.Key() // log.Printf(" +++valid key %v\n", itKey) storage.StoreKeyBytesRead <- len(itKey) // Did we pass all versions for last key read? if bytes.Compare(itKey, maxVersionKey) > 0 { indexBytes, err := vctx.TKeyFromKey(itKey) if err != nil { ch <- errorableKV{nil, err} return } maxVersionKey, err = vctx.MaxVersionKey(indexBytes) if err != nil { ch <- errorableKV{nil, err} return } // log.Printf("->maxVersionKey %v (transmitting %d values)\n", maxVersionKey, len(values)) sendKV(vctx, values, ch) values = []*storage.KeyValue{} } // Did we pass the final key? if bytes.Compare(itKey, maxKey) > 0 { if len(values) > 0 { sendKV(vctx, values, ch) } ch <- errorableKV{nil, nil} return } // log.Printf("Appending value with key %v\n", itKey) values = append(values, &storage.KeyValue{itKey, itValue}) it.Next() } else { if err = it.GetError(); err != nil { ch <- errorableKV{nil, err} } else { sendKV(vctx, values, ch) ch <- errorableKV{nil, nil} } return } } }