From a502d96a860456ec5e8c96761db70f7cabb74751 Mon Sep 17 00:00:00 2001 From: Paul Martin <paul@paulsputer.com> Date: Sat, 30 Apr 2016 04:19:14 -0400 Subject: [PATCH] Merge pull request #1073 from gitblit/1062-DocEditorUpdates --- src/main/java/com/gitblit/tickets/RedisTicketService.java | 78 +++++++++++++++++++++++++++++++++++++- 1 files changed, 75 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gitblit/tickets/RedisTicketService.java b/src/main/java/com/gitblit/tickets/RedisTicketService.java index 2c5b181..0f9ad17 100644 --- a/src/main/java/com/gitblit/tickets/RedisTicketService.java +++ b/src/main/java/com/gitblit/tickets/RedisTicketService.java @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.TreeSet; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; @@ -42,6 +43,8 @@ import com.gitblit.models.TicketModel.Change; import com.gitblit.utils.ArrayUtils; import com.gitblit.utils.StringUtils; +import com.google.inject.Inject; +import com.google.inject.Singleton; /** * Implementation of a ticket service based on a Redis key-value store. All @@ -52,6 +55,7 @@ * @author James Moger * */ +@Singleton public class RedisTicketService extends ITicketService { private final JedisPool pool; @@ -60,6 +64,7 @@ journal, ticket, counter } + @Inject public RedisTicketService( IRuntimeManager runtimeManager, IPluginManager pluginManager, @@ -79,6 +84,10 @@ @Override public RedisTicketService start() { + log.info("{} started", getClass().getSimpleName()); + if (!isReady()) { + log.warn("{} is not ready!", getClass().getSimpleName()); + } return this; } @@ -184,6 +193,30 @@ return false; } + @Override + public Set<Long> getIds(RepositoryModel repository) { + Set<Long> ids = new TreeSet<Long>(); + Jedis jedis = pool.getResource(); + try {// account for migrated tickets + Set<String> keys = jedis.keys(key(repository, KeyType.journal, "*")); + for (String tkey : keys) { + // {repo}:journal:{id} + String id = tkey.split(":")[2]; + long ticketId = Long.parseLong(id); + ids.add(ticketId); + } + } catch (JedisException e) { + log.error("failed to assign new ticket id in Redis @ " + getUrl(), e); + pool.returnBrokenResource(jedis); + jedis = null; + } finally { + if (jedis != null) { + pool.returnResource(jedis); + } + } + return ids; + } + /** * Assigns a new ticket id. * @@ -197,7 +230,14 @@ String key = key(repository, KeyType.counter, null); String val = jedis.get(key); if (isNull(val)) { - jedis.set(key, "0"); + long lastId = 0; + Set<Long> ids = getIds(repository); + for (long id : ids) { + if (id > lastId) { + lastId = id; + } + } + jedis.set(key, "" + lastId); } long ticketNumber = jedis.incr(key); return ticketNumber; @@ -273,8 +313,7 @@ } /** - * Retrieves the ticket from the repository by first looking-up the changeId - * associated with the ticketId. + * Retrieves the ticket from the repository. * * @param repository * @param ticketId @@ -312,6 +351,39 @@ } /** + * Retrieves the journal for the ticket. + * + * @param repository + * @param ticketId + * @return a journal, if it exists, otherwise null + */ + @Override + protected List<Change> getJournalImpl(RepositoryModel repository, long ticketId) { + Jedis jedis = pool.getResource(); + if (jedis == null) { + return null; + } + + try { + List<Change> changes = getJournal(jedis, repository, ticketId); + if (ArrayUtils.isEmpty(changes)) { + log.warn("Empty journal for {}:{}", repository, ticketId); + return null; + } + return changes; + } catch (JedisException e) { + log.error("failed to retrieve journal from Redis @ " + getUrl(), e); + pool.returnBrokenResource(jedis); + jedis = null; + } finally { + if (jedis != null) { + pool.returnResource(jedis); + } + } + return null; + } + + /** * Returns the journal for the specified ticket. * * @param repository -- Gitblit v1.9.1