From 0b5357d197ef569341e9013582844f22d50b2125 Mon Sep 17 00:00:00 2001 From: Thomas Rudin Date: Fri, 6 Jul 2018 08:42:28 +0200 Subject: [PATCH] default to file based tile cache --- .gitignore | 3 +- readme.md | 79 ++++++++----------- .../minetest/tileserver/DBMigration.java | 14 ++-- .../minetest/tileserver/StaticTileGen.java | 10 ++- .../rudin/minetest/tileserver/TileServer.java | 15 ++-- .../tileserver/config/TileServerConfig.java | 16 +++- .../tileserver/job/UpdateChangedTilesJob.java | 12 +-- .../tileserver/module/ConfigModule.java | 8 +- .../minetest/tileserver/module/DBModule.java | 16 +++- .../tileserver/module/ServiceModule.java | 21 +++-- .../tileserver/service/TileCache.java | 4 +- .../service/impl/DatabaseTileCache.java | 15 ++++ .../service/impl/FileTileCache.java | 30 +++++-- .../minetest/tileserver/PerformanceTest.java | 27 ++----- .../tileserver/TileRendererMainTiming.java | 14 ++-- .../tileserver/service/MemoryCache.java | 52 ------------ .../tileserver/service/NoOpCache.java | 35 -------- 17 files changed, 168 insertions(+), 203 deletions(-) delete mode 100644 src/test/java/io/rudin/minetest/tileserver/service/MemoryCache.java delete mode 100644 src/test/java/io/rudin/minetest/tileserver/service/NoOpCache.java diff --git a/.gitignore b/.gitignore index 67fe78c..6e5ff8c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ logs node_modules heimdallr-data .idea -*.iml \ No newline at end of file +*.iml +tiles \ No newline at end of file diff --git a/readme.md b/readme.md index 156ccb5..9289665 100644 --- a/readme.md +++ b/readme.md @@ -36,43 +36,10 @@ Please create an issue with minetest-version and MapBlock info in the bug-tracke # Installing * Download the jar in the releases section -* Set up a tileserver database (empty, `create database tiles;`) * **Backup** your minetest database (**THIS IS IMPORTANT!!**) as the db schema gets updated (see **How it works**) -* Configure the database connections according to the **Configuration** section if they are not default value +* Configure the database connection according to the **Configuration** section if they are not default value * Start the server with: `java -jar tileserver.jar` -# How it works - -The **blocks** table in the minetest database gets a new column for the modification time. -Triggers for `insert` and `update` on the table ensure the time gets updated after each change: - -```sql -alter table blocks add column mtime bigint not null default 0; -create index BLOCKS_TIME on blocks(mtime); - -create or replace function on_blocks_change() returns trigger as -$BODY$ -BEGIN - NEW.mtime = floor(EXTRACT(EPOCH from now()) * 1000); - return NEW; -END; -$BODY$ -LANGUAGE plpgsql; - -create trigger blocks_update - before insert or update - on blocks - for each row - execute procedure on_blocks_change(); - -``` -**These changes get applied atomatically with the initial DB-Migration, so please create a backup before starting the Tileserver!!** - -With this information and the modification-time on the created tiles the -periodically scheduled Updater-Job removes the stale Tiles in the tile-cache. - -On the next access (browsing on the web-interface to the coordinates) the Tile gets re-rendered. - # Configuring The application drwas its configuration from the `tileserver.properties` file. @@ -124,21 +91,41 @@ Username for DB Connection Driver for DB Connection (only psql supported for now) * Default: **org.postgresql.Driver** -### tile.db.url -Url for Tile-DB Connection (jdbc connection string) -* Default: **jdbc:postgresql://127.0.0.1:5432/tiles** -### tile.db.username -Username for Tile-DB Connection -* Default: **sa** -### tile.db.password -Username for Tile-DB Connection -* Default: -### tile.db.driver -Driver for Tile-DB Connection (only psql supported for now) -* Default: **org.postgresql.Driver** +# How it works + +The **blocks** table in the minetest database gets a new column for the modification time. +Triggers for `insert` and `update` on the table ensure the time gets updated after each change: + +```sql +alter table blocks add column mtime bigint not null default 0; +create index BLOCKS_TIME on blocks(mtime); + +create or replace function on_blocks_change() returns trigger as +$BODY$ +BEGIN + NEW.mtime = floor(EXTRACT(EPOCH from now()) * 1000); + return NEW; +END; +$BODY$ +LANGUAGE plpgsql; + +create trigger blocks_update + before insert or update + on blocks + for each row + execute procedure on_blocks_change(); + +``` +**These changes get applied atomatically with the initial DB-Migration, so please create a backup before starting the Tileserver!!** + +With this information and the modification-time on the created tiles the +periodically scheduled Updater-Job removes the stale Tiles in the tile-cache. + +On the next access (browsing on the web-interface to the coordinates) the Tile gets re-rendered. + # Building diff --git a/src/main/java/io/rudin/minetest/tileserver/DBMigration.java b/src/main/java/io/rudin/minetest/tileserver/DBMigration.java index 3bc9911..003666f 100644 --- a/src/main/java/io/rudin/minetest/tileserver/DBMigration.java +++ b/src/main/java/io/rudin/minetest/tileserver/DBMigration.java @@ -17,16 +17,20 @@ public DBMigration(TileServerConfig cfg) { flyway.setBaselineVersionAsString("0"); flyway.setBaselineOnMigrate(true); - this.tileFlyway = new Flyway(); - tileFlyway.setDataSource(cfg.tileDatabaseUrl(), cfg.tileDatabaseUsername(), cfg.tileDatabasePassword()); - tileFlyway.setSqlMigrationPrefix("TILEV"); + if (cfg.tileCacheType() == TileServerConfig.CacheType.DATABASE) { + this.tileFlyway = new Flyway(); + tileFlyway.setDataSource(cfg.tileDatabaseUrl(), cfg.tileDatabaseUsername(), cfg.tileDatabasePassword()); + tileFlyway.setSqlMigrationPrefix("TILEV"); + } } private final Flyway flyway; - private final Flyway tileFlyway; + private Flyway tileFlyway; public void migrate() { - tileFlyway.migrate(); + if (tileFlyway != null) + tileFlyway.migrate(); + flyway.migrate(); } diff --git a/src/main/java/io/rudin/minetest/tileserver/StaticTileGen.java b/src/main/java/io/rudin/minetest/tileserver/StaticTileGen.java index d1d3bd4..f80669d 100644 --- a/src/main/java/io/rudin/minetest/tileserver/StaticTileGen.java +++ b/src/main/java/io/rudin/minetest/tileserver/StaticTileGen.java @@ -3,6 +3,7 @@ import static io.rudin.minetest.tileserver.blockdb.tables.Blocks.BLOCKS; import io.rudin.minetest.tileserver.config.TileServerConfig; +import org.aeonbits.owner.ConfigFactory; import org.jooq.Condition; import org.jooq.DSLContext; import org.jooq.Record2; @@ -22,15 +23,16 @@ public class StaticTileGen { public static void main(String[] args) throws Exception { // TODO create tiles in directory with static html index file + TileServerConfig cfg = ConfigFactory.create(TileServerConfig.class); + Injector injector = Guice.createInjector( - new ConfigModule(), - new DBModule(), - new ServiceModule() + new ConfigModule(cfg), + new DBModule(cfg), + new ServiceModule(cfg) ); DSLContext ctx = injector.getInstance(DSLContext.class); TileRenderer tileRenderer = injector.getInstance(TileRenderer.class); - TileServerConfig cfg = injector.getInstance(TileServerConfig.class); Condition yCondition = BLOCKS.POSY.between(cfg.tilesMinY(), cfg.tilesMaxY()); diff --git a/src/main/java/io/rudin/minetest/tileserver/TileServer.java b/src/main/java/io/rudin/minetest/tileserver/TileServer.java index 2e65a29..4d1e444 100644 --- a/src/main/java/io/rudin/minetest/tileserver/TileServer.java +++ b/src/main/java/io/rudin/minetest/tileserver/TileServer.java @@ -22,20 +22,23 @@ import io.rudin.minetest.tileserver.transformer.JsonTransformer; import io.rudin.minetest.tileserver.ws.WebSocketHandler; import io.rudin.minetest.tileserver.ws.WebSocketUpdater; +import org.aeonbits.owner.ConfigFactory; import static spark.Spark.*; public class TileServer { - private static Injector injector = Guice.createInjector( - new ConfigModule(), - new DBModule(), - new ServiceModule() - ); public static void main(String[] args) throws Exception { - TileServerConfig cfg = injector.getInstance(TileServerConfig.class); + TileServerConfig cfg = ConfigFactory.create(TileServerConfig.class); + + + Injector injector = Guice.createInjector( + new ConfigModule(cfg), + new DBModule(cfg), + new ServiceModule(cfg) + ); DBMigration dbMigration = injector.getInstance(DBMigration.class); dbMigration.migrate(); diff --git a/src/main/java/io/rudin/minetest/tileserver/config/TileServerConfig.java b/src/main/java/io/rudin/minetest/tileserver/config/TileServerConfig.java index cb98c45..af6d1fd 100644 --- a/src/main/java/io/rudin/minetest/tileserver/config/TileServerConfig.java +++ b/src/main/java/io/rudin/minetest/tileserver/config/TileServerConfig.java @@ -58,9 +58,21 @@ public interface TileServerConfig extends Config { @DefaultValue("true") boolean poiEnable(); + /* + tile cache stuff + */ + + @Key("tile.cache.impl") + @DefaultValue("FILE") + CacheType tileCacheType(); + + enum CacheType { + DATABASE, + FILE + } + @Key("tiles.directory") - @DefaultValue("target/tiles") - @Deprecated + @DefaultValue("tiles") String tileDirectory(); /* diff --git a/src/main/java/io/rudin/minetest/tileserver/job/UpdateChangedTilesJob.java b/src/main/java/io/rudin/minetest/tileserver/job/UpdateChangedTilesJob.java index e5e9a3b..75b2d23 100644 --- a/src/main/java/io/rudin/minetest/tileserver/job/UpdateChangedTilesJob.java +++ b/src/main/java/io/rudin/minetest/tileserver/job/UpdateChangedTilesJob.java @@ -30,9 +30,8 @@ public class UpdateChangedTilesJob implements Runnable { private static final Logger logger = LoggerFactory.getLogger(UpdateChangedTilesJob.class); @Inject - public UpdateChangedTilesJob(DSLContext ctx, @TileDB DSLContext tileCtx, TileCache tileCache, EventBus eventBus, TileServerConfig cfg) { + public UpdateChangedTilesJob(DSLContext ctx, TileCache tileCache, EventBus eventBus, TileServerConfig cfg) { this.ctx = ctx; - this.tileCtx = tileCtx; this.tileCache = tileCache; this.eventBus = eventBus; @@ -44,7 +43,7 @@ public UpdateChangedTilesJob(DSLContext ctx, @TileDB DSLContext tileCtx, TileCac private final EventBus eventBus; - private final DSLContext ctx, tileCtx; + private final DSLContext ctx; private final TileCache tileCache; @@ -67,13 +66,10 @@ public void run() { } if (latestTimestamp == null) { - logger.debug("Gathering latest tile time from db"); + logger.debug("Gathering latest tile time from tile cache"); long start = System.currentTimeMillis(); - latestTimestamp = tileCtx - .select(DSL.max(TILES.MTIME)) - .from(TILES) - .fetchOne(DSL.max(TILES.MTIME)); + latestTimestamp = tileCache.getLatestTimestamp(); long diff = System.currentTimeMillis() - start; diff --git a/src/main/java/io/rudin/minetest/tileserver/module/ConfigModule.java b/src/main/java/io/rudin/minetest/tileserver/module/ConfigModule.java index e518a23..c2a7faf 100644 --- a/src/main/java/io/rudin/minetest/tileserver/module/ConfigModule.java +++ b/src/main/java/io/rudin/minetest/tileserver/module/ConfigModule.java @@ -8,9 +8,15 @@ public class ConfigModule extends AbstractModule { + public ConfigModule(TileServerConfig cfg){ + this.cfg = cfg; + } + + private final TileServerConfig cfg; + @Override protected void configure() { - bind(TileServerConfig.class).toInstance(ConfigFactory.create(TileServerConfig.class)); + bind(TileServerConfig.class).toInstance(cfg); } } diff --git a/src/main/java/io/rudin/minetest/tileserver/module/DBModule.java b/src/main/java/io/rudin/minetest/tileserver/module/DBModule.java index b430e05..6e16fa0 100644 --- a/src/main/java/io/rudin/minetest/tileserver/module/DBModule.java +++ b/src/main/java/io/rudin/minetest/tileserver/module/DBModule.java @@ -1,6 +1,7 @@ package io.rudin.minetest.tileserver.module; import com.google.inject.Key; +import io.rudin.minetest.tileserver.config.TileServerConfig; import io.rudin.minetest.tileserver.qualifier.TileDB; import io.rudin.minetest.tileserver.provider.*; import org.jooq.DSLContext; @@ -11,15 +12,24 @@ public class DBModule extends AbstractModule { + public DBModule(TileServerConfig cfg) throws Exception { + this.cfg = cfg; + } + + private final TileServerConfig cfg; + + @Override protected void configure() { bind(HikariConfig.class).toProvider(HikariConfigProvider.class); bind(HikariDataSource.class).toProvider(HikariDatasourceProvider.class); bind(DSLContext.class).toProvider(DSLContextProvider.class); - bind(Key.get(HikariConfig.class, TileDB.class)).toProvider(TileDBHikariConfigProvider.class); - bind(Key.get(HikariDataSource.class, TileDB.class)).toProvider(TileDBHikariDatasourceProvider.class); - bind(Key.get(DSLContext.class, TileDB.class)).toProvider(TileDBDSLContextProvider.class); + if (cfg.tileCacheType() == TileServerConfig.CacheType.DATABASE) { + bind(Key.get(HikariConfig.class, TileDB.class)).toProvider(TileDBHikariConfigProvider.class); + bind(Key.get(HikariDataSource.class, TileDB.class)).toProvider(TileDBHikariDatasourceProvider.class); + bind(Key.get(DSLContext.class, TileDB.class)).toProvider(TileDBDSLContextProvider.class); + } } } diff --git a/src/main/java/io/rudin/minetest/tileserver/module/ServiceModule.java b/src/main/java/io/rudin/minetest/tileserver/module/ServiceModule.java index b98bb60..757215c 100644 --- a/src/main/java/io/rudin/minetest/tileserver/module/ServiceModule.java +++ b/src/main/java/io/rudin/minetest/tileserver/module/ServiceModule.java @@ -6,28 +6,33 @@ import com.google.inject.AbstractModule; import io.rudin.minetest.tileserver.ColorTable; +import io.rudin.minetest.tileserver.config.TileServerConfig; import io.rudin.minetest.tileserver.provider.ColorTableProvider; import io.rudin.minetest.tileserver.provider.ExecutorProvider; import io.rudin.minetest.tileserver.service.EventBus; import io.rudin.minetest.tileserver.service.TileCache; import io.rudin.minetest.tileserver.service.impl.DatabaseTileCache; import io.rudin.minetest.tileserver.service.impl.EventBusImpl; +import io.rudin.minetest.tileserver.service.impl.FileTileCache; +import org.jooq.util.jaxb.Database; public class ServiceModule extends AbstractModule { - public ServiceModule(){ - this(DatabaseTileCache.class); + public ServiceModule(TileServerConfig cfg) throws Exception { + this.cfg = cfg; } - public ServiceModule(Class cacheImpl){ - this.cacheImpl = cacheImpl; - } - - private final Class cacheImpl; + private final TileServerConfig cfg; @Override protected void configure() { - bind(TileCache.class).to(cacheImpl); + + + if (cfg.tileCacheType() == TileServerConfig.CacheType.DATABASE) + bind(TileCache.class).to(DatabaseTileCache.class); + else + bind(TileCache.class).to(FileTileCache.class); + //bind(TileCache.class).to(FileTileCache.class); bind(EventBus.class).to(EventBusImpl.class); bind(ColorTable.class).toProvider(ColorTableProvider.class); diff --git a/src/main/java/io/rudin/minetest/tileserver/service/TileCache.java b/src/main/java/io/rudin/minetest/tileserver/service/TileCache.java index 7354eac..96a0896 100644 --- a/src/main/java/io/rudin/minetest/tileserver/service/TileCache.java +++ b/src/main/java/io/rudin/minetest/tileserver/service/TileCache.java @@ -11,5 +11,7 @@ public interface TileCache { boolean has(int x, int y, int z); void remove(int x, int y, int z); - + + long getLatestTimestamp(); + } diff --git a/src/main/java/io/rudin/minetest/tileserver/service/impl/DatabaseTileCache.java b/src/main/java/io/rudin/minetest/tileserver/service/impl/DatabaseTileCache.java index 8dd6ef5..bfc618c 100644 --- a/src/main/java/io/rudin/minetest/tileserver/service/impl/DatabaseTileCache.java +++ b/src/main/java/io/rudin/minetest/tileserver/service/impl/DatabaseTileCache.java @@ -136,11 +136,26 @@ public void remove(int x, int y, int z) { String key = getKey(x, y, z); cache.invalidate(key); + long start = System.currentTimeMillis(); + ctx.delete(TILES) .where(TILES.X.eq(x)) .and(TILES.Y.eq(y)) .and(TILES.Z.eq(z)) .execute(); + + long diff = System.currentTimeMillis() - start; + if (diff > 500){ + logger.warn("Tile removal ({},{},{}) took {} ms", x,y,z, diff); + } + } + + @Override + public long getLatestTimestamp() { + return ctx + .select(DSL.max(TILES.MTIME)) + .from(TILES) + .fetchOne(DSL.max(TILES.MTIME)); } @Override diff --git a/src/main/java/io/rudin/minetest/tileserver/service/impl/FileTileCache.java b/src/main/java/io/rudin/minetest/tileserver/service/impl/FileTileCache.java index b0af1bb..5afdc18 100644 --- a/src/main/java/io/rudin/minetest/tileserver/service/impl/FileTileCache.java +++ b/src/main/java/io/rudin/minetest/tileserver/service/impl/FileTileCache.java @@ -1,11 +1,6 @@ package io.rudin.minetest.tileserver.service.impl; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; +import java.io.*; import javax.inject.Inject; import javax.inject.Singleton; @@ -20,9 +15,26 @@ public class FileTileCache implements TileCache { @Inject public FileTileCache(TileServerConfig cfg) { this.baseDirectory = new File(cfg.tileDirectory()); + + if (!this.baseDirectory.isDirectory()) + this.baseDirectory.mkdirs(); + + this.timestampMarker = new File(baseDirectory, "timestampmarker"); + + if (!timestampMarker.isFile()){ + try (OutputStream output = new FileOutputStream(timestampMarker)){ + output.write(0x00); + } catch (Exception e){ + throw new IllegalArgumentException("could not create timestamp marker!", e); + } + + timestampMarker.setLastModified(0); + } } private final File baseDirectory; + + private final File timestampMarker; private File getFile(int x, int y, int z) { @@ -37,6 +49,7 @@ private File getFile(int x, int y, int z) { @Override public void put(int x, int y, int z, byte[] data) throws IOException { StreamUtil.copyStream(new ByteArrayInputStream(data), new FileOutputStream(getFile(x, y, z))); + timestampMarker.setLastModified(System.currentTimeMillis()); } @Override @@ -57,4 +70,9 @@ public void remove(int x, int y, int z) { getFile(x, y, z).delete(); } + @Override + public long getLatestTimestamp() { + return timestampMarker.lastModified(); + } + } diff --git a/src/test/java/io/rudin/minetest/tileserver/PerformanceTest.java b/src/test/java/io/rudin/minetest/tileserver/PerformanceTest.java index eec0527..0ed4641 100644 --- a/src/test/java/io/rudin/minetest/tileserver/PerformanceTest.java +++ b/src/test/java/io/rudin/minetest/tileserver/PerformanceTest.java @@ -6,35 +6,28 @@ import io.rudin.minetest.tileserver.module.ConfigModule; import io.rudin.minetest.tileserver.module.DBModule; import io.rudin.minetest.tileserver.module.ServiceModule; -import io.rudin.minetest.tileserver.service.MemoryCache; -import io.rudin.minetest.tileserver.service.NoOpCache; -import io.rudin.minetest.tileserver.service.TileCache; +import org.aeonbits.owner.ConfigFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.concurrent.ExecutionException; -import java.util.zip.DataFormatException; - public class PerformanceTest { private static final Logger logger = LoggerFactory.getLogger(PerformanceTest.class); - private static Injector injector = Guice.createInjector( - new ConfigModule(), - new DBModule(), - new ServiceModule(MemoryCache.class) - ); + public static void main(String[] args) throws Exception { - public static void main(String[] args) throws ExecutionException, IOException, DataFormatException { + TileServerConfig cfg = ConfigFactory.create(TileServerConfig.class); - TileServerConfig cfg = injector.getInstance(TileServerConfig.class); + Injector injector = Guice.createInjector( + new ConfigModule(cfg), + new DBModule(cfg), + new ServiceModule(cfg) + ); DBMigration dbMigration = injector.getInstance(DBMigration.class); dbMigration.migrate(); TileRenderer renderer = injector.getInstance(TileRenderer.class); - MemoryCache cache = injector.getInstance(MemoryCache.class); final int x = 0, y = 0, zoom = 10; @@ -45,10 +38,6 @@ public static void main(String[] args) throws ExecutionException, IOException, D long diff = System.currentTimeMillis() - start; logger.info("Rendering took {} ms and produced {} bytes", diff, tile.length); - logger.info("Cache stats: Hit: {}, Miss: {}, Put: {}, Check: {}, Remove: {}", - cache.hitCount, cache.missCount, cache.putCount, cache.checkCount, cache.removeCount - ); - } diff --git a/src/test/java/io/rudin/minetest/tileserver/TileRendererMainTiming.java b/src/test/java/io/rudin/minetest/tileserver/TileRendererMainTiming.java index f70ea28..787bbd2 100644 --- a/src/test/java/io/rudin/minetest/tileserver/TileRendererMainTiming.java +++ b/src/test/java/io/rudin/minetest/tileserver/TileRendererMainTiming.java @@ -7,18 +7,20 @@ import io.rudin.minetest.tileserver.module.DBModule; import io.rudin.minetest.tileserver.module.ServiceModule; import io.rudin.minetest.tileserver.service.TileCache; +import org.aeonbits.owner.ConfigFactory; public class TileRendererMainTiming { - private static Injector injector = Guice.createInjector( - new ConfigModule(), - new DBModule(), - new ServiceModule() - ); public static void main(String[] args) throws Exception { - TileServerConfig cfg = injector.getInstance(TileServerConfig.class); + TileServerConfig cfg = ConfigFactory.create(TileServerConfig.class); + + Injector injector = Guice.createInjector( + new ConfigModule(cfg), + new DBModule(cfg), + new ServiceModule(cfg) + ); DBMigration dbMigration = injector.getInstance(DBMigration.class); dbMigration.migrate(); diff --git a/src/test/java/io/rudin/minetest/tileserver/service/MemoryCache.java b/src/test/java/io/rudin/minetest/tileserver/service/MemoryCache.java deleted file mode 100644 index 4983a19..0000000 --- a/src/test/java/io/rudin/minetest/tileserver/service/MemoryCache.java +++ /dev/null @@ -1,52 +0,0 @@ -package io.rudin.minetest.tileserver.service; - -import javax.inject.Singleton; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -@Singleton -public class MemoryCache implements TileCache { - - public int putCount = 0, hitCount = 0, missCount = 0, checkCount = 0, removeCount = 0; - - private final Map cache = new HashMap<>(); - - private String getKey(int x, int y, int z){ - return x + "/" + y + "/" + z; - } - - @Override - public void put(int x, int y, int z, byte[] data) throws IOException { - final String key = getKey(x,y,z); - cache.put(key, data); - putCount++; - } - - @Override - public byte[] get(int x, int y, int z) throws IOException { - final String key = getKey(x,y,z); - byte[] data = cache.get(key); - - if (data == null) - missCount++; - else - hitCount++; - - return data; - } - - @Override - public boolean has(int x, int y, int z){ - checkCount++; - final String key = getKey(x,y,z); - return cache.containsKey(key); - } - - @Override - public void remove(int x, int y, int z) { - final String key = getKey(x,y,z); - cache.remove(key); - removeCount++; - } -} diff --git a/src/test/java/io/rudin/minetest/tileserver/service/NoOpCache.java b/src/test/java/io/rudin/minetest/tileserver/service/NoOpCache.java deleted file mode 100644 index 513ef1f..0000000 --- a/src/test/java/io/rudin/minetest/tileserver/service/NoOpCache.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.rudin.minetest.tileserver.service; - -import javax.inject.Singleton; -import java.io.IOException; -import java.util.Map; - -@Singleton -public class NoOpCache implements TileCache { - - private int putCount = 0; - - public int getPutCount(){ - return putCount; - } - - @Override - public void put(int x, int y, int z, byte[] data) throws IOException { - putCount++; - } - - @Override - public byte[] get(int x, int y, int z) throws IOException { - return new byte[0]; - } - - @Override - public boolean has(int x, int y, int z) { - return false; - } - - @Override - public void remove(int x, int y, int z) { - - } -}