From 4d81c92b668bce79d7db7bc278f0d399fe693e65 Mon Sep 17 00:00:00 2001 From: James Moger Date: Mon, 28 Apr 2014 14:56:15 -0400 Subject: Implementation of a ticket mgration tool --- .../com/gitblit/tickets/RedisTicketService.java | 70 +++++++++++++++++++++- 1 file changed, 67 insertions(+), 3 deletions(-) (limited to 'src/main/java/com/gitblit/tickets/RedisTicketService.java') diff --git a/src/main/java/com/gitblit/tickets/RedisTicketService.java b/src/main/java/com/gitblit/tickets/RedisTicketService.java index 2c5b181f..d773b0bd 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.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.TreeSet; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; @@ -184,6 +185,30 @@ public class RedisTicketService extends ITicketService { return false; } + @Override + public Set getIds(RepositoryModel repository) { + Set ids = new TreeSet(); + Jedis jedis = pool.getResource(); + try {// account for migrated tickets + Set 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 +222,14 @@ public class RedisTicketService extends ITicketService { String key = key(repository, KeyType.counter, null); String val = jedis.get(key); if (isNull(val)) { - jedis.set(key, "0"); + long lastId = 0; + Set 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 +305,7 @@ public class RedisTicketService extends ITicketService { } /** - * 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 @@ -311,6 +342,39 @@ public class RedisTicketService extends ITicketService { return null; } + /** + * Retrieves the journal for the ticket. + * + * @param repository + * @param ticketId + * @return a journal, if it exists, otherwise null + */ + @Override + protected List getJournalImpl(RepositoryModel repository, long ticketId) { + Jedis jedis = pool.getResource(); + if (jedis == null) { + return null; + } + + try { + List 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. * -- cgit v1.2.3