This commit is contained in:
Jesse Boyd 2017-04-24 00:06:54 +10:00
parent 403425d307
commit 81b60f75cf
No known key found for this signature in database
GPG Key ID: 59F1DE6293AF6E1F
10 changed files with 66 additions and 55 deletions

View File

@ -167,7 +167,8 @@ public class Settings extends Config {
public int COMPRESSION_LEVEL = 3; public int COMPRESSION_LEVEL = 3;
@Comment({ @Comment({
"The buffer size for compression:", "The buffer size for compression:",
" - Larger = better ratio but uses more upfront memory" " - Larger = better ratio but uses more upfront memory",
" - Must be in the range [64, 33554432]",
}) })
public int BUFFER_SIZE = 531441; public int BUFFER_SIZE = 531441;

View File

@ -28,6 +28,13 @@ public class FaweInputStream extends DataInputStream {
private NBTInputStream nbtIn; private NBTInputStream nbtIn;
public void skipFully(int num) throws IOException {
long skipped = skip(num);
while (skipped != num) {
skipped += skip(num - skipped);
}
}
public NamedTag readNBT() throws IOException { public NamedTag readNBT() throws IOException {
if (nbtIn == null) { if (nbtIn == null) {
nbtIn = new NBTInputStream(parent); nbtIn = new NBTInputStream(parent);

View File

@ -21,6 +21,8 @@ public class AbstractDelegateChangeSet extends FaweChangeSet {
public AbstractDelegateChangeSet(FaweChangeSet parent) { public AbstractDelegateChangeSet(FaweChangeSet parent) {
super(parent.getWorld()); super(parent.getWorld());
this.parent = parent; this.parent = parent;
this.waitingCombined = parent.waitingCombined;
this.waitingAsync = parent.waitingAsync;
} }
@Override @Override
@ -33,6 +35,11 @@ public class AbstractDelegateChangeSet extends FaweChangeSet {
return super.closeAsync(); return super.closeAsync();
} }
@Override
public boolean flush() {
return parent.flush();
}
@Override @Override
public boolean close() { public boolean close() {
return super.close() && parent.close(); return super.close() && parent.close();
@ -52,6 +59,12 @@ public class AbstractDelegateChangeSet extends FaweChangeSet {
return parent.getWorld(); return parent.getWorld();
} }
@Override
@Deprecated
public boolean flushAsync() {
return parent.flushAsync();
}
@Override @Override
public void add(int x, int y, int z, int combinedFrom, int combinedTo) { public void add(int x, int y, int z, int combinedFrom, int combinedTo) {
parent.add(x, y, z, combinedFrom, combinedTo); parent.add(x, y, z, combinedFrom, combinedTo);

View File

@ -18,7 +18,6 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@ -316,21 +315,21 @@ public class DiskStorageHistory extends FaweStreamChangeSet {
} }
@Override @Override
public InputStream getBlockIS() throws IOException { public FaweInputStream getBlockIS() throws IOException {
if (!bdFile.exists()) { if (!bdFile.exists()) {
return null; return null;
} }
InputStream is = MainUtil.getCompressedIS(new FileInputStream(bdFile)); FaweInputStream is = MainUtil.getCompressedIS(new FileInputStream(bdFile));
readHeader(is); readHeader(is);
return is; return is;
} }
@Override @Override
public InputStream getBiomeIS() throws IOException { public FaweInputStream getBiomeIS() throws IOException {
if (!bioFile.exists()) { if (!bioFile.exists()) {
return null; return null;
} }
InputStream is = MainUtil.getCompressedIS(new FileInputStream(bioFile)); FaweInputStream is = MainUtil.getCompressedIS(new FileInputStream(bioFile));
return is; return is;
} }
@ -376,7 +375,7 @@ public class DiskStorageHistory extends FaweStreamChangeSet {
try (FileInputStream fis = new FileInputStream(bdFile)) { try (FileInputStream fis = new FileInputStream(bdFile)) {
FaweInputStream gis = MainUtil.getCompressedIS(fis); FaweInputStream gis = MainUtil.getCompressedIS(fis);
// skip mode // skip mode
gis.skip(1); gis.skipFully(1);
// origin // origin
ox = ((gis.read() << 24) + (gis.read() << 16) + (gis.read() << 8) + (gis.read() << 0)); ox = ((gis.read() << 24) + (gis.read() << 16) + (gis.read() << 8) + (gis.read() << 0));
oz = ((gis.read() << 24) + (gis.read() << 16) + (gis.read() << 8) + (gis.read() << 0)); oz = ((gis.read() << 24) + (gis.read() << 16) + (gis.read() << 8) + (gis.read() << 0));
@ -415,9 +414,9 @@ public class DiskStorageHistory extends FaweStreamChangeSet {
int oz = getOriginZ(); int oz = getOriginZ();
if (ox == 0 && oz == 0 && bdFile.exists()) { if (ox == 0 && oz == 0 && bdFile.exists()) {
try (FileInputStream fis = new FileInputStream(bdFile)) { try (FileInputStream fis = new FileInputStream(bdFile)) {
final InputStream gis = MainUtil.getCompressedIS(fis); final FaweInputStream gis = MainUtil.getCompressedIS(fis);
// skip mode // skip mode
gis.skip(1); gis.skipFully(1);
// origin // origin
ox = ((gis.read() << 24) + (gis.read() << 16) + (gis.read() << 8) + (gis.read() << 0)); ox = ((gis.read() << 24) + (gis.read() << 16) + (gis.read() << 8) + (gis.read() << 0));
oz = ((gis.read() << 24) + (gis.read() << 16) + (gis.read() << 8) + (gis.read() << 0)); oz = ((gis.read() << 24) + (gis.read() << 16) + (gis.read() << 8) + (gis.read() << 0));

View File

@ -207,7 +207,7 @@ public abstract class FaweChangeSet implements ChangeSet {
} }
public boolean isEmpty() { public boolean isEmpty() {
return size() == 0; return waitingCombined.get() == 0 && waitingAsync.get() == 0 && size() == 0;
} }
public void add(int x, int y, int z, int combinedFrom, BaseBlock to) { public void add(int x, int y, int z, int combinedFrom, BaseBlock to) {

View File

@ -70,15 +70,15 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
public interface FaweStreamPositionDelegate { public interface FaweStreamPositionDelegate {
void write(OutputStream out, int x, int y, int z) throws IOException; void write(OutputStream out, int x, int y, int z) throws IOException;
int readX(InputStream in) throws IOException; int readX(FaweInputStream in) throws IOException;
int readY(InputStream in) throws IOException; int readY(FaweInputStream in) throws IOException;
int readZ(InputStream in) throws IOException; int readZ(FaweInputStream in) throws IOException;
} }
public interface FaweStreamIdDelegate { public interface FaweStreamIdDelegate {
void writeChange(OutputStream out, int from, int to) throws IOException; void writeChange(OutputStream out, int from, int to) throws IOException;
void readCombined(InputStream in, MutableBlockChange change, boolean dir) throws IOException; void readCombined(FaweInputStream in, MutableBlockChange change, boolean dir) throws IOException;
void readCombined(InputStream in, MutableFullBlockChange change, boolean dir) throws IOException; void readCombined(FaweInputStream in, MutableFullBlockChange change, boolean dir) throws IOException;
} }
private void setupStreamDelegates(int mode) { private void setupStreamDelegates(int mode) {
@ -94,9 +94,9 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
} }
@Override @Override
public void readCombined(InputStream is, MutableBlockChange change, boolean dir) throws IOException { public void readCombined(FaweInputStream is, MutableBlockChange change, boolean dir) throws IOException {
if (dir) { if (dir) {
is.skip(2); is.skipFully(2);
int to1 = is.read(); int to1 = is.read();
int to2 = is.read(); int to2 = is.read();
change.id = (short) ((to2 << 4) + (to1 >> 4)); change.id = (short) ((to2 << 4) + (to1 >> 4));
@ -104,14 +104,14 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
} else { } else {
int from1 = is.read(); int from1 = is.read();
int from2 = is.read(); int from2 = is.read();
is.skip(2); is.skipFully(2);
change.id = (short) ((from2 << 4) + (from1 >> 4)); change.id = (short) ((from2 << 4) + (from1 >> 4));
change.data = (byte) (from1 & 0xf); change.data = (byte) (from1 & 0xf);
} }
} }
@Override @Override
public void readCombined(InputStream is, MutableFullBlockChange change, boolean dir) throws IOException { public void readCombined(FaweInputStream is, MutableFullBlockChange change, boolean dir) throws IOException {
change.from = ((byte) is.read() & 0xFF) + ((byte) is.read() << 8); change.from = ((byte) is.read() & 0xFF) + ((byte) is.read() << 8);
change.to = ((byte) is.read() & 0xFF) + ((byte) is.read() << 8); change.to = ((byte) is.read() & 0xFF) + ((byte) is.read() << 8);
} }
@ -125,7 +125,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
} }
@Override @Override
public void readCombined(InputStream in, MutableBlockChange change, boolean dir) throws IOException { public void readCombined(FaweInputStream in, MutableBlockChange change, boolean dir) throws IOException {
int from1 = in.read(); int from1 = in.read();
int from2 = in.read(); int from2 = in.read();
change.id = (short) ((from2 << 4) + (from1 >> 4)); change.id = (short) ((from2 << 4) + (from1 >> 4));
@ -133,7 +133,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
} }
@Override @Override
public void readCombined(InputStream is, MutableFullBlockChange change, boolean dir) throws IOException { public void readCombined(FaweInputStream is, MutableFullBlockChange change, boolean dir) throws IOException {
change.from = ((byte) is.read() & 0xFF) + ((byte) is.read() << 8); change.from = ((byte) is.read() & 0xFF) + ((byte) is.read() << 8);
change.to = 0; change.to = 0;
} }
@ -162,20 +162,18 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
byte[] buffer = new byte[4]; byte[] buffer = new byte[4];
@Override @Override
public int readX(InputStream in) throws IOException { public int readX(FaweInputStream in) throws IOException {
if (in.read(buffer) == -1) { in.readFully(buffer);
throw new EOFException();
}
return lx = lx + ((((buffer[1] & 0xFF) + ((MathMan.unpair16x(buffer[3])) << 8)) << 20) >> 20); return lx = lx + ((((buffer[1] & 0xFF) + ((MathMan.unpair16x(buffer[3])) << 8)) << 20) >> 20);
} }
@Override @Override
public int readY(InputStream in) { public int readY(FaweInputStream in) {
return (ly = ly + buffer[0]) & 0xFF; return (ly = ly + buffer[0]) & 0xFF;
} }
@Override @Override
public int readZ(InputStream in) throws IOException { public int readZ(FaweInputStream in) throws IOException {
return lz = lz + ((((buffer[2] & 0xFF) + ((MathMan.unpair16y(buffer[3])) << 8)) << 20) >> 20); return lz = lz + ((((buffer[2] & 0xFF) + ((MathMan.unpair16y(buffer[3])) << 8)) << 20) >> 20);
} }
}; };
@ -196,20 +194,18 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
} }
@Override @Override
public int readX(InputStream is) throws IOException { public int readX(FaweInputStream is) throws IOException {
if (is.read(buffer) == -1) { is.readFully(buffer);
throw new EOFException();
}
return lx = (lx + (buffer[0] & 0xFF) + (buffer[1] << 8)); return lx = (lx + (buffer[0] & 0xFF) + (buffer[1] << 8));
} }
@Override @Override
public int readY(InputStream is) throws IOException { public int readY(FaweInputStream is) throws IOException {
return (ly = (ly + (buffer[4]))) & 0xFF; return (ly = (ly + (buffer[4]))) & 0xFF;
} }
@Override @Override
public int readZ(InputStream is) throws IOException { public int readZ(FaweInputStream is) throws IOException {
return lz = (lz + (buffer[2] & 0xFF) + (buffer[3] << 8)); return lz = (lz + (buffer[2] & 0xFF) + (buffer[3] << 8));
} }
}; };
@ -249,6 +245,9 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
if (blockSize > 0) { if (blockSize > 0) {
return false; return false;
} }
if (waitingCombined.get() != 0 || waitingAsync.get() != 0) {
return false;
}
flush(); flush();
return blockSize == 0; return blockSize == 0;
} }
@ -275,8 +274,8 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
public abstract NBTOutputStream getTileCreateOS() throws IOException; public abstract NBTOutputStream getTileCreateOS() throws IOException;
public abstract NBTOutputStream getTileRemoveOS() throws IOException; public abstract NBTOutputStream getTileRemoveOS() throws IOException;
public abstract InputStream getBlockIS() throws IOException; public abstract FaweInputStream getBlockIS() throws IOException;
public abstract InputStream getBiomeIS() throws IOException; public abstract FaweInputStream getBiomeIS() throws IOException;
public abstract NBTInputStream getEntityCreateIS() throws IOException; public abstract NBTInputStream getEntityCreateIS() throws IOException;
public abstract NBTInputStream getEntityRemoveIS() throws IOException; public abstract NBTInputStream getEntityRemoveIS() throws IOException;
public abstract NBTInputStream getTileCreateIS() throws IOException; public abstract NBTInputStream getTileCreateIS() throws IOException;
@ -391,7 +390,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
} }
public Iterator<MutableBlockChange> getBlockIterator(final boolean dir) throws IOException { public Iterator<MutableBlockChange> getBlockIterator(final boolean dir) throws IOException {
final InputStream is = getBlockIS(); final FaweInputStream is = getBlockIS();
if (is == null) { if (is == null) {
return new ArrayList<MutableBlockChange>().iterator(); return new ArrayList<MutableBlockChange>().iterator();
} }

View File

@ -10,7 +10,6 @@ import com.sk89q.jnbt.NBTInputStream;
import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.jnbt.NBTOutputStream;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
/** /**
@ -153,7 +152,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet {
} }
@Override @Override
public InputStream getBiomeIS() throws IOException { public FaweInputStream getBiomeIS() throws IOException {
if (biomes == null) { if (biomes == null) {
return null; return null;
} }
@ -174,7 +173,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet {
} }
@Override @Override
public InputStream getBlockIS() throws IOException { public FaweInputStream getBlockIS() throws IOException {
if (ids == null) { if (ids == null) {
return null; return null;
} }

View File

@ -66,11 +66,11 @@ import java.util.zip.Inflater;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
import net.jpountz.lz4.LZ4BlockInputStream; import net.jpountz.lz4.LZ4BlockInputStream;
import net.jpountz.lz4.LZ4BlockOutputStream;
import net.jpountz.lz4.LZ4Compressor; import net.jpountz.lz4.LZ4Compressor;
import net.jpountz.lz4.LZ4Factory; import net.jpountz.lz4.LZ4Factory;
import net.jpountz.lz4.LZ4FastDecompressor; import net.jpountz.lz4.LZ4FastDecompressor;
import net.jpountz.lz4.LZ4InputStream; import net.jpountz.lz4.LZ4InputStream;
import net.jpountz.lz4.LZ4OutputStream;
import net.jpountz.lz4.LZ4Utils; import net.jpountz.lz4.LZ4Utils;
public class MainUtil { public class MainUtil {
@ -312,8 +312,7 @@ public class MainUtil {
} }
public static FaweOutputStream getCompressedOS(OutputStream os, int amount, int buffer) throws IOException { public static FaweOutputStream getCompressedOS(OutputStream os, int amount, int buffer) throws IOException {
// os.write((byte) 10 + amount); os.write((byte) 10 + amount);
os.write((byte) -amount);
os = new BufferedOutputStream(os, buffer); os = new BufferedOutputStream(os, buffer);
if (amount == 0) { if (amount == 0) {
return new FaweOutputStream(os); return new FaweOutputStream(os);
@ -326,14 +325,14 @@ public class MainUtil {
LZ4Factory factory = LZ4Factory.fastestInstance(); LZ4Factory factory = LZ4Factory.fastestInstance();
int fastAmount = 1 + ((amount - 1) % 3); int fastAmount = 1 + ((amount - 1) % 3);
for (int i = 0; i < fastAmount; i++) { for (int i = 0; i < fastAmount; i++) {
os = new LZ4OutputStream(os, buffer, factory.fastCompressor()); os = new LZ4BlockOutputStream(os, buffer, factory.fastCompressor());
} }
int highAmount = amount > 3 ? 1 : 0; int highAmount = amount > 3 ? 1 : 0;
for (int i = 0; i < highAmount; i++) { for (int i = 0; i < highAmount; i++) {
if (amount == 9) { if (amount == 9) {
os = new LZ4OutputStream(os, buffer, factory.highCompressor(17)); os = new LZ4BlockOutputStream(os, buffer, factory.highCompressor(17));
} else { } else {
os = new LZ4OutputStream(os, buffer, factory.highCompressor()); os = new LZ4BlockOutputStream(os, buffer, factory.highCompressor());
} }
} }
return new FaweOutputStream(os); return new FaweOutputStream(os);
@ -352,7 +351,7 @@ public class MainUtil {
boolean legacy; boolean legacy;
if (mode > 10) { if (mode > 10) {
legacy = false; legacy = false;
mode = -mode + 9; mode = -mode + 10;
} else { } else {
legacy = true; legacy = true;
} }

View File

@ -31,6 +31,7 @@ import com.boydti.fawe.object.changeset.FaweChangeSet;
import com.boydti.fawe.object.extent.ResettableExtent; import com.boydti.fawe.object.extent.ResettableExtent;
import com.boydti.fawe.util.EditSessionBuilder; import com.boydti.fawe.util.EditSessionBuilder;
import com.boydti.fawe.util.MainUtil; import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.TaskManager;
import com.boydti.fawe.wrappers.WorldWrapper; import com.boydti.fawe.wrappers.WorldWrapper;
import com.sk89q.jchronic.Chronic; import com.sk89q.jchronic.Chronic;
import com.sk89q.jchronic.Options; import com.sk89q.jchronic.Options;
@ -101,14 +102,6 @@ public class LocalSession {
private transient RegionSelector selector = new CuboidRegionSelector(); private transient RegionSelector selector = new CuboidRegionSelector();
private transient boolean placeAtPos1 = false; private transient boolean placeAtPos1 = false;
private transient List<Object> history = Collections.synchronizedList(new LinkedList<Object>() { private transient List<Object> history = Collections.synchronizedList(new LinkedList<Object>() {
@Override
public void add(int index, Object element) { // Integer = Lazy evaluated FaweChangeSet
if (element instanceof Integer || element instanceof FaweChangeSet) {
super.add(index, element);
} else {
throw new ClassCastException("Must add either Integer (index) or FaweChangeSet");
}
}
@Override @Override
public Object get(int index) { public Object get(int index) {
Object value = super.get(index); Object value = super.get(index);
@ -478,6 +471,7 @@ public class LocalSession {
} }
} }
} }
historySize += MainUtil.getSize(changeSet); historySize += MainUtil.getSize(changeSet);
if (append) { if (append) {
history.add(changeSet); history.add(changeSet);

View File

@ -182,7 +182,7 @@ public final class LZ4BlockOutputStream extends FilterOutputStream {
checksum.update(buffer, 0, o); checksum.update(buffer, 0, o);
check = (int) checksum.getValue(); check = (int) checksum.getValue();
} else { } else {
check = 0; check = 1;
} }
int compressedLength = compressor.compress(buffer, 0, o, compressedBuffer, HEADER_LENGTH); int compressedLength = compressor.compress(buffer, 0, o, compressedBuffer, HEADER_LENGTH);
final int compressMethod; final int compressMethod;