Beispiel #1
0
func copyMetaTile(metaCoord gopnik.TileCoord, cfg *Config, from, to gopnik.CachePluginInterface) {
	var metaTile []gopnik.Tile

	for y := uint(0); y < cfg.MetaSize; y++ {
		for x := uint(0); x < cfg.MetaSize; x++ {
			coord := gopnik.TileCoord{
				X:    metaCoord.X + uint64(x),
				Y:    metaCoord.Y + uint64(y),
				Zoom: metaCoord.Zoom,
				Size: 1,
				Tags: metaCoord.Tags,
			}

			attempt := 0
		TRYLOOP:
			for {
				if cfg.Copy.Retries > 0 {
					attempt++
				}

				var err error
				var rawTile []byte

				rawTile, err = from.Get(coord)
				if err != nil {
					if attempt <= cfg.Copy.Retries {
						log.Error("Get error: %v", err)
						continue
					} else {
						if cfg.Copy.SkipErrors {
							log.Error("Get error: %v", err)
							return
						}
						log.Fatalf("Get error: %v", err)
					}
				}

				tile, err := gopnik.NewTile(rawTile)
				if err != nil {
					if attempt <= cfg.Copy.Retries {
						log.Error("NewTile error: %v", err)
						continue
					} else {
						if cfg.Copy.SkipErrors {
							log.Error("NewTile error: %v", err)
							return
						}
						log.Fatalf("NewTile error: %v", err)
					}
				}

				metaTile = append(metaTile, *tile)
				break TRYLOOP
			}
		}
	}

	attempt := 0
TRYLOOP2:
	for {
		if cfg.Copy.Retries > 0 {
			attempt++
		}

		err := to.Set(metaCoord, metaTile)
		if err != nil {
			if attempt <= cfg.Copy.Retries {
				log.Error("Set error: %v", err)
				continue
			} else {
				if cfg.Copy.SkipErrors {
					log.Error("Set error: %v", err)
					return
				}
				log.Fatalf("Set error: %v", err)
			}
		}
		break TRYLOOP2
	}
}