<freeStyleBuild _class='hudson.model.FreeStyleBuild'><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.SCMTrigger$SCMTriggerCause'><shortDescription>Started by an SCM change</shortDescription></cause></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmaster _class='hudson.plugins.git.util.Build'><buildNumber>335</buildNumber><marked><SHA1>0dcf35b64ace92c17f9fe3e1e222dcaca30ca9cf</SHA1><branch><SHA1>0dcf35b64ace92c17f9fe3e1e222dcaca30ca9cf</SHA1><name>refs/remotes/origin/master</name></branch></marked><revision><SHA1>0dcf35b64ace92c17f9fe3e1e222dcaca30ca9cf</SHA1><branch><SHA1>0dcf35b64ace92c17f9fe3e1e222dcaca30ca9cf</SHA1><name>refs/remotes/origin/master</name></branch></revision></refsremotesoriginmaster></buildsByBranchName><lastBuiltRevision><SHA1>0dcf35b64ace92c17f9fe3e1e222dcaca30ca9cf</SHA1><branch><SHA1>0dcf35b64ace92c17f9fe3e1e222dcaca30ca9cf</SHA1><name>refs/remotes/origin/master</name></branch></lastBuiltRevision><remoteUrl>https://github.com/mcMMO-Dev/mcMMO.git</remoteUrl><scmName></scmName></action><action></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><artifact><displayPath>mcMMO.jar</displayPath><fileName>mcMMO.jar</fileName><relativePath>target/mcMMO.jar</relativePath></artifact><artifact><displayPath>original-mcMMO.jar</displayPath><fileName>original-mcMMO.jar</fileName><relativePath>target/original-mcMMO.jar</relativePath></artifact><building>false</building><displayName>#335</displayName><duration>89755</duration><estimatedDuration>135282</estimatedDuration><fullDisplayName>mcMMO #335</fullDisplayName><id>335</id><inProgress>false</inProgress><keepLog>false</keepLog><number>335</number><queueId>207</queueId><result>SUCCESS</result><timestamp>1783621157109</timestamp><url>https://popicraft.net/jenkins/job/mcMMO/335/</url><builtOn>Builder</builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>src/main/java/com/gmail/nossr50/placeholders/LeaderboardPlaceholderInputParser.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/placeholders/PapiExpansion.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/placeholders/LeaderboardPlaceholderCache.java</affectedPath><affectedPath>src/test/java/com/gmail/nossr50/database/SharedSqlContainers.java</affectedPath><affectedPath>src/test/java/com/gmail/nossr50/placeholders/McTopPlaceholdersTest.java</affectedPath><affectedPath>src/test/java/com/gmail/nossr50/placeholders/LeaderboardPlaceholderInputParserTest.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/placeholders/SkillExpRemainingPlaceholder.java</affectedPath><affectedPath>src/test/java/com/gmail/nossr50/placeholders/LeaderboardPlaceholderSqlIntegrationTest.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/datatypes/database/LeaderboardSnapshot.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/placeholders/SkillXpRatePlaceholder.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/config/GeneralConfig.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/placeholders/SkillLevelPlaceholder.java</affectedPath><affectedPath>src/test/java/com/gmail/nossr50/placeholders/LeaderboardPlaceholderFlatFileIntegrationTest.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/datatypes/database/UpgradeType.java</affectedPath><affectedPath>src/main/resources/config.yml</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/placeholders/McTopPlaceholder.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/database/DatabaseManager.java</affectedPath><affectedPath>src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/placeholders/SkillExpPlaceholder.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/placeholders/SkillRankPlaceholder.java</affectedPath><affectedPath>src/test/java/com/gmail/nossr50/util/TestFileCleanup.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/placeholders/SkillExpNeededPlaceholder.java</affectedPath><affectedPath>Changelog.txt</affectedPath><affectedPath>src/test/java/com/gmail/nossr50/database/SQLDatabaseManagerTest.java</affectedPath><affectedPath>src/test/java/com/gmail/nossr50/placeholders/LeaderboardPlaceholderCacheTest.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/mcMMO.java</affectedPath><affectedPath>src/test/java/com/gmail/nossr50/placeholders/PapiExpansionRoutingTest.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java</affectedPath><affectedPath>src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java</affectedPath><commitId>0dcf35b64ace92c17f9fe3e1e222dcaca30ca9cf</commitId><timestamp>1783621038000</timestamp><author><absoluteUrl>https://popicraft.net/jenkins/user/github</absoluteUrl><fullName>github</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Add async PAPI leaderboard cache and placeholders (#5301)

