Skip to content

Commit 26c32f8

Browse files
committed
Added appendixRepairer for repairing corrupted appendix files
1 parent 174fcdb commit 26c32f8

35 files changed

Lines changed: 619 additions & 94 deletions

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,7 @@ project/plugins/project/
2020
#Intellij
2121
.idea
2222
*.iml
23-
docs/SwayDB_doco/
23+
docs/SwayDB_doco/
24+
# these files are copy of the SwayDB.stress & SwayDB.performance modules used for quick tests only.
25+
/embedded/src/test/scala/swaydb/StressSpec.scala
26+
/embedded/src/test/scala/swaydb/SpeedSpec.scala

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ parallelExecution in ThisBuild := false
99

1010
lazy val commonSettings = Seq(
1111
organization := "io.swaydb",
12-
version := "0.1",
12+
version := "0.1.1",
1313
scalaVersion := scala212
1414
)
1515

core/src/main/scala/swaydb/core/CoreAPI.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ package swaydb.core
2222
import swaydb.core.data.KeyValue.KeyValueTuple
2323
import swaydb.core.data.ValueType
2424
import swaydb.core.map.MapEntry
25-
import swaydb.core.map.serializer.KeyValuesMapSerializer
25+
import swaydb.core.map.serializer.Level0KeyValuesSerializer
2626
import swaydb.data.accelerate.Level0Meter
2727
import swaydb.data.compaction.LevelMeter
2828
import swaydb.data.config.SwayDBConfig
@@ -45,7 +45,7 @@ private[swaydb] object CoreAPI {
4545

4646
private[swaydb] trait CoreAPI {
4747

48-
val serializer: KeyValuesMapSerializer
48+
val serializer: Level0KeyValuesSerializer
4949

5050
def put(key: Slice[Byte]): Try[Level0Meter]
5151

core/src/main/scala/swaydb/core/io/file/IO.scala

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -112,19 +112,20 @@ object IO extends LazyLogging {
112112

113113
def walkDelete(folder: Path): Try[Unit] =
114114
try {
115-
Files.walkFileTree(folder, new SimpleFileVisitor[Path]() {
116-
@throws[IOException]
117-
override def visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult = {
118-
Files.delete(file)
119-
FileVisitResult.CONTINUE
120-
}
115+
if (exists(folder))
116+
Files.walkFileTree(folder, new SimpleFileVisitor[Path]() {
117+
@throws[IOException]
118+
override def visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult = {
119+
Files.delete(file)
120+
FileVisitResult.CONTINUE
121+
}
121122

122-
override def postVisitDirectory(dir: Path, exc: IOException): FileVisitResult = {
123-
if (exc != null) throw exc
124-
Files.delete(dir)
125-
FileVisitResult.CONTINUE
126-
}
127-
})
123+
override def postVisitDirectory(dir: Path, exc: IOException): FileVisitResult = {
124+
if (exc != null) throw exc
125+
Files.delete(dir)
126+
FileVisitResult.CONTINUE
127+
}
128+
})
128129
Success()
129130
} catch {
130131
case exception: Throwable =>

core/src/main/scala/swaydb/core/level/Level.scala

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import swaydb.core.data.{PersistentReadOnly, _}
2828
import swaydb.core.io.file.{DBFile, IO}
2929
import swaydb.core.level.LevelException.NoNextLevel
3030
import swaydb.core.level.actor.{LevelAPI, LevelActor, LevelCommand}
31-
import swaydb.core.map.serializer.SegmentsMapSerializer
31+
import swaydb.core.map.serializer.AppendixSerializer
3232
import swaydb.core.map.{Map, MapEntry}
3333
import swaydb.core.retry.Retry
3434
import swaydb.core.segment.SegmentException.SegmentFileMissing
@@ -87,8 +87,8 @@ private[core] object Level extends LazyLogging {
8787
acquireLock(levelStorage) flatMap {
8888
lock =>
8989
//lock acquired. Initialising Level.
90-
implicit val serializer: SegmentsMapSerializer =
91-
SegmentsMapSerializer(
90+
implicit val serializer: AppendixSerializer =
91+
AppendixSerializer(
9292
removeDeletedRecords = removeDeletes(nextLevel),
9393
mmapSegmentsOnRead = levelStorage.mmapSegmentsOnWrite,
9494
mmapSegmentsOnWrite = levelStorage.mmapSegmentsOnRead,
@@ -173,7 +173,7 @@ private[core] class Level(val dirs: Seq[Dir],
173173
appendix: Map[Slice[Byte], Segment],
174174
lock: Option[FileLock])(implicit ordering: Ordering[Slice[Byte]],
175175
ec: ExecutionContext,
176-
serializer: SegmentsMapSerializer,
176+
serializer: AppendixSerializer,
177177
keyValueLimiter: (PersistentReadOnly, Segment) => Unit,
178178
fileOpenLimited: DBFile => Unit) extends LevelRef with LazyLogging {
179179

@@ -187,6 +187,12 @@ private[core] class Level(val dirs: Seq[Dir],
187187

188188
val removeDeletedRecords = Level.removeDeletes(nextLevel)
189189

190+
def rootPath: Path =
191+
dirs.head.path
192+
193+
def appendixPath: Path =
194+
rootPath.resolve("appendix")
195+
190196
def releaseLocks: Try[Unit] =
191197
Try(lock.foreach(_.release())) flatMap {
192198
_ =>

core/src/main/scala/swaydb/core/level/LevelRef.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ private[core] trait LevelRef extends LevelActorAPI {
4343

4444
def hasNextLevel: Boolean
4545

46+
def appendixPath: Path
47+
48+
def rootPath: Path
49+
4650
def takeSegments(size: Int,
4751
condition: Segment => Boolean): Iterable[Segment]
4852

core/src/main/scala/swaydb/core/level/TrashLevel.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
package swaydb.core.level
2121

22-
import java.nio.file.Path
22+
import java.nio.file.{Path, Paths}
2323

2424
import swaydb.core.data.ValueType
2525
import swaydb.core.level.actor.LevelAPI
@@ -36,6 +36,10 @@ private[core] object TrashLevel extends LevelRef {
3636

3737
override val paths: PathsDistributor = PathsDistributor(Seq(), () => Seq())
3838

39+
override def appendixPath: Path = Paths.get("Trash level has no path")
40+
41+
def rootPath: Path = Paths.get("Trash level has no path")
42+
3943
override val throttle: LevelMeter => Throttle =
4044
(_) => Throttle(Duration.Zero, 0)
4145

core/src/main/scala/swaydb/core/level/zero/LevelZero.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import swaydb.core.io.file.IO
2929
import swaydb.core.level.LevelRef
3030
import swaydb.core.level.actor.LevelCommand.WakeUp
3131
import swaydb.core.level.actor.LevelZeroAPI
32-
import swaydb.core.map.serializer.KeyValuesMapSerializer
32+
import swaydb.core.map.serializer.Level0KeyValuesSerializer
3333
import swaydb.core.map.{MapEntry, Maps}
3434
import swaydb.core.retry.Retry
3535
import swaydb.core.util.MinMax
@@ -51,7 +51,7 @@ private[core] object LevelZero extends LazyLogging {
5151
acceleration: Level0Meter => Accelerator,
5252
readRetryLimit: Int)(implicit ordering: Ordering[Slice[Byte]],
5353
ec: ExecutionContext): Try[LevelZero] = {
54-
implicit val serializer: KeyValuesMapSerializer = KeyValuesMapSerializer(ordering)
54+
implicit val serializer: Level0KeyValuesSerializer = Level0KeyValuesSerializer(ordering)
5555
val mapsAndPathAndLock =
5656
storage match {
5757
case Persistent(mmap, databaseDirectory, recovery) =>
@@ -85,7 +85,7 @@ private[core] class LevelZero(val path: Path,
8585
val maps: Maps[Slice[Byte], (ValueType, Option[Slice[Byte]])],
8686
val nextLevel: LevelRef,
8787
lock: Option[FileLock])(implicit ordering: Ordering[Slice[Byte]],
88-
val serializer: KeyValuesMapSerializer,
88+
val serializer: Level0KeyValuesSerializer,
8989
ec: ExecutionContext) extends LevelZeroRef with LazyLogging {
9090

9191
logger.info("{}: Level0 started.", path)

core/src/main/scala/swaydb/core/map/serializer/SegmentsMapSerializer.scala renamed to core/src/main/scala/swaydb/core/map/serializer/AppendixSerializer.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import swaydb.data.util.ByteSizeOf
3535
import scala.concurrent.ExecutionContext
3636
import scala.util.{Success, Try}
3737

38-
private[core] object SegmentsMapSerializer {
38+
private[core] object AppendixSerializer {
3939

4040
def apply(removeDeletedRecords: Boolean,
4141
mmapSegmentsOnRead: Boolean,
@@ -44,14 +44,14 @@ private[core] object SegmentsMapSerializer {
4444
keyValueLimiter: (PersistentReadOnly, Segment) => Unit,
4545
fileOpenLimited: DBFile => Unit,
4646
ec: ExecutionContext) =
47-
new SegmentsMapSerializer(removeDeletedRecords, mmapSegmentsOnRead, mmapSegmentsOnWrite, cacheKeysOnCreate)
47+
new AppendixSerializer(removeDeletedRecords, mmapSegmentsOnRead, mmapSegmentsOnWrite, cacheKeysOnCreate)
4848

4949
}
5050

51-
private[core] class SegmentsMapSerializer(removeDeletes: Boolean,
52-
mmapSegmentsOnRead: Boolean,
53-
mmapSegmentsOnWrite: Boolean,
54-
cacheKeysOnCreate: Boolean)(implicit ordering: Ordering[Slice[Byte]],
51+
private[core] class AppendixSerializer(removeDeletes: Boolean,
52+
mmapSegmentsOnRead: Boolean,
53+
mmapSegmentsOnWrite: Boolean,
54+
cacheKeysOnCreate: Boolean)(implicit ordering: Ordering[Slice[Byte]],
5555
keyValueLimiter: (PersistentReadOnly, Segment) => Unit,
5656
fileOpenLimiter: DBFile => Unit,
5757
ec: ExecutionContext) extends MapSerializer[Slice[Byte], Segment] with LazyLogging {

core/src/main/scala/swaydb/core/map/serializer/KeyValuesMapSerializer.scala renamed to core/src/main/scala/swaydb/core/map/serializer/Level0KeyValuesSerializer.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ import swaydb.data.util.ByteSizeOf
2727

2828
import scala.util.Try
2929

30-
private[core] object KeyValuesMapSerializer {
30+
private[core] object Level0KeyValuesSerializer {
3131

3232
def apply(implicit ordering: Ordering[Slice[Byte]]) =
33-
new KeyValuesMapSerializer()
33+
new Level0KeyValuesSerializer()
3434

3535
}
3636

37-
private[core] class KeyValuesMapSerializer(implicit ordering: Ordering[Slice[Byte]]) extends MapSerializer[Slice[Byte], (ValueType, Option[Slice[Byte]])] {
37+
private[core] class Level0KeyValuesSerializer(implicit ordering: Ordering[Slice[Byte]]) extends MapSerializer[Slice[Byte], (ValueType, Option[Slice[Byte]])] {
3838

3939
implicit val readerWriter = this
4040

0 commit comments

Comments
 (0)