Skip to content

Commit b9b0627

Browse files
committed
refactor DumpServer
1 parent 93eb34d commit b9b0627

File tree

2 files changed

+45
-61
lines changed

2 files changed

+45
-61
lines changed

main.go

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -97,21 +97,17 @@ func realMain() int {
9797
}()
9898

9999
logger := log.New(os.Stdout, "", 0)
100-
if c.Db < 0 { // <0 is for all dbs, easier to manage than a *uint unfortunately
101-
if err = redisdump.DumpServer(c.Host, c.Port, url.QueryEscape(redisPassword), tlshandler, c.Filter, c.NWorkers, c.WithTTL, c.BatchSize, c.Noscan, logger, serializer, progressNotifs); err != nil {
102-
fmt.Fprintf(os.Stderr, "%s", err)
103-
return 1
104-
}
105-
} else {
106-
var db *uint8 = new(uint8)
107-
if c.Db != -1 {
108-
*db = uint8(c.Db)
109-
}
110-
if err = redisdump.DumpDB(c.Host, c.Port, url.QueryEscape(redisPassword), tlshandler, db, c.Filter, c.NWorkers, c.WithTTL, c.BatchSize, c.Noscan, logger, serializer, progressNotifs); err != nil {
111-
fmt.Fprintf(os.Stderr, "%s", err)
112-
return 1
113-
}
100+
101+
var db = new(uint8)
102+
if c.Db >= 0 {
103+
*db = uint8(c.Db)
114104
}
105+
106+
if err = redisdump.DumpServer(c.Host, c.Port, url.QueryEscape(redisPassword), db, tlshandler, c.Filter, c.NWorkers, c.WithTTL, c.BatchSize, c.Noscan, logger, serializer, progressNotifs); err != nil {
107+
fmt.Fprintf(os.Stderr, "%s", err)
108+
return 1
109+
}
110+
115111
return 0
116112
}
117113

pkg/redisdump/redisdump.go

Lines changed: 35 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -263,24 +263,9 @@ func parseKeyspaceInfo(keyspaceInfo string) ([]uint8, error) {
263263
return dbs, nil
264264
}
265265