Fixes #5171
Fixes #4800
Fixes #4291

Placeholders are served from an async snapshot cache refreshed in bulk
per backend interval; includes SQL per-skill leaderboard indexes with a
query rewrite, ghost-row filtering shared by /mctop and /mcrank,
FlatFile leaderboard generation-swap thread safety, a routing pin test
for the PAPI token seam, and placeholder token names built with
Locale.ENGLISH.
</comment><date>2026-07-09 11:17:18 -0700</date><id>0dcf35b64ace92c17f9fe3e1e222dcaca30ca9cf</id><msg>Add async PAPI leaderboard cache and placeholders (#5301)</msg><path><editType>edit</editType><file>src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java</file></path><path><editType>edit</editType><file>Changelog.txt</file></path><path><editType>add</editType><file>src/main/java/com/gmail/nossr50/placeholders/LeaderboardPlaceholderCache.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/config/GeneralConfig.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/datatypes/database/UpgradeType.java</file></path><path><editType>edit</editType><file>src/main/resources/config.yml</file></path><path><editType>add</editType><file>src/test/java/com/gmail/nossr50/placeholders/LeaderboardPlaceholderSqlIntegrationTest.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/placeholders/SkillLevelPlaceholder.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/placeholders/SkillExpNeededPlaceholder.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/placeholders/PapiExpansion.java</file></path><path><editType>add</editType><file>src/main/java/com/gmail/nossr50/placeholders/McTopPlaceholder.java</file></path><path><editType>add</editType><file>src/main/java/com/gmail/nossr50/datatypes/database/LeaderboardSnapshot.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java</file></path><path><editType>add</editType><file>src/test/java/com/gmail/nossr50/placeholders/LeaderboardPlaceholderCacheTest.java</file></path><path><editType>add</editType><file>src/test/java/com/gmail/nossr50/database/SharedSqlContainers.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/mcMMO.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/placeholders/SkillExpPlaceholder.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/placeholders/SkillRankPlaceholder.java</file></path><path><editType>add</editType><file>src/test/java/com/gmail/nossr50/placeholders/LeaderboardPlaceholderFlatFileIntegrationTest.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/placeholders/SkillExpRemainingPlaceholder.java</file></path><path><editType>add</editType><file>src/test/java/com/gmail/nossr50/placeholders/PapiExpansionRoutingTest.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/placeholders/SkillXpRatePlaceholder.java</file></path><path><editType>edit</editType><file>src/main/java/com/gmail/nossr50/database/DatabaseManager.java</file></path><path><editType>add</editType><file>src/test/java/com/gmail/nossr50/placeholders/McTopPlaceholdersTest.java</file></path><path><editType>add</editType><file>src/test/java/com/gmail/nossr50/util/TestFileCleanup.java</file></path><path><editType>edit</editType><file>src/test/java/com/gmail/nossr50/database/SQLDatabaseManagerTest.java</file></path><path><editType>add</editType><file>src/test/java/com/gmail/nossr50/placeholders/LeaderboardPlaceholderInputParserTest.java</file></path><path><editType>add</editType><file>src/main/java/com/gmail/nossr50/placeholders/LeaderboardPlaceholderInputParser.java</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://popicraft.net/jenkins/user/github</absoluteUrl><fullName>github</fullName></culprit></freeStyleBuild>