mirror of
https://github.com/elastic/logstash.git
synced 2025-04-24 14:47:19 -04:00
namespace memory checkpoints for multiple queues support
memory checkpoint IO need the purge() method
This commit is contained in:
parent
8a8f04ab1d
commit
8c000445c2
3 changed files with 66 additions and 6 deletions
|
@ -1,6 +1,7 @@
|
|||
package org.logstash.common.io;
|
||||
|
||||
import org.logstash.ackedqueue.Checkpoint;
|
||||
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
@ -71,6 +72,7 @@ public class FileCheckpointIO implements CheckpointIO {
|
|||
@Override
|
||||
public void purge() throws IOException {
|
||||
// TODO: dir traversal and delete all checkpoints?
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
// @return the head page checkpoint file name
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
package org.logstash.common.io;
|
||||
|
||||
import org.logstash.ackedqueue.Checkpoint;
|
||||
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.NoSuchFileException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -12,7 +15,7 @@ public class MemoryCheckpointIO implements CheckpointIO {
|
|||
private final String HEAD_CHECKPOINT = "checkpoint.head";
|
||||
private final String TAIL_CHECKPOINT = "checkpoint.";
|
||||
|
||||
private static final Map<String, Checkpoint> sources = new HashMap<>();
|
||||
private static final Map<String, Map<String, Checkpoint>> sources = new HashMap<>();
|
||||
|
||||
private final String dirPath;
|
||||
|
||||
|
@ -26,8 +29,13 @@ public class MemoryCheckpointIO implements CheckpointIO {
|
|||
|
||||
@Override
|
||||
public Checkpoint read(String fileName) throws IOException {
|
||||
Checkpoint cp = this.sources.get(fileName);
|
||||
if (cp == null) { throw new NoSuchFileException("no memory checkpoint for " + fileName); }
|
||||
|
||||
Checkpoint cp = null;
|
||||
Map<String, Checkpoint> ns = this.sources.get(dirPath);
|
||||
if (ns != null) {
|
||||
cp = ns.get(fileName);
|
||||
}
|
||||
if (cp == null) { throw new NoSuchFileException("no memory checkpoint for dirPath: " + this.dirPath + ", fileName: " + fileName); }
|
||||
return cp;
|
||||
}
|
||||
|
||||
|
@ -40,17 +48,25 @@ public class MemoryCheckpointIO implements CheckpointIO {
|
|||
|
||||
@Override
|
||||
public void write(String fileName, Checkpoint checkpoint) throws IOException {
|
||||
this.sources.put(fileName, checkpoint);
|
||||
Map<String, Checkpoint> ns = this.sources.get(dirPath);
|
||||
if (ns == null) {
|
||||
ns = new HashMap<>();
|
||||
this.sources.put(this.dirPath, ns);
|
||||
}
|
||||
ns.put(fileName, checkpoint);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void purge(String fileName) {
|
||||
this.sources.remove(fileName);
|
||||
Map<String, Checkpoint> ns = this.sources.get(dirPath);
|
||||
if (ns != null) {
|
||||
ns.remove(fileName);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void purge() {
|
||||
this.sources.clear();
|
||||
this.sources.remove(this.dirPath);
|
||||
}
|
||||
|
||||
// @return the head page checkpoint file name
|
||||
|
|
|
@ -43,4 +43,46 @@ public class MemoryCheckpointTest {
|
|||
public void readInnexisting() throws IOException {
|
||||
io.read("checkpoint.invalid");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void readWriteDirPathNamespaced() throws IOException {
|
||||
CheckpointIO io1 = new MemoryCheckpointIO("path1");
|
||||
CheckpointIO io2 = new MemoryCheckpointIO("path2");
|
||||
io1.write("checkpoint.head", 1, 0, 0, 0, 0);
|
||||
io2.write("checkpoint.head", 2, 0, 0, 0, 0);
|
||||
|
||||
Checkpoint checkpoint;
|
||||
|
||||
checkpoint = io1.read("checkpoint.head");
|
||||
assertThat(checkpoint.getPageNum(), is(equalTo(1)));
|
||||
|
||||
checkpoint = io2.read("checkpoint.head");
|
||||
assertThat(checkpoint.getPageNum(), is(equalTo(2)));
|
||||
}
|
||||
|
||||
@Test(expected = NoSuchFileException.class)
|
||||
public void purgeDirPathNamespaced1() throws IOException {
|
||||
CheckpointIO io1 = new MemoryCheckpointIO("path1");
|
||||
CheckpointIO io2 = new MemoryCheckpointIO("path2");
|
||||
io1.write("checkpoint.head", 1, 0, 0, 0, 0);
|
||||
io2.write("checkpoint.head", 2, 0, 0, 0, 0);
|
||||
|
||||
io1.purge("checkpoint.head");
|
||||
|
||||
Checkpoint checkpoint = io1.read("checkpoint.head");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void purgeDirPathNamespaced2() throws IOException {
|
||||
CheckpointIO io1 = new MemoryCheckpointIO("path1");
|
||||
CheckpointIO io2 = new MemoryCheckpointIO("path2");
|
||||
io1.write("checkpoint.head", 1, 0, 0, 0, 0);
|
||||
io2.write("checkpoint.head", 2, 0, 0, 0, 0);
|
||||
|
||||
io1.purge("checkpoint.head");
|
||||
|
||||
Checkpoint checkpoint;
|
||||
checkpoint = io2.read("checkpoint.head");
|
||||
assertThat(checkpoint.getPageNum(), is(equalTo(2)));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue