// GetLastTrimmed returns the last tile as read-only trimmed to contain at // most NCommits. It caches trimmed tiles as long as the underlying tiles // do not change. // // includeIgnores - If true then include ignored digests in the returned tile. func (s *Storage) GetLastTileTrimmed(includeIgnores bool) (*tiling.Tile, error) { // Retieve the most recent tile. tile := s.MasterTileBuilder.GetTile() s.mutex.Lock() defer s.mutex.Unlock() if s.NCommits <= 0 { return tile, nil } currentIgnoreRev := s.IgnoreStore.Revision() // Check if the tile hasn't changed and the ignores haven't changed. if s.lastTrimmedTile != nil && tile == s.lastTrimmedTile && s.lastTrimmedIgnoredTile != nil && currentIgnoreRev == s.lastIgnoreRev { if includeIgnores { return s.lastTrimmedTile, nil } else { return s.lastTrimmedIgnoredTile, nil } } ignores, err := s.IgnoreStore.List() if err != nil { return nil, fmt.Errorf("Failed to get ignores to filter tile: %s", err) } // Now copy the tile by value. retIgnoredTile := tile.Copy() // Then remove traces that should be ignored. ignoreQueries, err := ignore.ToQuery(ignores) if err != nil { return nil, err } for id, tr := range retIgnoredTile.Traces { for _, q := range ignoreQueries { if tiling.Matches(tr, q) { delete(retIgnoredTile.Traces, id) continue } } } // Cache this tile. s.lastIgnoreRev = currentIgnoreRev s.lastTrimmedTile = tile s.lastTrimmedIgnoredTile = retIgnoredTile fmt.Printf("Lengths: %d %d\n", len(s.lastTrimmedTile.Traces), len(s.lastTrimmedIgnoredTile.Traces)) if includeIgnores { return s.lastTrimmedTile, nil } else { return s.lastTrimmedIgnoredTile, nil } }
// GetLastTrimmed returns the last tile as read-only trimmed to contain at // most NCommits. It caches trimmed tiles as long as the underlying tiles // do not change. // // includeIgnores - If true then include ignored digests in the returned tile. func (s *Storage) GetLastTileTrimmed(includeIgnores bool) (*tiling.Tile, error) { // Get the last (potentially cached) tile. tile, err := s.TileStore.Get(0, -1) if err != nil { return nil, err } s.mutex.Lock() defer s.mutex.Unlock() if s.NCommits <= 0 { return tile, err } currentIgnoreRev := s.IgnoreStore.Revision() // Check if the tile hasn't changed and the ignores haven't changed. if tile == s.lastBaseTile && s.lastTrimmedTile != nil && s.lastTrimmedIgnoredTile != nil && currentIgnoreRev == s.lastIgnoreRev { if includeIgnores { return s.lastTrimmedTile, nil } else { return s.lastTrimmedIgnoredTile, nil } } ignores, err := s.IgnoreStore.List() if err != nil { return nil, fmt.Errorf("Failed to get ignores to filter tile: %s", err) } // Build a new trimmed tile and a new trimmed tile with all ingoreable traces removed. tileLen := tile.LastCommitIndex() + 1 // First build the new trimmed tile. retTile, err := tile.Trim(util.MaxInt(0, tileLen-s.NCommits), tileLen) if err != nil { return nil, err } // Now copy the tile by value. retIgnoredTile := retTile.Copy() // Then remove traces that should be ignored. ignoreQueries, err := ignore.ToQuery(ignores) if err != nil { return nil, err } for id, tr := range retIgnoredTile.Traces { for _, q := range ignoreQueries { if tiling.Matches(tr, q) { delete(retIgnoredTile.Traces, id) continue } } } // Cache this tile. s.lastIgnoreRev = currentIgnoreRev s.lastTrimmedTile = retTile s.lastTrimmedIgnoredTile = retIgnoredTile s.lastBaseTile = tile fmt.Printf("Lengths: %d %d\n", len(s.lastTrimmedTile.Traces), len(s.lastTrimmedIgnoredTile.Traces)) if includeIgnores { return s.lastTrimmedTile, nil } else { return s.lastTrimmedIgnoredTile, nil } }