PageRenderTime 42ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/test/java/hgtest/tx/DataTxTests.java

http://hypergraphdb.googlecode.com/
Java | 235 lines | 207 code | 27 blank | 1 comment | 30 complexity | 44c333084f081b4ded5e0dff2df28187 MD5 | raw file
Possible License(s): LGPL-2.1, BSD-3-Clause
  1. package hgtest.tx;
  2. import static org.testng.Assert.assertEquals;
  3. import static org.testng.Assert.assertNotNull;
  4. import hgtest.HGTestBase;
  5. import hgtest.T;
  6. import java.util.ArrayList;
  7. import java.util.HashMap;
  8. import java.util.concurrent.Callable;
  9. import java.util.concurrent.ExecutorService;
  10. import java.util.concurrent.Executors;
  11. import java.util.concurrent.TimeUnit;
  12. import java.util.concurrent.atomic.AtomicInteger;
  13. import org.hypergraphdb.HGPersistentHandle;
  14. import org.hypergraphdb.HGQuery.hg;
  15. import org.hypergraphdb.storage.BAtoBA;
  16. import org.hypergraphdb.transaction.HGTransactionManager;
  17. import org.hypergraphdb.util.HGUtils;
  18. public class DataTxTests extends HGTestBase
  19. {
  20. private int atomsCount = 200;
  21. private int threadCount = 2;
  22. private boolean log = false;
  23. private ArrayList<Throwable> errors = new ArrayList<Throwable>();
  24. public static class SimpleData
  25. {
  26. private int idx = -1;
  27. private AtomicInteger value = new AtomicInteger(0);
  28. public SimpleData()
  29. {
  30. }
  31. public SimpleData(int idx, int val)
  32. {
  33. this.idx = idx;
  34. this.value.set(val);
  35. }
  36. @Override
  37. public String toString()
  38. {
  39. return "SimpleData [idx=" + idx
  40. + ", value=" + value + "]";
  41. }
  42. public int getIdx()
  43. {
  44. return idx;
  45. }
  46. public void setIdx(int idx)
  47. {
  48. this.idx = idx;
  49. }
  50. public int getValue()
  51. {
  52. return value.get();
  53. }
  54. public void setValue(int value)
  55. {
  56. this.value.set(value);
  57. }
  58. public void incrementValue()
  59. {
  60. this.value.incrementAndGet();
  61. }
  62. public void decrementValue()
  63. {
  64. this.value.incrementAndGet();
  65. }
  66. @Override
  67. public int hashCode()
  68. {
  69. final int prime = 31;
  70. int result = 1;
  71. result = prime * result + idx;
  72. result = prime * result + ((value == null) ? 0 : value.hashCode());
  73. return result;
  74. }
  75. @Override
  76. public boolean equals(Object obj)
  77. {
  78. if (this == obj)
  79. return true;
  80. if (obj == null)
  81. return false;
  82. if (getClass() != obj.getClass())
  83. return false;
  84. SimpleData other = (SimpleData) obj;
  85. if (idx != other.idx)
  86. return false;
  87. if (value == null)
  88. {
  89. if (other.value != null)
  90. return false;
  91. }
  92. else if (!value.equals(other.value))
  93. return false;
  94. return true;
  95. }
  96. }
  97. Object makeAtom(int i)
  98. {
  99. return new SimpleData(i, i);
  100. }
  101. public void verifyData()
  102. {
  103. for (int i = 0; i < atomsCount; i++)
  104. {
  105. SimpleData x = hg.getOne(graph, hg.and(hg.type(SimpleData.class),
  106. hg.eq("idx", i)));
  107. if (log && x.getIdx() == 0)
  108. T.getLogger("DataTxTests").info("verifyData: " + x);
  109. assertNotNull(x);
  110. assertEquals(x.getValue(), x.getIdx() + threadCount);
  111. }
  112. }
  113. private ThreadLocal<HashMap<Integer, SimpleData>> localMap =
  114. new ThreadLocal<HashMap<Integer, SimpleData>>();
  115. private void increment(final HGPersistentHandle atomX)
  116. {
  117. final HGTransactionManager txman = graph.getTransactionManager();
  118. SimpleData committed = txman.ensureTransaction(new Callable<SimpleData>()
  119. {
  120. public SimpleData call()
  121. {
  122. final SimpleData l = graph.get(atomX);
  123. if (log && l.getIdx() == 0)
  124. T.getLogger("DataTxTests").info(
  125. "Increment " + l + ":" + atomX);
  126. SimpleData newBean = new SimpleData(l.getIdx(), l.getValue() + 1);
  127. graph.replace(atomX, newBean);
  128. if (log && l.getIdx() == 0)
  129. T.getLogger("DataTxTests").info("After increment " + l);
  130. return newBean;
  131. }
  132. });
  133. localMap.get().put(committed.getIdx(), committed);
  134. }
  135. private void incrementValues()
  136. {
  137. localMap.set(new HashMap<Integer, SimpleData>());
  138. for (int i = 0; i < atomsCount; i++)
  139. localMap.get().put(i, (SimpleData)hg.getOne(graph, hg.and(hg.type(SimpleData.class),
  140. hg.eq("idx", i))));
  141. for (int i = 0; i < atomsCount; i++)
  142. {
  143. final HGPersistentHandle hi = hg.findOne(graph, hg.and(hg.type(SimpleData.class),
  144. hg.eq("idx", i)));
  145. assertNotNull(hi);
  146. increment(hi);
  147. }
  148. }
  149. // @Test
  150. public void testConcurrentLinkCreation()
  151. {
  152. graph.getStore().getIndex("temptest", BAtoBA.getInstance(), BAtoBA.getInstance(), null, true);
  153. for (int i = 0; i < atomsCount; i++)
  154. hg.assertAtom(graph, makeAtom(i));
  155. ExecutorService pool = Executors.newFixedThreadPool(10);
  156. for (int i = 0; i < threadCount; i++)
  157. {
  158. pool.execute(new Runnable()
  159. {
  160. public void run()
  161. {
  162. try
  163. {
  164. incrementValues();
  165. }
  166. catch (Throwable t)
  167. {
  168. t.printStackTrace(System.err);
  169. errors.add(t);
  170. }
  171. }
  172. });
  173. }
  174. try
  175. {
  176. pool.shutdown();
  177. pool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
  178. }
  179. catch (InterruptedException ex)
  180. {
  181. System.out.println("testTxMap interrupted.");
  182. return;
  183. }
  184. assertEquals(errors.size(), 0);
  185. verifyData();
  186. }
  187. public static void main(String[] argv)
  188. {
  189. for (int i = 0; i < Integer.MAX_VALUE; i++ ){
  190. DataTxTests test = new DataTxTests();
  191. HGUtils.dropHyperGraphInstance(test.getGraphLocation());
  192. test.setUp();
  193. try
  194. {
  195. test.testConcurrentLinkCreation();
  196. }
  197. catch (Throwable t)
  198. {
  199. t.printStackTrace(System.err);
  200. break;
  201. }
  202. finally
  203. {
  204. test.tearDown();
  205. }
  206. }
  207. }
  208. }