You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

KetchLeaderCache.java 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /*
  2. * Copyright (C) 2016, Google Inc.
  3. * and other copyright owners as documented in the project's IP log.
  4. *
  5. * This program and the accompanying materials are made available
  6. * under the terms of the Eclipse Distribution License v1.0 which
  7. * accompanies this distribution, is reproduced below, and is
  8. * available at http://www.eclipse.org/org/documents/edl-v10.php
  9. *
  10. * All rights reserved.
  11. *
  12. * Redistribution and use in source and binary forms, with or
  13. * without modification, are permitted provided that the following
  14. * conditions are met:
  15. *
  16. * - Redistributions of source code must retain the above copyright
  17. * notice, this list of conditions and the following disclaimer.
  18. *
  19. * - Redistributions in binary form must reproduce the above
  20. * copyright notice, this list of conditions and the following
  21. * disclaimer in the documentation and/or other materials provided
  22. * with the distribution.
  23. *
  24. * - Neither the name of the Eclipse Foundation, Inc. nor the
  25. * names of its contributors may be used to endorse or promote
  26. * products derived from this software without specific prior
  27. * written permission.
  28. *
  29. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  30. * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  31. * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  32. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  33. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  34. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  35. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  36. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  37. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  38. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  39. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  40. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  41. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  42. */
  43. package org.eclipse.jgit.internal.ketch;
  44. import java.net.URISyntaxException;
  45. import java.util.concurrent.ConcurrentHashMap;
  46. import java.util.concurrent.ConcurrentMap;
  47. import java.util.concurrent.locks.Lock;
  48. import java.util.concurrent.locks.ReentrantLock;
  49. import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
  50. import org.eclipse.jgit.lib.Repository;
  51. /**
  52. * A cache of live leader instances, keyed by repository.
  53. * <p>
  54. * Ketch only assigns a leader to a repository when needed. If
  55. * {@link #get(Repository)} is called for a repository that does not have a
  56. * leader, the leader is created and added to the cache.
  57. */
  58. public class KetchLeaderCache {
  59. private final KetchSystem system;
  60. private final ConcurrentMap<String, KetchLeader> leaders;
  61. private final Lock startLock;
  62. /**
  63. * Initialize a new leader cache.
  64. *
  65. * @param system
  66. * system configuration for the leaders
  67. */
  68. public KetchLeaderCache(KetchSystem system) {
  69. this.system = system;
  70. leaders = new ConcurrentHashMap<>();
  71. startLock = new ReentrantLock(true /* fair */);
  72. }
  73. /**
  74. * Lookup the leader instance for a given repository.
  75. *
  76. * @param repo
  77. * repository to get the leader for.
  78. * @return the leader instance for the repository.
  79. * @throws URISyntaxException
  80. * remote configuration contains an invalid URL.
  81. */
  82. public KetchLeader get(Repository repo)
  83. throws URISyntaxException {
  84. String key = computeKey(repo);
  85. KetchLeader leader = leaders.get(key);
  86. if (leader != null) {
  87. return leader;
  88. }
  89. return startLeader(key, repo);
  90. }
  91. private KetchLeader startLeader(String key, Repository repo)
  92. throws URISyntaxException {
  93. startLock.lock();
  94. try {
  95. KetchLeader leader = leaders.get(key);
  96. if (leader != null) {
  97. return leader;
  98. }
  99. leader = system.createLeader(repo);
  100. leaders.put(key, leader);
  101. return leader;
  102. } finally {
  103. startLock.unlock();
  104. }
  105. }
  106. private static String computeKey(Repository repo) {
  107. if (repo instanceof DfsRepository) {
  108. DfsRepository dfs = (DfsRepository) repo;
  109. return dfs.getDescription().getRepositoryName();
  110. }
  111. if (repo.getDirectory() != null) {
  112. return repo.getDirectory().toURI().toString();
  113. }
  114. throw new IllegalArgumentException();
  115. }
  116. }