killbill-memoizeit
Changes
.circleci/config.yml 2(+1 -1)
account/pom.xml 2(+1 -1)
api/pom.xml 2(+1 -1)
beatrix/pom.xml 2(+1 -1)
catalog/pom.xml 2(+1 -1)
currency/pom.xml 2(+1 -1)
entitlement/pom.xml 2(+1 -1)
entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java 7(+0 -7)
invoice/pom.xml 2(+1 -1)
jaxrs/pom.xml 2(+1 -1)
junction/pom.xml 2(+1 -1)
NEWS 4(+4 -0)
overdue/pom.xml 2(+1 -1)
payment/pom.xml 2(+1 -1)
pom.xml 4(+2 -2)
profiles/killbill/pom.xml 2(+1 -1)
profiles/killpay/pom.xml 2(+1 -1)
profiles/pom.xml 2(+1 -1)
subscription/pom.xml 2(+1 -1)
subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java 53(+53 -0)
subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java 12(+9 -3)
tenant/pom.xml 2(+1 -1)
usage/pom.xml 2(+1 -1)
util/pom.xml 2(+1 -1)
Details
.circleci/config.yml 2(+1 -1)
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 606fabe..6ca1665 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -139,6 +139,7 @@ jobs:
set +e
mvn clean install -DskipTests=true
+ mkdir -p /tmp/test-results
nohup ./bin/start-server -s > /tmp/test-results/killbill.log 2>&1 &
mkdir -p /home/killbill/killbill-integration-tests
@@ -165,7 +166,6 @@ jobs:
done
set -e
- mkdir -p /tmp/test-results
bundle exec rake test:core | tee /tmp/test-results/test.txt 2>&1
- store_test_results:
path: /tmp/test-results
account/pom.xml 2(+1 -1)
diff --git a/account/pom.xml b/account/pom.xml
index b9f90a0..3381927 100644
--- a/account/pom.xml
+++ b/account/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-account</artifactId>
api/pom.xml 2(+1 -1)
diff --git a/api/pom.xml b/api/pom.xml
index 647e109..c7a0a58 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-internal-api</artifactId>
beatrix/pom.xml 2(+1 -1)
diff --git a/beatrix/pom.xml b/beatrix/pom.xml
index 8ded1e5..13276df 100644
--- a/beatrix/pom.xml
+++ b/beatrix/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-beatrix</artifactId>
catalog/pom.xml 2(+1 -1)
diff --git a/catalog/pom.xml b/catalog/pom.xml
index 5dc0f65..f6e5a11 100644
--- a/catalog/pom.xml
+++ b/catalog/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-catalog</artifactId>
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/VersionedCatalog.java b/catalog/src/main/java/org/killbill/billing/catalog/VersionedCatalog.java
index 73dfb28..32018fd 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/VersionedCatalog.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/VersionedCatalog.java
@@ -278,6 +278,7 @@ public class VersionedCatalog extends ValidatingConfig<VersionedCatalog> impleme
return versionForDate(requestedDate).getCurrentSupportedCurrencies();
}
+ @Override
public Unit[] getUnits(final DateTime requestedDate) throws CatalogApiException {
return versionForDate(requestedDate).getCurrentUnits();
}
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/MockCatalog.java b/catalog/src/test/java/org/killbill/billing/catalog/MockCatalog.java
index 5c788a0..1744d0d 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/MockCatalog.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/MockCatalog.java
@@ -41,6 +41,7 @@ import org.killbill.billing.catalog.api.PlanSpecifier;
import org.killbill.billing.catalog.api.PriceList;
import org.killbill.billing.catalog.api.PriceListSet;
import org.killbill.billing.catalog.api.Product;
+import org.killbill.billing.catalog.api.Unit;
import org.killbill.billing.catalog.rules.DefaultCaseCancelPolicy;
import org.killbill.billing.catalog.rules.DefaultCaseChangePlanAlignment;
import org.killbill.billing.catalog.rules.DefaultCaseChangePlanPolicy;
@@ -110,6 +111,11 @@ public class MockCatalog extends StandaloneCatalog implements Catalog {
}
@Override
+ public Unit[] getUnits(final DateTime requestedDate) throws CatalogApiException {
+ return getCurrentUnits();
+ }
+
+ @Override
public Collection<Product> getProducts(final DateTime requestedDate) throws CatalogApiException {
return getCurrentProducts();
}
currency/pom.xml 2(+1 -1)
diff --git a/currency/pom.xml b/currency/pom.xml
index 3dc41ce..efb61bd 100644
--- a/currency/pom.xml
+++ b/currency/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-currency</artifactId>
entitlement/pom.xml 2(+1 -1)
diff --git a/entitlement/pom.xml b/entitlement/pom.xml
index 9cc730e..4549ace 100644
--- a/entitlement/pom.xml
+++ b/entitlement/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-entitlement</artifactId>
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java
index 1cc7e59..cfbd91f 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java
@@ -18,7 +18,6 @@
package org.killbill.billing.entitlement.api;
-import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@@ -45,9 +44,7 @@ import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedDB {
@@ -542,7 +539,6 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
}
-
@Test(groups = "slow")
public void testCreateEntitlementInThePast() throws AccountApiException, EntitlementApiException, SubscriptionBaseApiException {
final LocalDate initialDate = new LocalDate(2013, 8, 7);
@@ -645,7 +641,6 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
}
-
@Test(groups = "slow")
public void testCreateBaseWithEntitlementInTheFuture() throws AccountApiException, EntitlementApiException, SubscriptionApiException {
final LocalDate initialDate = new LocalDate(2013, 8, 7);
@@ -757,7 +752,6 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
assertEquals(entitlement.getEffectiveStartDate(), initialDate);
}
-
@Test(groups = "slow")
public void testCreateBaseSubscriptionsWithAddOns() throws AccountApiException, EntitlementApiException, SubscriptionApiException {
final LocalDate initialDate = new LocalDate(2013, 8, 7);
@@ -805,7 +799,6 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
}
-
@Test(groups = "slow", expectedExceptions = EntitlementApiException.class)
public void testCreateBaseSubscriptionsWithAddOnsMissingBase() throws AccountApiException, EntitlementApiException, SubscriptionApiException {
final LocalDate initialDate = new LocalDate(2013, 8, 7);
invoice/pom.xml 2(+1 -1)
diff --git a/invoice/pom.xml b/invoice/pom.xml
index 7f8aa16..c52b20c 100644
--- a/invoice/pom.xml
+++ b/invoice/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-invoice</artifactId>
jaxrs/pom.xml 2(+1 -1)
diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml
index 760e8c3..764f7ee 100644
--- a/jaxrs/pom.xml
+++ b/jaxrs/pom.xml
@@ -21,7 +21,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-jaxrs</artifactId>
junction/pom.xml 2(+1 -1)
diff --git a/junction/pom.xml b/junction/pom.xml
index 7e45ce7..3d51db9 100644
--- a/junction/pom.xml
+++ b/junction/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-junction</artifactId>
NEWS 4(+4 -0)
diff --git a/NEWS b/NEWS
index eb29201..b7c3775 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+0.19.9
+ Introduce thread-local dirty DB flag
+ Fix NPE in bus and notifications threads
+
0.19.5
Database perf improvements
overdue/pom.xml 2(+1 -1)
diff --git a/overdue/pom.xml b/overdue/pom.xml
index a3902d9..0670da2 100644
--- a/overdue/pom.xml
+++ b/overdue/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-overdue</artifactId>
payment/pom.xml 2(+1 -1)
diff --git a/payment/pom.xml b/payment/pom.xml
index a12057a..8c33f57 100644
--- a/payment/pom.xml
+++ b/payment/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-payment</artifactId>
pom.xml 4(+2 -2)
diff --git a/pom.xml b/pom.xml
index f095047..d340aae 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,10 +21,10 @@
<parent>
<artifactId>killbill-oss-parent</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.141.51</version>
+ <version>0.141.55</version>
</parent>
<artifactId>killbill</artifactId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<packaging>pom</packaging>
<name>killbill</name>
<description>Library for managing recurring subscriptions and the associated billing</description>
profiles/killbill/pom.xml 2(+1 -1)
diff --git a/profiles/killbill/pom.xml b/profiles/killbill/pom.xml
index 1fb2468..206a11c 100644
--- a/profiles/killbill/pom.xml
+++ b/profiles/killbill/pom.xml
@@ -21,7 +21,7 @@
<parent>
<artifactId>killbill-profiles</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-profiles-killbill</artifactId>
profiles/killpay/pom.xml 2(+1 -1)
diff --git a/profiles/killpay/pom.xml b/profiles/killpay/pom.xml
index 4bb1693..6d90d6f 100644
--- a/profiles/killpay/pom.xml
+++ b/profiles/killpay/pom.xml
@@ -20,7 +20,7 @@
<parent>
<artifactId>killbill-profiles</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-profiles-killpay</artifactId>
profiles/pom.xml 2(+1 -1)
diff --git a/profiles/pom.xml b/profiles/pom.xml
index 265bc4c..355a94f 100644
--- a/profiles/pom.xml
+++ b/profiles/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-profiles</artifactId>
subscription/pom.xml 2(+1 -1)
diff --git a/subscription/pom.xml b/subscription/pom.xml
index d614bb4..53ae54d 100644
--- a/subscription/pom.xml
+++ b/subscription/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-subscription</artifactId>
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java b/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java
index 99b6544..2fc6531 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java
@@ -37,6 +37,9 @@ import org.killbill.billing.subscription.events.SubscriptionBaseEvent;
import org.killbill.billing.subscription.events.user.ApiEventBuilder;
import org.killbill.billing.subscription.events.user.ApiEventCreate;
import org.killbill.billing.util.UUIDs;
+import org.killbill.billing.util.glue.KillbillApiAopModule;
+import org.mockito.Mockito;
+import org.skife.jdbi.v2.IDBI;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
@@ -166,4 +169,54 @@ public class TestSubscriptionDao extends SubscriptionTestSuiteWithEmbeddedDB {
}
+
+ @Test(groups = "slow")
+ public void testDirtyFlag() throws SubscriptionBaseApiException {
+ // @BeforeMethod created the account
+ KillbillApiAopModule.resetDirtyDBFlag();
+
+ final IDBI dbiSpy = Mockito.spy(dbi);
+ final IDBI roDbiSpy = Mockito.spy(roDbi);
+ final SubscriptionDao subscriptionDao = new DefaultSubscriptionDao(dbiSpy,
+ roDbiSpy,
+ clock,
+ addonUtils,
+ notificationQueueService,
+ bus,
+ controlCacheDispatcher,
+ nonEntityDao,
+ internalCallContextFactory);
+ Mockito.verify(dbiSpy, Mockito.times(0)).open();
+ Mockito.verify(roDbiSpy, Mockito.times(0)).open();
+
+ Assert.assertEquals(subscriptionDao.getSubscriptionBundleForAccount(accountId, internalCallContext).size(), 0);
+ Mockito.verify(dbiSpy, Mockito.times(0)).open();
+ Mockito.verify(roDbiSpy, Mockito.times(1)).open();
+
+ Assert.assertEquals(subscriptionDao.getSubscriptionBundleForAccount(accountId, internalCallContext).size(), 0);
+ Mockito.verify(dbiSpy, Mockito.times(0)).open();
+ Mockito.verify(roDbiSpy, Mockito.times(2)).open();
+
+ final String externalKey = UUID.randomUUID().toString();
+ final DateTime startDate = clock.getUTCNow();
+ final DateTime createdDate = startDate.plusSeconds(10);
+ final DefaultSubscriptionBaseBundle bundleDef = new DefaultSubscriptionBaseBundle(externalKey, accountId, startDate, startDate, createdDate, createdDate);
+ final SubscriptionBaseBundle bundle = subscriptionDao.createSubscriptionBundle(bundleDef, catalog, false, internalCallContext);
+ Mockito.verify(dbiSpy, Mockito.times(1)).open();
+ Mockito.verify(roDbiSpy, Mockito.times(2)).open();
+
+ Assert.assertEquals(subscriptionDao.getSubscriptionBundleForAccount(accountId, internalCallContext).size(), 1);
+ Mockito.verify(dbiSpy, Mockito.times(2)).open();
+ Mockito.verify(roDbiSpy, Mockito.times(2)).open();
+
+ Assert.assertEquals(subscriptionDao.getSubscriptionBundleForAccount(accountId, internalCallContext).size(), 1);
+ Mockito.verify(dbiSpy, Mockito.times(3)).open();
+ Mockito.verify(roDbiSpy, Mockito.times(2)).open();
+
+ KillbillApiAopModule.resetDirtyDBFlag();
+
+ Assert.assertEquals(subscriptionDao.getSubscriptionBundleForAccount(accountId, internalCallContext).size(), 1);
+ Mockito.verify(dbiSpy, Mockito.times(3)).open();
+ Mockito.verify(roDbiSpy, Mockito.times(3)).open();
+ }
}
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
index fa1c027..2b5da99 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
@@ -36,11 +36,14 @@ import org.killbill.billing.subscription.api.timeline.SubscriptionBaseTimelineAp
import org.killbill.billing.subscription.api.transfer.SubscriptionBaseTransferApi;
import org.killbill.billing.subscription.api.user.SubscriptionBaseBundle;
import org.killbill.billing.subscription.api.user.TestSubscriptionHelper;
+import org.killbill.billing.subscription.engine.addon.AddonUtils;
import org.killbill.billing.subscription.engine.dao.SubscriptionDao;
import org.killbill.billing.subscription.glue.TestDefaultSubscriptionModuleWithEmbeddedDB;
import org.killbill.billing.util.config.definition.SubscriptionConfig;
import org.killbill.billing.util.dao.NonEntityDao;
+import org.killbill.bus.api.PersistentBus;
import org.killbill.clock.ClockMock;
+import org.killbill.notificationq.api.NotificationQueueService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.AfterMethod;
@@ -65,10 +68,12 @@ public class SubscriptionTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteW
protected SubscriptionBaseInternalApi subscriptionInternalApi;
@Inject
protected SubscriptionBaseTransferApi transferApi;
-
+ @Inject
+ protected PersistentBus bus;
@Inject
protected SubscriptionBaseTimelineApi repairApi;
-
+ @Inject
+ protected NotificationQueueService notificationQueueService;
@Inject
protected CatalogService catalogService;
@Inject
@@ -79,7 +84,8 @@ public class SubscriptionTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteW
protected ClockMock clock;
@Inject
protected BusService busService;
-
+ @Inject
+ protected AddonUtils addonUtils;
@Inject
protected TestSubscriptionHelper testUtil;
@Inject
tenant/pom.xml 2(+1 -1)
diff --git a/tenant/pom.xml b/tenant/pom.xml
index 5200877..c83a4c3 100644
--- a/tenant/pom.xml
+++ b/tenant/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-tenant</artifactId>
usage/pom.xml 2(+1 -1)
diff --git a/usage/pom.xml b/usage/pom.xml
index b6094ca..c648b85 100644
--- a/usage/pom.xml
+++ b/usage/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-usage</artifactId>
util/pom.xml 2(+1 -1)
diff --git a/util/pom.xml b/util/pom.xml
index 32884bd..fe72a83 100644
--- a/util/pom.xml
+++ b/util/pom.xml
@@ -21,7 +21,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.19.9-SNAPSHOT</version>
+ <version>0.19.10-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-util</artifactId>
diff --git a/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoTransactionalJdbiWrapper.java b/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoTransactionalJdbiWrapper.java
index 7a01782..a6f6287 100644
--- a/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoTransactionalJdbiWrapper.java
+++ b/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoTransactionalJdbiWrapper.java
@@ -24,6 +24,7 @@ import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.dao.NonEntityDao;
import org.killbill.billing.util.entity.Entity;
+import org.killbill.billing.util.glue.KillbillApiAopModule;
import org.killbill.clock.Clock;
import org.skife.jdbi.v2.Handle;
import org.skife.jdbi.v2.IDBI;
@@ -82,12 +83,13 @@ public class EntitySqlDaoTransactionalJdbiWrapper {
/**
* @param <ReturnType> object type to return from the transaction
- * @param ro whether to use the read-only connection
+ * @param requestedRO hint as whether to use the read-only connection
* @param entitySqlDaoTransactionWrapper transaction to execute
* @return result from the transaction fo type ReturnType
*/
- public <ReturnType> ReturnType execute(final boolean ro, final EntitySqlDaoTransactionWrapper<ReturnType> entitySqlDaoTransactionWrapper) {
+ public <ReturnType> ReturnType execute(final boolean requestedRO, final EntitySqlDaoTransactionWrapper<ReturnType> entitySqlDaoTransactionWrapper) {
final String debugInfo = logger.isDebugEnabled() ? getDebugInfo() : null;
+ final boolean ro = shouldUseRODBI(requestedRO, debugInfo);
final String debugPrefix = ro ? "RO" : "RW";
final Handle handle = ro ? roDbi.open() : dbi.open();
@@ -107,12 +109,33 @@ public class EntitySqlDaoTransactionalJdbiWrapper {
}
}
+ private boolean shouldUseRODBI(final boolean requestedRO, final String debugInfo) {
+ if (!requestedRO) {
+ KillbillApiAopModule.setDirtyDBFlag();
+ logger.debug("[RW] Dirty flag set, transaction: {}", debugInfo);
+ return false;
+ } else {
+ if (KillbillApiAopModule.getDirtyDBFlag()) {
+ // Redirect to the rw instance, to work-around any replication delay
+ logger.debug("[RW] RO DBI handle requested, but dirty flag set, transaction: {}", debugInfo);
+ return false;
+ } else {
+ return true;
+ }
+ }
+ }
+
//
// This is only used in the pagination APIs when streaming results. We want to keep the connection open, and also there is no need
// to send bus events, record notifications where we need to keep the Connection through the jDBI Handle.
//
public <M extends EntityModelDao<E>, E extends Entity, T extends EntitySqlDao<M, E>> T onDemandForStreamingResults(final Class<T> sqlObjectType) {
- return roDbi.onDemand(sqlObjectType);
+ final String debugInfo = logger.isDebugEnabled() ? getDebugInfo() : null;
+ if (shouldUseRODBI(true, debugInfo)) {
+ return roDbi.onDemand(sqlObjectType);
+ } else {
+ return dbi.onDemand(sqlObjectType);
+ }
}
/**
diff --git a/util/src/main/java/org/killbill/billing/util/glue/KillbillApiAopModule.java b/util/src/main/java/org/killbill/billing/util/glue/KillbillApiAopModule.java
index 9176282..c751f83 100644
--- a/util/src/main/java/org/killbill/billing/util/glue/KillbillApiAopModule.java
+++ b/util/src/main/java/org/killbill/billing/util/glue/KillbillApiAopModule.java
@@ -35,6 +35,12 @@ import com.google.inject.matcher.Matchers;
public class KillbillApiAopModule extends AbstractModule {
private static final Logger logger = LoggerFactory.getLogger(KillbillApiAopModule.class);
+ private static final ThreadLocal<Boolean> perThreadDirtyDBFlag = new ThreadLocal<Boolean>();
+
+ static {
+ // Set an initial value
+ resetDirtyDBFlag();
+ }
@Override
protected void configure() {
@@ -53,15 +59,31 @@ public class KillbillApiAopModule extends AbstractModule {
return prof.executeWithProfiling(ProfilingFeatureType.API, invocation.getMethod().getName(), new WithProfilingCallback() {
@Override
public Object execute() throws Throwable {
- logger.debug("Entering API call {}, arguments: {}", invocation.getMethod(), invocation.getArguments());
- final Object proceed = invocation.proceed();
- logger.debug("Exiting API call {}, returning: {}", invocation.getMethod(), proceed);
- return proceed;
+ try {
+ logger.debug("Entering API call {}, arguments: {}", invocation.getMethod(), invocation.getArguments());
+ final Object proceed = invocation.proceed();
+ logger.debug("Exiting API call {}, returning: {}", invocation.getMethod(), proceed);
+ return proceed;
+ } finally {
+ resetDirtyDBFlag();
+ }
}
});
}
}
+ public static void setDirtyDBFlag() {
+ perThreadDirtyDBFlag.set(true);
+ }
+
+ public static void resetDirtyDBFlag() {
+ perThreadDirtyDBFlag.set(false);
+ }
+
+ public static Boolean getDirtyDBFlag() {
+ return perThreadDirtyDBFlag.get() == Boolean.TRUE;
+ }
+
private static final Matcher<Method> SYNTHETIC_METHOD_MATCHER = new Matcher<Method>() {
@Override
public boolean matches(final Method method) {
diff --git a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuiteWithEmbeddedDB.java b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuiteWithEmbeddedDB.java
index 719cff7..37e3f80 100644
--- a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuiteWithEmbeddedDB.java
+++ b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuiteWithEmbeddedDB.java
@@ -23,6 +23,7 @@ import javax.inject.Named;
import javax.sql.DataSource;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
+import org.killbill.billing.util.glue.KillbillApiAopModule;
import org.killbill.commons.embeddeddb.EmbeddedDB;
import org.skife.jdbi.v2.IDBI;
import org.slf4j.Logger;
@@ -63,6 +64,7 @@ public class GuicyKillbillTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuite
public void beforeMethod() throws Exception {
cleanupAllTables();
controlCacheDispatcher.clearAll();
+ KillbillApiAopModule.resetDirtyDBFlag();
}
protected void cleanupAllTables() {