X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdatabase%2Fmemory%2FMemoryDatabase.kt;h=a9459e88f4fa9d3d9f65c352555f3243f11906e1;hb=c6c4802b4e389b4457adf0827efafca1cd7d1e9c;hp=702d4e210951241688ace6ccff73f16c3f8551df;hpb=9fc45be4cce92e2d960395a35d046b2c5808a0bb;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.kt b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.kt index 702d4e2..a9459e8 100644 --- a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.kt +++ b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.kt @@ -1,5 +1,5 @@ /* - * Sone - MemoryDatabase.java - Copyright © 2013–2016 David Roden + * Sone - MemoryDatabase.kt - Copyright © 2013–2019 David Roden * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,7 +21,7 @@ import com.google.common.base.Preconditions.checkNotNull import com.google.common.collect.HashMultimap import com.google.common.collect.Multimap import com.google.common.collect.TreeMultimap -import com.google.common.util.concurrent.AbstractService +import com.google.common.util.concurrent.* import com.google.inject.Inject import com.google.inject.Singleton import net.pterodactylus.sone.data.Album @@ -49,8 +49,6 @@ import kotlin.concurrent.withLock /** * Memory-based [PostDatabase] implementation. - * - * @author [David ‘Bombe’ Roden](mailto:bombe@pterodactylus.net) */ @Singleton class MemoryDatabase @Inject constructor(private val configuration: Configuration) : AbstractService(), Database { @@ -72,6 +70,7 @@ class MemoryDatabase @Inject constructor(private val configuration: Configuratio private val soneImages: Multimap = HashMultimap.create() private val memoryBookmarkDatabase = MemoryBookmarkDatabase(this, configurationLoader) private val memoryFriendDatabase = MemoryFriendDatabase(configurationLoader) + private val saveRateLimiter: RateLimiter = RateLimiter.create(1.0) override val soneLoader get() = this::getSone @@ -84,8 +83,10 @@ class MemoryDatabase @Inject constructor(private val configuration: Configuratio override val bookmarkedPosts get() = memoryBookmarkDatabase.bookmarkedPosts override fun save() { - saveKnownPosts() - saveKnownPostReplies() + if (saveRateLimiter.tryAcquire()) { + saveKnownPosts() + saveKnownPostReplies() + } } override fun doStart() { @@ -283,22 +284,24 @@ class MemoryDatabase @Inject constructor(private val configuration: Configuratio protected fun isPostKnown(post: Post) = readLock.withLock { post.id in knownPosts } - protected fun setPostKnown(post: Post, known: Boolean): Unit = + fun setPostKnown(post: Post, known: Boolean): Unit = writeLock.withLock { if (known) knownPosts.add(post.id) else knownPosts.remove(post.id) + saveKnownPosts() } protected fun isPostReplyKnown(postReply: PostReply) = readLock.withLock { postReply.id in knownPostReplies } - protected fun setPostReplyKnown(postReply: PostReply, known: Boolean): Unit = + fun setPostReplyKnown(postReply: PostReply, known: Boolean): Unit = writeLock.withLock { if (known) knownPostReplies.add(postReply.id) else knownPostReplies.remove(postReply.id) + saveKnownPostReplies() } private fun loadKnownPosts() = @@ -314,7 +317,7 @@ class MemoryDatabase @Inject constructor(private val configuration: Configuratio try { readLock.withLock { knownPosts.forEachIndexed { index, knownPostId -> - configuration.getStringValue("KnowsPosts/$index/ID").value = knownPostId + configuration.getStringValue("KnownPosts/$index/ID").value = knownPostId } configuration.getStringValue("KnownPosts/${knownPosts.size}/ID").value = null }