forked from TrueCloudLab/distribution
a7c2dceea5
This changeset defines the interface for layer info caches. Layer info caches speed up access to layer meta data accessed in storage driver backends. The two main operations are tests for repository membership and resolving path and size information for backend blobs. Two implementations are available. The main implementation leverages redis to store layer info. An alternative implementation simply caches layer info in maps, which should speed up resolution for less sophisticated implementations. Signed-off-by: Stephen J Day <stephen.day@docker.com>
50 lines
1.2 KiB
Go
50 lines
1.2 KiB
Go
package cache
|
|
|
|
import (
|
|
"flag"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/garyburd/redigo/redis"
|
|
)
|
|
|
|
var redisAddr string
|
|
|
|
func init() {
|
|
flag.StringVar(&redisAddr, "test.registry.storage.cache.redis.addr", "", "configure the address of a test instance of redis")
|
|
}
|
|
|
|
// TestRedisLayerInfoCache exercises a live redis instance using the cache
|
|
// implementation.
|
|
func TestRedisLayerInfoCache(t *testing.T) {
|
|
if redisAddr == "" {
|
|
// fallback to an environement variable
|
|
redisAddr = os.Getenv("TEST_REGISTRY_STORAGE_CACHE_REDIS_ADDR")
|
|
}
|
|
|
|
if redisAddr == "" {
|
|
// skip if still not set
|
|
t.Skip("please set -registry.storage.cache.redis to test layer info cache against redis")
|
|
}
|
|
|
|
pool := &redis.Pool{
|
|
Dial: func() (redis.Conn, error) {
|
|
return redis.Dial("tcp", redisAddr)
|
|
},
|
|
MaxIdle: 1,
|
|
MaxActive: 2,
|
|
TestOnBorrow: func(c redis.Conn, t time.Time) error {
|
|
_, err := c.Do("PING")
|
|
return err
|
|
},
|
|
Wait: false, // if a connection is not avialable, proceed without cache.
|
|
}
|
|
|
|
// Clear the database
|
|
if _, err := pool.Get().Do("FLUSHDB"); err != nil {
|
|
t.Fatalf("unexpected error flushing redis db: %v", err)
|
|
}
|
|
|
|
checkLayerInfoCache(t, NewRedisLayerInfoCache(pool))
|
|
}
|