266-
func getDBIndexes(redisURL string, redisPassword string, tlsHandler *TlsHandler) ([]uint8, error) {
267-
customConnFunc := func(network, addr string) (radix.Conn, error) {
268-
dialOpts, err := redisDialOpts(redisPassword, tlsHandler, nil)
269-
if err != nil {
270-
return nil, err
271-
}
272-
273-
return radix.Dial(network, addr, dialOpts...)
274-
}
275-
276-
client, err := radix.NewPool("tcp", redisURL, 1, radix.PoolConnFunc(customConnFunc))
277-
if err != nil {
278-
return nil, err
279-
}
280-
defer client.Close()
281-
266+
func getDBIndexes(client *radix.Pool) ([]uint8, error) {
282267
var keyspaceInfo string
283-
if err = client.Do(radix.Cmd(&keyspaceInfo, "INFO", "keyspace")); err != nil {
268+
if err := client.Do(radix.Cmd(&keyspaceInfo, "INFO", "keyspace")); err != nil {
284269
return nil, err
285270
}
286271

@@ -363,9 +348,7 @@ func redisDialOpts(redisPassword string, tlsHandler *TlsHandler, db *uint8) ([]r
363348
}
364349

365350
// DumpDB dumps all keys from a single Redis DB
366-
func DumpDB(redisHost string, redisPort int, redisPassword string, tlsHandler *TlsHandler, db *uint8, filter string, nWorkers int, withTTL bool, batchSize int, noscan bool, logger *log.Logger, serializer Serializer, progress chan<- ProgressNotification) error {
367-
var err error
368-
351+
func DumpDB(client radix.Client, db *uint8, filter string, nWorkers int, withTTL bool, batchSize int, noscan bool, logger *log.Logger, serializer Serializer, progress chan<- ProgressNotification) error {
369352
keyGenerator := scanKeys
370353
if noscan {
371354
keyGenerator = scanKeysLegacy
@@ -380,27 +363,6 @@ func DumpDB(redisHost string, redisPort int, redisPassword string, tlsHandler *T
380363
}
381364
}()
382365

383-
redisURL := RedisURL(redisHost, fmt.Sprint(redisPort))
384-
customConnFunc := func(network, addr string) (radix.Conn, error) {
385-
dialOpts, err := redisDialOpts(redisPassword, tlsHandler, db)
386-
if err != nil {
387-
return nil, err
388-
}
389-
390-
return radix.Dial(network, addr, dialOpts...)
391-
}
392-
393-
client, err := radix.NewPool("tcp", redisURL, nWorkers, radix.PoolConnFunc(customConnFunc))
394-
if err != nil {
395-
return err
396-
}
397-
defer client.Close()
398-
399-
if err = client.Do(radix.Cmd(nil, "SELECT", fmt.Sprint(*db))); err != nil {
400-
return err
401-
}
402-
logger.Printf(serializer([]string{"SELECT", fmt.Sprint(*db)}))
403-
404366
done := make(chan bool)
405367
keyBatches := make(chan []string)
406368
for i := 0; i < nWorkers; i++ {
@@ -420,15 +382,41 @@ func DumpDB(redisHost string, redisPort int, redisPassword string, tlsHandler *T
420382
// DumpServer dumps all Keys from the redis server given by redisURL,
421383
// to the Logger logger. Progress notification informations
422384
// are regularly sent to the channel progressNotifications
423-
func DumpServer(redisHost string, redisPort int, redisPassword string, tlsHandler *TlsHandler, filter string, nWorkers int, withTTL bool, batchSize int, noscan bool, logger *log.Logger, serializer func([]string) string, progress chan<- ProgressNotification) error {
424-
url := RedisURL(redisHost, fmt.Sprint(redisPort))
425-
dbs, err := getDBIndexes(url, redisPassword, tlsHandler)
426-
if err != nil {
427-
return err
385+
func DumpServer(redisHost string, redisPort int, redisPassword string, db *uint8, tlsHandler *TlsHandler, filter string, nWorkers int, withTTL bool, batchSize int, noscan bool, logger *log.Logger, serializer func([]string) string, progress chan<- ProgressNotification) error {
386+
redisURL := RedisURL(redisHost, fmt.Sprint(redisPort))
387+
getConnFunc := func(db *uint8) func(network, addr string) (radix.Conn, error) {
388+
return func(network, addr string) (radix.Conn, error) {
389+
dialOpts, err := redisDialOpts(redisPassword, tlsHandler, db)
390+
if err != nil {
391+
return nil, err
392+
}
393+
394+
return radix.Dial(network, addr, dialOpts...)
395+
}
396+
}
397+
398+
dbs := []uint8{}
399+
if db != nil {
400+
dbs = []uint8{*db}
401+
} else {
402+
client, err := radix.NewPool("tcp", redisURL, nWorkers, radix.PoolConnFunc(getConnFunc(nil)))
403+
if err != nil {
404+
return err
405+
}
406+
407+
dbs, err = getDBIndexes(client)
408+
if err != nil {
409+
return err
410+
}
411+
client.Close()
428412
}
429413

430414
for _, db := range dbs {
431-
if err = DumpDB(redisHost, redisPort, redisPassword, tlsHandler, &db, filter, nWorkers, withTTL, batchSize, noscan, logger, serializer, progress); err != nil {
415+
client, err := radix.NewPool("tcp", redisURL, nWorkers, radix.PoolConnFunc(getConnFunc(&db)))
416+
if err != nil {
417+
return err
418+
}
419+
if err = DumpDB(client, &db, filter, nWorkers, withTTL, batchSize, noscan, logger, serializer, progress); err != nil {
432420
return err
433421
}
434422
}

0 commit comments

Comments
 (0)