func (m *repoManager) deleteData(r *repoT, name dvid.InstanceName) error { r.Lock() defer r.Unlock() data, found := r.data[name] if !found { return ErrInvalidDataName } // Delete entries in the sync graph if this data needs to be synced with another data instance. _, syncable := data.(Syncer) if syncable { r.deleteSyncGraph(name) } // Remove this data instance from the repository and persist. tm := time.Now() r.updated = tm msg := fmt.Sprintf("Delete data instance '%s' of type '%s'", name, data.TypeName()) message := fmt.Sprintf("%s %s", tm.Format(time.RFC3339), msg) r.log = append(r.log, message) r.dag.deleteDataInstance(name) delete(r.data, name) // For all data tiers of storage, remove data key-value pairs that would be associated with this instance id. go func() { if err := storage.DeleteDataInstance(data); err != nil { dvid.Errorf("Error trying to do async data instance deletion: %v\n", err) } }() return r.save() }
func (m *repoManager) deleteRepo(uuid dvid.UUID) error { m.Lock() defer m.Unlock() m.idMutex.RLock() defer m.idMutex.RUnlock() r, found := m.repos[uuid] if !found { return ErrInvalidUUID } r.Lock() // Start deletion of all data instances. for _, data := range r.data { go func(data dvid.Data) { if err := storage.DeleteDataInstance(data); err != nil { dvid.Errorf("Error trying to do async data instance %q deletion: %v\n", data.DataName(), err) } }(data) } // Delete the repo off the datastore. if err := r.delete(); err != nil { return fmt.Errorf("Unable to delete repo from datastore: %v", err) } r.Unlock() // Delete all UUIDs in this repo from metadata delete(m.repoToUUID, r.id) for v := range r.dag.nodes { u, found := m.versionToUUID[v] if !found { dvid.Errorf("Found version id %d with no corresponding UUID on delete of repo %s!\n", v, uuid) continue } delete(m.repos, u) delete(m.uuidToVersion, u) delete(m.versionToUUID, v) } return nil }