PostUpgrade performs post-upgrade processing for each database
(ctx context.Context, preview bool)
| 486 | |
| 487 | // PostUpgrade performs post-upgrade processing for each database |
| 488 | func (sc *ServerContext) PostUpgrade(ctx context.Context, preview bool) (postUpgradeResults PostUpgradeResult, err error) { |
| 489 | sc._databasesLock.RLock() |
| 490 | defer sc._databasesLock.RUnlock() |
| 491 | |
| 492 | var errs *base.MultiError |
| 493 | buckets := make(map[string]base.Bucket) // map of bucket name to bucket object |
| 494 | dbs := make(map[string]string, len(sc._databases)) // map of db name to bucket name |
| 495 | dbDesignDocs := make(map[string][]string, len(sc._databases)) // map of db name to removed design docs |
| 496 | bucketInUseIndexes := make(map[string]db.CollectionIndexes) // map of buckets to in use index names |
| 497 | bucketRemovedIndexes := make(map[string][]string) // map of bucket name to removed index names |
| 498 | for dbName, database := range sc._databases { |
| 499 | bucketName := database.Bucket.GetName() |
| 500 | dbs[dbName] = bucketName |
| 501 | buckets[bucketName] = database.Bucket |
| 502 | // View cleanup |
| 503 | removedDDocs, err := database.RemoveObsoleteDesignDocs(ctx, preview) |
| 504 | if err != nil { |
| 505 | errs = errs.Append(fmt.Errorf("Error removing obsolete design docs for database %q: %v", dbName, err)) |
| 506 | continue |
| 507 | } |
| 508 | dbDesignDocs[dbName] = removedDDocs |
| 509 | |
| 510 | // Index cleanup |
| 511 | inUseIndexes := database.GetInUseIndexes() |
| 512 | if _, ok := bucketInUseIndexes[database.Bucket.GetName()]; !ok { |
| 513 | bucketInUseIndexes[database.Bucket.GetName()] = make(db.CollectionIndexes) |
| 514 | } |
| 515 | for dsName, indexes := range inUseIndexes { |
| 516 | if _, ok := bucketInUseIndexes[database.Bucket.GetName()][dsName]; !ok { |
| 517 | bucketInUseIndexes[database.Bucket.GetName()][dsName] = make(map[string]struct{}) |
| 518 | } |
| 519 | for indexName := range indexes { |
| 520 | bucketInUseIndexes[database.Bucket.GetName()][dsName][indexName] = struct{}{} |
| 521 | } |
| 522 | } |
| 523 | } |
| 524 | |
| 525 | for bucketName, indexes := range bucketInUseIndexes { |
| 526 | bucket, ok := buckets[bucketName] |
| 527 | if !ok { |
| 528 | errs = errs.Append(fmt.Errorf("Error getting bucket %q for index cleanup: %v", bucketName, err)) |
| 529 | continue |
| 530 | } |
| 531 | if !bucket.IsSupported(sgbucket.BucketStoreFeatureN1ql) { |
| 532 | continue |
| 533 | } |
| 534 | removedIndexes, err := db.RemoveUnusedIndexes(ctx, bucket, indexes, preview) |
| 535 | if err != nil { |
| 536 | errs = errs.Append(fmt.Errorf("Error removing obsolete indexes for bucket %q: %v", bucketName, err)) |
| 537 | continue |
| 538 | } |
| 539 | bucketRemovedIndexes[bucketName] = removedIndexes |
| 540 | } |
| 541 | postUpgradeResults = make(map[string]PostUpgradeDatabaseResult, len(sc._databases)) |
| 542 | for dbName, database := range sc._databases { |
| 543 | postUpgradeResults[dbName] = PostUpgradeDatabaseResult{ |
| 544 | RemovedDDocs: dbDesignDocs[dbName], |
| 545 | RemovedIndexes: bucketRemovedIndexes[database.Bucket.GetName()], |
no test coverage detected