Skip to content
Snippets Groups Projects

Handle repository creations, deletions and renames atomically

Merged Sami Hiltunen requested to merge smh-repository-id-rename-repository into master
Compare and Show latest version
3 files
+ 34
69
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -7,7 +7,6 @@ import (
"flag"
"fmt"
"strings"
"sync"
"time"
"github.com/sirupsen/logrus"
@@ -91,16 +90,6 @@ func (cmd *removeRepository) exec(ctx context.Context, logger logrus.FieldLogger
return fmt.Errorf("get praefect address from config: %w", err)
}
logger.Debugf("remove repository info from praefect database %q", addr)
removed, err := cmd.removeRepositoryFromDatabase(ctx, db)
if err != nil {
return fmt.Errorf("remove repository info from praefect database: %w", err)
}
if !removed {
logger.Warn("praefect database has no info about the repository")
}
logger.Debug("removal of the repository info from praefect database completed")
logger.Debug("remove replication events")
ticker := helper.NewTimerTicker(time.Second)
defer ticker.Stop()
@@ -109,10 +98,15 @@ func (cmd *removeRepository) exec(ctx context.Context, logger logrus.FieldLogger
}
logger.Debug("replication events removal completed")
// We should try to remove repository from each of gitaly nodes.
logger.Debug("remove repository directly by each gitaly node")
cmd.removeRepositoryForEachGitaly(ctx, cfg, logger)
logger.Debug("direct repository removal by each gitaly node completed")
_, err = cmd.removeRepository(ctx, &gitalypb.Repository{
StorageName: cmd.virtualStorage,
RelativePath: cmd.relativePath,
}, addr, cfg.Auth.Token)
if err != nil {
return fmt.Errorf("repository removal failed: %w", err)
}
logger.Debug("repository removal completed")
return nil
}
@@ -203,29 +197,3 @@ func (cmd *removeRepository) removeReplicationEvents(ctx context.Context, logger
}
return nil
}
func (cmd *removeRepository) removeRepositoryForEachGitaly(ctx context.Context, cfg config.Config, logger logrus.FieldLogger) {
for _, vs := range cfg.VirtualStorages {
if vs.Name == cmd.virtualStorage {
var wg sync.WaitGroup
for i := 0; i < len(vs.Nodes); i++ {
wg.Add(1)
go func(node *config.Node) {
defer wg.Done()
logger.Debugf("remove repository with gitaly %q at %q", node.Storage, node.Address)
repo := &gitalypb.Repository{
StorageName: node.Storage,
RelativePath: cmd.relativePath,
}
_, err := cmd.removeRepository(ctx, repo, node.Address, node.Token)
if err != nil {
logger.WithError(err).Warnf("repository removal failed for gitaly %q", node.Storage)
}
logger.Debugf("repository removal call to gitaly %q completed", node.Storage)
}(vs.Nodes[i])
}
wg.Wait()
break
}
}
}
Loading