本文整理汇总了Golang中github.com/janelia-flyem/dvid/dvid.Debugf函数的典型用法代码示例。如果您正苦于以下问题:Golang Debugf函数的具体用法?Golang Debugf怎么用?Golang Debugf使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Debugf函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: mainHandler
// Handler for web client and other static content
func mainHandler(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path
if config == nil {
log.Fatalf("mainHandler() called when server was not configured!\n")
}
// Serve from embedded files in executable if not web client directory was specified
if config.WebClient() == "" {
if len(path) > 0 && path[0:1] == "/" {
path = path[1:]
}
dvid.Debugf("[%s] Serving from embedded files: %s\n", r.Method, path)
resource := nrsc.Get(path)
if resource == nil {
http.NotFound(w, r)
return
}
rsrc, err := resource.Open()
if err != nil {
BadRequest(w, r, err)
return
}
data, err := ioutil.ReadAll(rsrc)
if err != nil {
BadRequest(w, r, err)
return
}
dvid.SendHTTP(w, r, path, data)
} else {
filename := filepath.Join(config.WebClient(), path)
dvid.Debugf("[%s] Serving from webclient directory: %s\n", r.Method, filename)
http.ServeFile(w, r, filename)
}
}
开发者ID:jwohlwend,项目名称:dvid,代码行数:36,代码来源:web.go
示例2: RawPut
func (db *KVAutobus) RawPut(key storage.Key, value []byte) error {
b64key := encodeKey(key)
url := fmt.Sprintf("%s/kvautobus/api/value/%s/", db.host, b64key)
bin := Binary(value)
dvid.Debugf("Begin RawPut on key %s (%d bytes)\n", hex.EncodeToString(key), len(bin))
// Create pipe from encoding to posting
pr, pw := io.Pipe()
w := msgp.NewWriter(pw)
go func() {
dvid.Debugf("Starting msgpack encoding...\n")
bin.EncodeMsg(w)
w.Flush()
pw.Close()
dvid.Debugf("Done msgpack encoding.\n")
}()
dvid.Debugf("Beginning POST to kvautobus: %s\n", url)
resp, err := http.Post(url, "application/x-msgpack", pr)
dvid.Debugf("Done POST with err %v\n", err)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode == http.StatusConflict {
return fmt.Errorf("Can't POST to an already stored key. KVAutobus returned status %d (%s)", resp.StatusCode, url)
}
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("Bad status code returned (%d) from put request: %s", resp.StatusCode, url)
}
return nil
}
开发者ID:jmptrader,项目名称:dvid,代码行数:33,代码来源:kvautobus.go
示例3: Close
func (s *Session) Close() error {
dvid.Debugf("session %d close: waiting for any jobs to complete...\n", s.id)
s.Wait()
dvid.Debugf("sending session end to remote...\n")
_, err := s.dc.Call(sendEndSession, s.id)
dvid.Debugf("stopping client...\n")
s.c.Stop()
return err
}
开发者ID:tartavull,项目名称:dvid,代码行数:9,代码来源:client.go
示例4: NewFilter
// NewFilter returns a Filter for use with a push of key-value pairs.
func (d *Data) NewFilter(fs storage.FilterSpec) (storage.Filter, error) {
roiIterator, _, found, err := roi.NewIteratorBySpec(fs, d)
if err != nil {
dvid.Debugf("No filter found that was parsable: %s\n", fs)
return nil, err
}
if !found || roiIterator == nil {
dvid.Debugf("No ROI found so using generic data push for data %q.\n", d.DataName())
return nil, nil
}
return &Filter{d, fs, roiIterator}, nil
}
开发者ID:tartavull,项目名称:dvid,代码行数:13,代码来源:push.go
示例5: getDeltaAll
// compares remote Repo with local one, determining a list of versions that
// need to be sent from remote to bring the local DVID up-to-date.
func getDeltaAll(remote *repoT, uuid dvid.UUID) (map[dvid.VersionID]struct{}, error) {
// Determine all version ids of remote DAG nodes that aren't in the local DAG.
// Since VersionID can differ among DVID servers, we need to compare using UUIDs
// then convert to VersionID.
delta := make(map[dvid.VersionID]struct{})
for _, rnode := range remote.dag.nodes {
lv, found := manager.uuidToVersion[rnode.uuid]
if found {
dvid.Debugf("Both remote and local have uuid %s... skipping\n", rnode.uuid)
} else {
dvid.Debugf("Found version %s in remote not in local: sending local version id %d\n", rnode.uuid, lv)
delta[lv] = struct{}{}
}
}
return delta, nil
}
开发者ID:tartavull,项目名称:dvid,代码行数:18,代码来源:push_local.go
示例6: MergeLabels
// MergeLabels handles merging of any number of labels throughout the various label data
// structures. It assumes that the merges aren't cascading, e.g., there is no attempt
// to merge label 3 into 4 and also 4 into 5. The caller should have flattened the merges.
// TODO: Provide some indication that subset of labels are under evolution, returning
// an "unavailable" status or 203 for non-authoritative response. This might not be
// feasible for clustered DVID front-ends due to coordination issues.
//
// EVENTS
//
// labels.MergeStartEvent occurs at very start of merge and transmits labels.DeltaMergeStart struct.
//
// labels.MergeBlockEvent occurs for every block of a merged label and transmits labels.DeltaMerge struct.
//
// labels.MergeEndEvent occurs at end of merge and transmits labels.DeltaMergeEnd struct.
//
func (d *Data) MergeLabels(v dvid.VersionID, m labels.MergeOp) error {
dvid.Debugf("Merging %s into label %d ...\n", m.Merged, m.Target)
// Signal that we are starting a merge.
evt := datastore.SyncEvent{d.DataUUID(), labels.MergeStartEvent}
msg := datastore.SyncMessage{labels.MergeStartEvent, v, labels.DeltaMergeStart{m}}
if err := datastore.NotifySubscribers(evt, msg); err != nil {
return err
}
// Asynchronously perform merge and handle any concurrent requests using the cache map until
// labelvol and labelblk are updated and consistent.
// Mark these labels as dirty until done.
if err := labels.MergeStart(d.getMergeIV(v), m); err != nil {
return err
}
go func() {
d.asyncMergeLabels(v, m)
// Remove dirty labels and updating flag when done.
labels.MergeStop(d.getMergeIV(v), m)
}()
return nil
}
开发者ID:tartavull,项目名称:dvid,代码行数:40,代码来源:merge_split.go
示例7: SetWriteBufferSize
// Amount of data to build up in memory (backed by an unsorted log
// on disk) before converting to a sorted on-disk file.
//
// Larger values increase performance, especially during bulk loads.
// Up to two write buffers may be held in memory at the same time,
// so you may wish to adjust this parameter to control memory usage.
// Also, a larger write buffer will result in a longer recovery time
// the next time the database is opened.
func (opts *leveldbOptions) SetWriteBufferSize(nBytes int) {
if nBytes != opts.writeBufferSize {
dvid.Debugf("Write buffer set to %d bytes.\n", nBytes)
opts.Options.SetWriteBufferSize(nBytes)
opts.writeBufferSize = nBytes
}
}
开发者ID:hanslovsky,项目名称:dvid,代码行数:15,代码来源:couchbase.go
示例8: SetBlockSize
// Approximate size of user data packed per block. Note that the
// block size specified here corresponds to uncompressed data. The
// actual size of the unit read from disk may be smaller if
// compression is enabled. This parameter can be changed dynamically.
func (opts *leveldbOptions) SetBlockSize(nBytes int) {
if nBytes != opts.blockSize {
dvid.Debugf("Block size set to %d bytes.\n", nBytes)
opts.Options.SetBlockSize(nBytes)
opts.blockSize = nBytes
}
}
开发者ID:hanslovsky,项目名称:dvid,代码行数:11,代码来源:couchbase.go
示例9: GetSparseCoarseVol
// GetSparseCoarseVol returns an encoded sparse volume given a label. The encoding has the
// following format where integers are little endian:
// byte Set to 0
// uint8 Number of dimensions
// uint8 Dimension of run (typically 0 = X)
// byte Reserved (to be used later)
// uint32 # Blocks [TODO. 0 for now]
// uint32 # Spans
// Repeating unit of:
// int32 Block coordinate of run start (dimension 0)
// int32 Block coordinate of run start (dimension 1)
// int32 Block coordinate of run start (dimension 2)
// int32 Length of run
//
func GetSparseCoarseVol(ctx storage.Context, label uint64) ([]byte, error) {
store, err := storage.SmallDataStore()
if err != nil {
return nil, fmt.Errorf("Data type labelvol had error initializing store: %v\n", err)
}
// Create the sparse volume header
buf := new(bytes.Buffer)
buf.WriteByte(dvid.EncodingBinary)
binary.Write(buf, binary.LittleEndian, uint8(3)) // # of dimensions
binary.Write(buf, binary.LittleEndian, byte(0)) // dimension of run (X = 0)
buf.WriteByte(byte(0)) // reserved for later
binary.Write(buf, binary.LittleEndian, uint32(0)) // Placeholder for # blocks
encoding := buf.Bytes()
// Get the start/end indices for this body's KeyLabelSpatialMap (b + s) keys.
begTKey := NewTKey(label, dvid.MinIndexZYX.ToIZYXString())
endTKey := NewTKey(label, dvid.MaxIndexZYX.ToIZYXString())
// Process all the b+s keys and their values, which contain RLE runs for that label.
var numBlocks uint32
var span *dvid.Span
var spans dvid.Spans
keys, err := store.KeysInRange(ctx, begTKey, endTKey)
if err != nil {
return nil, fmt.Errorf("Cannot get keys for coarse sparse volume: %v", err)
}
for _, tk := range keys {
numBlocks++
_, blockStr, err := DecodeTKey(tk)
if err != nil {
return nil, fmt.Errorf("Error retrieving RLE runs for label %d: %v", label, err)
}
indexZYX, err := blockStr.IndexZYX()
if err != nil {
return nil, fmt.Errorf("Error decoding block coordinate (%v) for sparse volume: %v\n", blockStr, err)
}
x, y, z := indexZYX.Unpack()
if span == nil {
span = &dvid.Span{z, y, x, x}
} else if !span.Extends(x, y, z) {
spans = append(spans, *span)
span = &dvid.Span{z, y, x, x}
}
}
if err != nil {
return nil, err
}
if span != nil {
spans = append(spans, *span)
}
spansBytes, err := spans.MarshalBinary()
if err != nil {
return nil, err
}
encoding = append(encoding, spansBytes...)
dvid.Debugf("[%s] coarse subvol for label %d: found %d blocks\n", ctx, label, numBlocks)
return encoding, nil
}
开发者ID:jwohlwend,项目名称:dvid,代码行数:73,代码来源:labelvol.go
示例10: writeBlocks
// TODO -- Clean up all the writing and simplify now that we have block-aligned writes.
// writeBlocks ingests blocks of voxel data asynchronously using batch writes.
func (d *Data) writeBlocks(v dvid.VersionID, b storage.TKeyValues, wg1, wg2 *sync.WaitGroup) error {
batcher, err := d.GetKeyValueBatcher()
if err != nil {
return err
}
preCompress, postCompress := 0, 0
ctx := datastore.NewVersionedCtx(d, v)
evt := datastore.SyncEvent{d.DataUUID(), IngestBlockEvent}
<-server.HandlerToken
go func() {
defer func() {
wg1.Done()
wg2.Done()
dvid.Debugf("Wrote voxel blocks. Before %s: %d bytes. After: %d bytes\n", d.Compression(), preCompress, postCompress)
server.HandlerToken <- 1
}()
mutID := d.NewMutationID()
batch := batcher.NewBatch(ctx)
for i, block := range b {
serialization, err := dvid.SerializeData(block.V, d.Compression(), d.Checksum())
preCompress += len(block.V)
postCompress += len(serialization)
if err != nil {
dvid.Errorf("Unable to serialize block: %v\n", err)
return
}
batch.Put(block.K, serialization)
indexZYX, err := DecodeTKey(block.K)
if err != nil {
dvid.Errorf("Unable to recover index from block key: %v\n", block.K)
return
}
msg := datastore.SyncMessage{IngestBlockEvent, v, Block{indexZYX, block.V, mutID}}
if err := datastore.NotifySubscribers(evt, msg); err != nil {
dvid.Errorf("Unable to notify subscribers of ChangeBlockEvent in %s\n", d.DataName())
return
}
// Check if we should commit
if i%KVWriteSize == KVWriteSize-1 {
if err := batch.Commit(); err != nil {
dvid.Errorf("Error on trying to write batch: %v\n", err)
return
}
batch = batcher.NewBatch(ctx)
}
}
if err := batch.Commit(); err != nil {
dvid.Errorf("Error on trying to write batch: %v\n", err)
return
}
}()
return nil
}
开发者ID:tartavull,项目名称:dvid,代码行数:61,代码来源:write.go
示例11: RegisterEngine
// RegisterEngine registers an Engine for DVID use.
func RegisterEngine(e Engine) {
dvid.Debugf("Engine %q registered with DVID server.\n", e)
if availEngines == nil {
availEngines = map[string]Engine{e.GetName(): e}
} else {
availEngines[e.GetName()] = e
}
}
开发者ID:janelia-flyem,项目名称:dvid,代码行数:9,代码来源:storage.go
示例12: DeleteRange
// DeleteRange removes all key-value pairs with keys in the given range.
func (db *LevelDB) DeleteRange(ctx storage.Context, kStart, kEnd storage.TKey) error {
if ctx == nil {
return fmt.Errorf("Received nil context in DeleteRange()")
}
// For leveldb, we just iterate over keys in range and delete each one using batch.
const BATCH_SIZE = 10000
batch := db.NewBatch(ctx).(*goBatch)
ch := make(chan errorableKV)
// Run the keys-only range query in a goroutine.
go func() {
if ctx == nil || !ctx.Versioned() {
db.unversionedRange(ctx, kStart, kEnd, ch, true)
} else {
db.versionedRange(ctx.(storage.VersionedCtx), kStart, kEnd, ch, true)
}
}()
// Consume the key-value pairs.
numKV := 0
for {
result := <-ch
if result.KeyValue == nil {
break
}
if result.error != nil {
return result.error
}
// The key coming down channel is not index but full key, so no need to construct key using context.
// If versioned, write a tombstone using current version id since we don't want to delete locked ancestors.
// If unversioned, just delete.
tk, err := ctx.TKeyFromKey(result.KeyValue.K)
if err != nil {
return err
}
batch.Delete(tk)
if (numKV+1)%BATCH_SIZE == 0 {
if err := batch.Commit(); err != nil {
batch.Close()
return fmt.Errorf("Error on batch DELETE at key-value pair %d: %v\n", numKV, err)
}
batch = db.NewBatch(ctx).(*goBatch)
}
numKV++
}
if numKV%BATCH_SIZE != 0 {
if err := batch.Commit(); err != nil {
batch.Close()
return fmt.Errorf("Error on last batch DELETE: %v\n", err)
}
}
dvid.Debugf("Deleted %d key-value pairs via delete range for %s.\n", numKV, ctx)
return nil
}
开发者ID:jwohlwend,项目名称:dvid,代码行数:59,代码来源:basholeveldb.go
示例13: DoRPC
// DoRPC acts as a switchboard for RPC commands.
func (d *Data) DoRPC(req datastore.Request, reply *datastore.Response) error {
switch req.TypeCommand() {
case "load":
if len(req.Command) < 5 {
return fmt.Errorf("Poorly formatted load command. See command-line help.")
}
// Parse the request
var uuidStr, dataName, cmdStr, offsetStr string
filenames, err := req.FilenameArgs(1, &uuidStr, &dataName, &cmdStr, &offsetStr)
if err != nil {
return err
}
if len(filenames) == 0 {
return fmt.Errorf("Need to include at least one file to add: %s", req)
}
// Get offset
offset, err := dvid.StringToPoint(offsetStr, ",")
if err != nil {
return fmt.Errorf("Illegal offset specification: %s: %v", offsetStr, err)
}
// Get list of files to add
var addedFiles string
if len(filenames) == 1 {
addedFiles = filenames[0]
} else {
addedFiles = fmt.Sprintf("filenames: %s [%d more]", filenames[0], len(filenames)-1)
}
dvid.Debugf(addedFiles + "\n")
uuid, versionID, err := datastore.MatchingUUID(uuidStr)
if err != nil {
return err
}
if err = datastore.AddToNodeLog(uuid, []string{req.Command.String()}); err != nil {
return err
}
if err = d.LoadImages(versionID, offset, filenames); err != nil {
return err
}
if err := datastore.SaveDataByUUID(uuid, d); err != nil {
return err
}
return nil
case "composite":
if len(req.Command) < 6 {
return fmt.Errorf("Poorly formatted composite command. See command-line help.")
}
return d.CreateComposite(req, reply)
default:
return fmt.Errorf("Unknown command. Data type '%s' [%s] does not support '%s' command.",
d.DataName(), d.TypeName(), req.TypeCommand())
}
return nil
}
开发者ID:jmptrader,项目名称:dvid,代码行数:59,代码来源:labelblk.go
示例14: Close
func (p *pusher) Close() error {
gb := float64(p.received) / 1000000000
dvid.Debugf("Closing push of uuid %s: received %.1f GBytes in %s\n", p.repo.uuid, gb, time.Since(p.startTime))
// Add this repo to current DVID server
if err := manager.addRepo(p.repo); err != nil {
return err
}
return nil
}
开发者ID:tartavull,项目名称:dvid,代码行数:10,代码来源:push_local.go
示例15: SetLRUCacheSize
// SetCache sets the size of the LRU cache that caches frequently used
// uncompressed blocks.
func (opts *leveldbOptions) SetLRUCacheSize(nBytes int) {
if nBytes != opts.nLRUCacheBytes {
if opts.cache != nil {
opts.cache.Close()
}
dvid.Debugf("LRU cache size set to %d bytes.\n", nBytes)
opts.cache = levigo.NewLRUCache(nBytes)
opts.nLRUCacheBytes = nBytes
opts.Options.SetCache(opts.cache)
}
}
开发者ID:hanslovsky,项目名称:dvid,代码行数:13,代码来源:couchbase.go
示例16: MergeStop
// MergeStop marks the end of a merge operation.
func MergeStop(iv dvid.InstanceVersion, op MergeOp) {
// Adjust the dirty counts on the involved labels.
labelsMerging.RemoveMerge(iv, op)
// Remove the merge from the mapping.
mc.Remove(iv, op)
// If the instance version's dirty cache is empty, we can delete the merge cache.
if labelsMerging.Empty(iv) {
dvid.Debugf("Merge cache now empty for %s\n", iv)
mc.DeleteMap(iv)
}
}
开发者ID:janelia-flyem,项目名称:dvid,代码行数:14,代码来源:labels.go
示例17: init
func init() {
shutdownCh = make(chan struct{})
// Set the GC closer to old Go 1.4 setting
old := debug.SetGCPercent(defaultGCPercent)
dvid.Debugf("DVID server GC target percentage changed from %d to %d\n", old, defaultGCPercent)
// Initialize the number of handler tokens available.
for i := 0; i < MaxChunkHandlers; i++ {
HandlerToken <- 1
}
// Monitor the handler token load, resetting every second.
loadCheckTimer := time.Tick(10 * time.Millisecond)
ticks := 0
go func() {
for {
<-loadCheckTimer
ticks = (ticks + 1) % 100
if ticks == 0 {
ActiveHandlers = curActiveHandlers
curActiveHandlers = 0
}
numHandlers := MaxChunkHandlers - len(HandlerToken)
if numHandlers > curActiveHandlers {
curActiveHandlers = numHandlers
}
}
}()
// Monitor the # of interactive requests over last 2 minutes.
go func() {
tick := time.Tick(5 * time.Second)
for {
select {
case <-interactiveOpsCh:
interactiveOps[0]++
case <-tick:
newCount := InteractiveOpsPer2Min - interactiveOps[23] + interactiveOps[0]
InteractiveOpsPer2Min = newCount
copy(interactiveOps[1:], interactiveOps[:23])
interactiveOps[0] = 0
}
}
}()
}
开发者ID:tartavull,项目名称:dvid,代码行数:46,代码来源:server.go
示例18: startData
func (p *pusher) startData(d *DataTxInit) error {
p.stats = new(txStats)
p.stats.lastTime = time.Now()
p.stats.lastBytes = 0
p.dname = d.DataName
// Get the store associated with this data instance.
store, err := storage.GetAssignedStore(d.DataName, p.uuid, d.TypeName)
if err != nil {
return err
}
var ok bool
p.store, ok = store.(storage.KeyValueDB)
if !ok {
return fmt.Errorf("backend store %q for data type %q of tx data %q is not KeyValueDB-compatable", p.store, d.TypeName, d.DataName)
}
dvid.Debugf("Push (session %d) starting transfer of data %q...\n", p.sessionID, d.DataName)
return nil
}
开发者ID:tartavull,项目名称:dvid,代码行数:20,代码来源:push_local.go
示例19: addKV
// record stats on size of values
func (t *txStats) addKV(k, v []byte) {
t.numKV++
vBytes := len(v)
kBytes := len(k)
curBytes := uint64(kBytes + vBytes)
t.lastBytes += curBytes
t.totalBytes += curBytes
switch {
case vBytes == 0:
t.numV0++
case vBytes < 10:
t.numV1++
case vBytes < 100:
t.numV10++
case vBytes < 1000:
t.numV100++
case vBytes < 10000:
t.numV1k++
case vBytes < 100000:
t.numV10k++
case vBytes < 1000000:
t.numV100k++
case vBytes < 10000000:
t.numV1m++
default:
t.numV10m++
}
// Print progress?
if elapsed := time.Since(t.lastTime); elapsed > time.Minute {
mb := float64(t.lastBytes) / 1000000
sec := elapsed.Seconds()
throughput := mb / sec
dvid.Debugf("Transfer throughput: %5.2f MB/s (%s in %4.1f seconds). Total %s\n", throughput, humanize.Bytes(t.lastBytes), sec, humanize.Bytes(t.totalBytes))
t.lastTime = time.Now()
t.lastBytes = 0
}
}
开发者ID:tartavull,项目名称:dvid,代码行数:42,代码来源:copy_local.go
示例20: SplitCoarseLabels
// SplitCoarseLabels splits a portion of a label's voxels into a given split label or, if the given split
// label is 0, a new label, which is returned. The input is a binary sparse volume defined by block
// coordinates and should be the smaller portion of a labeled region-to-be-split.
//
// EVENTS
//
// labels.SplitStartEvent occurs at very start of split and transmits labels.DeltaSplitStart struct.
//
// labels.SplitBlockEvent occurs for every block of a split label and transmits labels.DeltaSplit struct.
//
// labels.SplitEndEvent occurs at end of split and transmits labels.DeltaSplitEnd struct.
//
func (d *Data) SplitCoarseLabels(v dvid.VersionID, fromLabel, splitLabel uint64, r io.ReadCloser) (toLabel uint64, err error) {
store, err := d.GetOrderedKeyValueDB()
if err != nil {
err = fmt.Errorf("Data type labelvol had error initializing store: %v\n", err)
return
}
batcher, ok := store.(storage.KeyValueBatcher)
if !ok {
err = fmt.Errorf("Data type labelvol requires batch-enabled store, which %q is not\n", store)
return
}
// Create a new label id for this version that will persist to store
if splitLabel != 0 {
toLabel = splitLabel
dvid.Debugf("Splitting coarse subset of label %d into given label %d ...\n", fromLabel, splitLabel)
} else {
toLabel, err = d.NewLabel(v)
if err != nil {
return
}
dvid.Debugf("Splitting coarse subset of label %d into new label %d ...\n", fromLabel, toLabel)
}
evt := datastore.SyncEvent{d.DataUUID(), labels.SplitStartEvent}
splitOpStart := labels.DeltaSplitStart{fromLabel, toLabel}
splitOpEnd := labels.DeltaSplitEnd{fromLabel, toLabel}
// Make sure we can split given current merges in progress
if err := labels.SplitStart(d.getMergeIV(v), splitOpStart); err != nil {
return toLabel, err
}
defer labels.SplitStop(d.getMergeIV(v), splitOpEnd)
// Signal that we are starting a split.
msg := datastore.SyncMessage{labels.SplitStartEvent, v, splitOpStart}
if err := datastore.NotifySubscribers(evt, msg); err != nil {
return 0, err
}
// Read the sparse volume from reader.
var splits dvid.RLEs
splits, err = dvid.ReadRLEs(r)
if err != nil {
return
}
numBlocks, _ := splits.Stats()
// Order the split blocks
splitblks := make(dvid.IZYXSlice, numBlocks)
n := 0
for _, rle := range splits {
p := rle.StartPt()
run := rle.Length()
for i := int32(0); i < run; i++ {
izyx := dvid.IndexZYX{p[0] + i, p[1], p[2]}
splitblks[n] = izyx.ToIZYXString()
n++
}
}
sort.Sort(splitblks)
// Iterate through the split blocks, read the original block and change labels.
// TODO: Modifications should be transactional since it's GET-PUT, therefore use
// hash on block coord to direct it to block-specific goroutine; we serialize
// requests to handle concurrency.
ctx := datastore.NewVersionedCtx(d, v)
batch := batcher.NewBatch(ctx)
var toLabelSize uint64
for _, splitblk := range splitblks {
// Get original block
tk := NewTKey(fromLabel, splitblk)
val, err := store.Get(ctx, tk)
if err != nil {
return toLabel, err
}
if val == nil {
return toLabel, fmt.Errorf("Split block %s is not part of original label %d", splitblk, fromLabel)
}
var rles dvid.RLEs
if err := rles.UnmarshalBinary(val); err != nil {
return toLabel, fmt.Errorf("Unable to unmarshal RLE for original labels in block %s", splitblk)
}
numVoxels, _ := rles.Stats()
toLabelSize += numVoxels
// Delete the old block and save the sparse volume but under a new label.
//.........这里部分代码省略.........
开发者ID:janelia-flyem,项目名称:dvid,代码行数:101,代码来源:merge_split.go
注:本文中的github.com/janelia-flyem/dvid/dvid.Debugf函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论