diff --git a/src/duplicacy_snapshotmanager.go b/src/duplicacy_snapshotmanager.go index 420f049..bc8b83f 100644 --- a/src/duplicacy_snapshotmanager.go +++ b/src/duplicacy_snapshotmanager.go @@ -896,90 +896,145 @@ func (manager *SnapshotManager) CheckSnapshots(snapshotID string, revisionsToChe snapshotIDIndex += 1 } + if showTabular { + manager.ShowStatisticsTabular(snapshotMap, chunkSizeMap, chunkUniqueMap, chunkSnapshotMap) + } else if showStatistics { + manager.ShowStatistics(snapshotMap, chunkSizeMap, chunkUniqueMap, chunkSnapshotMap) + } - if showStatistics { - tableBuffer := new(bytes.Buffer) - tableWriter := tabwriter.NewWriter(tableBuffer, 0, 0, 1, ' ', tabwriter.AlignRight|tabwriter.Debug) + return true +} - for snapshotID, snapshotList := range snapshotMap { - fmt.Fprintln(tableWriter, "") - fmt.Fprintln(tableWriter, " snap \trev \t \tfiles \tbytes \tchunks \tbytes \tuniq \tbytes \tnew \tbytes \t") - snapshotChunks := make(map[string]bool) +// Print snapshot and revision statistics +func (manager *SnapshotManager) ShowStatistics(snapshotMap map[string] [] *Snapshot, chunkSizeMap map[string]int64, chunkUniqueMap map[string]bool, + chunkSnapshotMap map[string]int) { + for snapshotID, snapshotList := range snapshotMap { - earliestSeenChunks := make(map[string]int) + snapshotChunks := make(map[string]bool) - for _, snapshot := range snapshotList { - for _, chunkID := range manager.GetSnapshotChunks(snapshot) { - if earliestSeenChunks[chunkID] == 0 { - earliestSeenChunks[chunkID] = math.MaxInt64 - } - earliestSeenChunks[chunkID] = MinInt(earliestSeenChunks[chunkID], snapshot.Revision) + for _, snapshot := range snapshotList { + + chunks := make(map[string]bool) + for _, chunkID := range manager.GetSnapshotChunks(snapshot) { + chunks[chunkID] = true + snapshotChunks[chunkID] = true + } + + var totalChunkSize int64 + var uniqueChunkSize int64 + + for chunkID, _ := range chunks { + chunkSize := chunkSizeMap[chunkID] + totalChunkSize += chunkSize + if chunkUniqueMap[chunkID] { + uniqueChunkSize += chunkSize } } - for _, snapshot := range snapshotList { + files := "" + if snapshot.FileSize != 0 && snapshot.NumberOfFiles != 0 { + files = fmt.Sprintf("%d files (%s bytes), ", snapshot.NumberOfFiles, PrettyNumber(snapshot.FileSize)) + } + LOG_INFO("SNAPSHOT_CHECK", "Snapshot %s at revision %d: %s%s total chunk bytes, %s unique chunk bytes", + snapshot.ID, snapshot.Revision, files, PrettyNumber(totalChunkSize), PrettyNumber(uniqueChunkSize)) + } - chunks := make(map[string]bool) - for _, chunkID := range manager.GetSnapshotChunks(snapshot) { - chunks[chunkID] = true - snapshotChunks[chunkID] = true + var totalChunkSize int64 + var uniqueChunkSize int64 + for chunkID, _ := range snapshotChunks { + chunkSize := chunkSizeMap[chunkID] + totalChunkSize += chunkSize + + if chunkSnapshotMap[chunkID] != -1 { + uniqueChunkSize += chunkSize + } + } + LOG_INFO("SNAPSHOT_CHECK", "Snapshot %s all revisions: %s total chunk bytes, %s unique chunk bytes", + snapshotID, PrettyNumber(totalChunkSize), PrettyNumber(uniqueChunkSize)) + } +} + +// Print snapshot and revision statistics in tabular format +func (manager *SnapshotManager) ShowStatisticsTabular(snapshotMap map[string] [] *Snapshot, chunkSizeMap map[string]int64, chunkUniqueMap map[string]bool, + chunkSnapshotMap map[string]int) { + tableBuffer := new(bytes.Buffer) + tableWriter := tabwriter.NewWriter(tableBuffer, 0, 0, 1, ' ', tabwriter.AlignRight|tabwriter.Debug) + + for snapshotID, snapshotList := range snapshotMap { + fmt.Fprintln(tableWriter, "") + fmt.Fprintln(tableWriter, " snap \trev \t \tfiles \tbytes \tchunks \tbytes \tuniq \tbytes \tnew \tbytes \t") + snapshotChunks := make(map[string]bool) + + earliestSeenChunks := make(map[string]int) + + for _, snapshot := range snapshotList { + for _, chunkID := range manager.GetSnapshotChunks(snapshot) { + if earliestSeenChunks[chunkID] == 0 { + earliestSeenChunks[chunkID] = math.MaxInt64 } + earliestSeenChunks[chunkID] = MinInt(earliestSeenChunks[chunkID], snapshot.Revision) + } + } - var totalChunkSize int64 - var uniqueChunkSize int64 - var totalChunkCount int64 - var uniqueChunkCount int64 - var newChunkCount int64 - var newChunkSize int64 + for _, snapshot := range snapshotList { - for chunkID, _ := range chunks { - chunkSize := chunkSizeMap[chunkID] - totalChunkSize += chunkSize - totalChunkCount += 1 - if earliestSeenChunks[chunkID] == snapshot.Revision { - newChunkCount += 1 - newChunkSize += chunkSize - } - if chunkUniqueMap[chunkID] { - uniqueChunkSize += chunkSize - uniqueChunkCount += 1 - } - } - - files := " \t " - if snapshot.FileSize != 0 && snapshot.NumberOfFiles != 0 { - files = fmt.Sprintf("%d \t%s", snapshot.NumberOfFiles, PrettyNumber(snapshot.FileSize)) - } - creationTime := time.Unix(snapshot.StartTime, 0).Format("2006-01-02 15:04") - fmt.Fprintln(tableWriter, fmt.Sprintf( - "%s \t%d \t@ %s %5s \t%s \t%d \t%s \t%d \t%s \t%d \t%s \t", - snapshotID, snapshot.Revision, creationTime, snapshot.Options, files, totalChunkCount, PrettyNumber(totalChunkSize), uniqueChunkCount, PrettyNumber(uniqueChunkSize), newChunkCount, PrettyNumber(newChunkSize))) + chunks := make(map[string]bool) + for _, chunkID := range manager.GetSnapshotChunks(snapshot) { + chunks[chunkID] = true + snapshotChunks[chunkID] = true } var totalChunkSize int64 var uniqueChunkSize int64 var totalChunkCount int64 var uniqueChunkCount int64 - for chunkID, _ := range snapshotChunks { + var newChunkCount int64 + var newChunkSize int64 + + for chunkID, _ := range chunks { chunkSize := chunkSizeMap[chunkID] totalChunkSize += chunkSize totalChunkCount += 1 - - if chunkSnapshotMap[chunkID] != -1 { + if earliestSeenChunks[chunkID] == snapshot.Revision { + newChunkCount += 1 + newChunkSize += chunkSize + } + if chunkUniqueMap[chunkID] { uniqueChunkSize += chunkSize uniqueChunkCount += 1 } } + + files := " \t " + if snapshot.FileSize != 0 && snapshot.NumberOfFiles != 0 { + files = fmt.Sprintf("%d \t%s", snapshot.NumberOfFiles, PrettyNumber(snapshot.FileSize)) + } + creationTime := time.Unix(snapshot.StartTime, 0).Format("2006-01-02 15:04") fmt.Fprintln(tableWriter, fmt.Sprintf( - "%s \tall \t \t \t \t%d \t%s \t%d \t%s \t \t \t", - snapshotID, totalChunkCount, PrettyNumber(totalChunkSize), uniqueChunkCount, PrettyNumber(uniqueChunkSize))) + "%s \t%d \t@ %s %5s \t%s \t%d \t%s \t%d \t%s \t%d \t%s \t", + snapshotID, snapshot.Revision, creationTime, snapshot.Options, files, totalChunkCount, PrettyNumber(totalChunkSize), uniqueChunkCount, PrettyNumber(uniqueChunkSize), newChunkCount, PrettyNumber(newChunkSize))) } - tableWriter.Flush() - LOG_INFO("SNAPSHOT_CHECK", tableBuffer.String()) + + var totalChunkSize int64 + var uniqueChunkSize int64 + var totalChunkCount int64 + var uniqueChunkCount int64 + for chunkID, _ := range snapshotChunks { + chunkSize := chunkSizeMap[chunkID] + totalChunkSize += chunkSize + totalChunkCount += 1 + + if chunkSnapshotMap[chunkID] != -1 { + uniqueChunkSize += chunkSize + uniqueChunkCount += 1 + } + } + fmt.Fprintln(tableWriter, fmt.Sprintf( + "%s \tall \t \t \t \t%d \t%s \t%d \t%s \t \t \t", + snapshotID, totalChunkCount, PrettyNumber(totalChunkSize), uniqueChunkCount, PrettyNumber(uniqueChunkSize))) } - - return true - + tableWriter.Flush() + LOG_INFO("SNAPSHOT_CHECK", tableBuffer.String()) } // ConvertSequence converts a sequence of chunk hashes into a sequence of chunk ids.