Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SqlIntegrityConstraintViolationException while using multiple data sources together #639

Closed
lmsurpre opened this issue Jan 28, 2020 · 3 comments
Assignees
Labels
bug Something isn't working
Milestone

Comments

@lmsurpre
Copy link
Member

Describe the bug
While working on the db2 integration tests, I decided to used db2 for the default tenant, but keep tenant1 using derby so that we don't need to deploy the schema 4 times.

Unfortunately, this caused an issue in our integration tests. When the MultiDataStoreTest invokes a reequest with tenant=tenant1 and datastore=default, the config helper falls back to the default tenant config and so we end up using the db2 connection from default/default and that leads to:

[1/28/20 0:35:07:491 UTC] 0000268f FHIRRestServl I   Received request: tenantId:[tenant1] dsId:[default] user:[fhiruser] method:[PUT] uri:[https://localhost:9443/fhir-server/api/v4/Observation/9bab5ef9-888b-4a85-bcef-304a4d258c9d
[1/28/20 0:35:07:491 UTC] 0000268f FHIRProvider  > com.ibm.fhir.provider.FHIRProvider readFrom ENTRY
[1/28/20 0:35:07:492 UTC] 0000268f FHIRProvider  < com.ibm.fhir.provider.FHIRProvider readFrom RETURN
[1/28/20 0:35:07:492 UTC] 0000268f FHIRResource  > com.ibm.fhir.server.resources.FHIRResource update(String,String,Resource) ENTRY
[1/28/20 0:35:07:492 UTC] 0000268f FHIRResource  > com.ibm.fhir.server.resources.FHIRResource doPatchOrUpdate ENTRY
[1/28/20 0:35:07:492 UTC] 0000268f FHIRResource  1   Retrieved FHIRPersistenceHelper instance from servlet context: com.ibm.fhir.persistence.helper.FHIRPersistenceHelper@85377624
[1/28/20 0:35:07:492 UTC] 0000268f FHIRPersisten > com.ibm.fhir.persistence.helper.FHIRPersistenceHelper getFHIRPersistenceImplementation ENTRY
[1/28/20 0:35:07:492 UTC] 0000268f FHIRPersisten 1   Retrieved persistence factory property 'fhirServer/persistence/factoryClassname': com.ibm.fhir.persistence.jdbc.FHIRPersistenceJDBCFactory
[1/28/20 0:35:07:492 UTC] 0000268f FHIRPersisten 1   Using FHIR persistence factory class name: com.ibm.fhir.persistence.jdbc.FHIRPersistenceJDBCFactory
[1/28/20 0:35:07:492 UTC] 0000268f FHIRPersisten > com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl FHIRPersistenceJDBCImpl() ENTRY
[1/28/20 0:35:07:493 UTC] 0000268f FHIRPersisten < com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl FHIRPersistenceJDBCImpl() RETURN
[1/28/20 0:35:07:493 UTC] 0000268f FHIRPersisten < com.ibm.fhir.persistence.helper.FHIRPersistenceHelper getFHIRPersistenceImplementation RETURN
[1/28/20 0:35:07:493 UTC] 0000268f FHIRResource  1   Obtained new  FHIRPersistence instance: com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl@56d56c65
[1/28/20 0:35:07:493 UTC] 0000268f RestAuditLogg > com.ibm.fhir.server.util.RestAuditLogger logUpdate ENTRY
[1/28/20 0:35:07:493 UTC] 0000268f RestAuditLogg > com.ibm.fhir.server.util.RestAuditLogger initLogEntry ENTRY
[1/28/20 0:35:07:493 UTC] 0000268f RestAuditLogg < com.ibm.fhir.server.util.RestAuditLogger initLogEntry RETURN
[1/28/20 0:35:07:493 UTC] 0000268f RestAuditLogg > com.ibm.fhir.server.util.RestAuditLogger populateAuditLogEntry ENTRY
[1/28/20 0:35:07:542 UTC] 0000268f RestAuditLogg < com.ibm.fhir.server.util.RestAuditLogger populateAuditLogEntry RETURN
[1/28/20 0:35:07:542 UTC] 0000268f RestAuditLogg < com.ibm.fhir.server.util.RestAuditLogger logUpdate RETURN
[1/28/20 0:35:07:542 UTC] 0000268f FHIRResource  > com.ibm.fhir.server.resources.FHIRResource doRead ENTRY
[1/28/20 0:35:07:543 UTC] 0000268f FHIRTransacti 1   Starting transaction on current thread...
[1/28/20 0:35:07:543 UTC] 0000268f FHIRPersisten > com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl begin ENTRY
[1/28/20 0:35:07:543 UTC] 0000268f FHIRDbDAOImpl 1   Getting connection for tenantId/dsId: [tenant1/default]...
[1/28/20 0:35:07:543 UTC] 0000268f FHIRDbDAOImpl > com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl getFhirDb ENTRY
[1/28/20 0:35:07:543 UTC] 0000268f FHIRDbDAOImpl < com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl getFhirDb RETURN
[1/28/20 0:35:07:543 UTC] 0000268f FHIRDbDAOImpl 1   Got the connection for [tenant1/default]!
[1/28/20 0:35:07:543 UTC] 0000268f FHIRPersisten < com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl begin RETURN
[1/28/20 0:35:07:544 UTC] 0000268f FHIRPersisten > com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl read ENTRY
[1/28/20 0:35:07:544 UTC] 0000268f ResourceDAOIm > com.ibm.fhir.persistence.jdbc.dao.impl.ResourceDAOImpl read ENTRY
[1/28/20 0:35:07:544 UTC] 0000268f FHIRDbDAOImpl > com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl runQuery ENTRY
[1/28/20 0:35:07:567 UTC] 0000268f FHIRDbDAOImpl > com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl createDTOs ENTRY
[1/28/20 0:35:07:567 UTC] 0000268f FHIRDbDAOImpl < com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl createDTOs RETURN
[1/28/20 0:35:07:567 UTC] 0000268f FHIRDbDAOImpl 1   Successfully retrieved FHIR objects. SQL=SELECT R.RESOURCE_ID, R.LOGICAL_RESOURCE_ID, R.VERSION_ID, R.LAST_UPDATED, R.IS_DELETED, R.DATA, LR.LOGICAL_ID FROM Observation_RESOURCES R, Observation_LOGICAL_RESOURCES LR WHERE LR.LOGICAL_ID = ? AND R.RESOURCE_ID = LR.CURRENT_RESOURCE_ID  searchArgs=[9bab5ef9-888b-4a85-bcef-304a4d258c9d] executionTime=0.620403ms
[1/28/20 0:35:07:567 UTC] 0000268f FHIRDbDAOImpl > com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl cleanup(PreparedStatement, Connection) ENTRY
[1/28/20 0:35:07:567 UTC] 0000268f FHIRDbDAOImpl > com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl cleanup(PreparedStatement, Connection) ENTRY
[1/28/20 0:35:07:568 UTC] 0000268f FHIRDbDAOImpl < com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl cleanup(PreparedStatement, Connection) RETURN
[1/28/20 0:35:07:568 UTC] 0000268f FHIRDbDAOImpl < com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl cleanup(PreparedStatement, Connection) RETURN
[1/28/20 0:35:07:568 UTC] 0000268f FHIRDbDAOImpl < com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl runQuery RETURN
[1/28/20 0:35:07:568 UTC] 0000268f ResourceDAOIm < com.ibm.fhir.persistence.jdbc.dao.impl.ResourceDAOImpl read RETURN
[1/28/20 0:35:07:568 UTC] 0000268f FHIRPersisten > com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl convertResourceDTO ENTRY
[1/28/20 0:35:07:568 UTC] 0000268f FHIRPersisten < com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl convertResourceDTO RETURN
[1/28/20 0:35:07:568 UTC] 0000268f FHIRPersisten < com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl read RETURN
[1/28/20 0:35:07:568 UTC] 0000268f FHIRTransacti 1   Committing transaction on current thread...
[1/28/20 0:35:07:568 UTC] 0000268f FHIRPersisten > com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl commit ENTRY
[1/28/20 0:35:07:569 UTC] 0000268f FHIRPersisten < com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl commit RETURN
[1/28/20 0:35:07:569 UTC] 0000268f RestAuditLogg > com.ibm.fhir.server.util.RestAuditLogger logRead ENTRY
[1/28/20 0:35:07:569 UTC] 0000268f RestAuditLogg > com.ibm.fhir.server.util.RestAuditLogger initLogEntry ENTRY
[1/28/20 0:35:07:569 UTC] 0000268f RestAuditLogg < com.ibm.fhir.server.util.RestAuditLogger initLogEntry RETURN
[1/28/20 0:35:07:569 UTC] 0000268f RestAuditLogg > com.ibm.fhir.server.util.RestAuditLogger populateAuditLogEntry ENTRY
[1/28/20 0:35:07:569 UTC] 0000268f RestAuditLogg < com.ibm.fhir.server.util.RestAuditLogger populateAuditLogEntry RETURN
[1/28/20 0:35:07:569 UTC] 0000268f RestAuditLogg < com.ibm.fhir.server.util.RestAuditLogger logRead RETURN
[1/28/20 0:35:07:569 UTC] 0000268f FHIRResource  < com.ibm.fhir.server.resources.FHIRResource doRead RETURN
[1/28/20 0:35:07:819 UTC] 0000268f FHIRResource  1   Validation warnings for input resource: dom-6: A resource should have narrative for robust management
[1/28/20 0:35:07:819 UTC] 0000268f FHIRTransacti 1   Starting transaction on current thread...
[1/28/20 0:35:07:819 UTC] 0000268f FHIRPersisten > com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl begin ENTRY
[1/28/20 0:35:07:819 UTC] 0000268f FHIRDbDAOImpl 1   Getting connection for tenantId/dsId: [tenant1/default]...
[1/28/20 0:35:07:819 UTC] 0000268f FHIRDbDAOImpl > com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl getFhirDb ENTRY
[1/28/20 0:35:07:819 UTC] 0000268f FHIRDbDAOImpl < com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl getFhirDb RETURN
[1/28/20 0:35:07:819 UTC] 0000268f FHIRDbDAOImpl 1   Got the connection for [tenant1/default]!
[1/28/20 0:35:07:819 UTC] 0000268f FHIRPersisten < com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl begin RETURN
[1/28/20 0:35:07:819 UTC] 0000268f FHIRPersisten > com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl update ENTRY
[1/28/20 0:35:07:820 UTC] 0000268f FHIRPersisten 1   Storing new FHIR Resource 'Observation/9bab5ef9-888b-4a85-bcef-304a4d258c9d', version=1
[1/28/20 0:35:07:821 UTC] 0000268f FHIRPersisten > com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl extractSearchParameters ENTRY
[1/28/20 0:35:07:825 UTC] 0000268f FHIRPersisten 1   Processing SearchParameter code: component-value-quantity, type: quantity, expression: (Observation.component.value as Quantity) | (Observation.component.value as SampledData)
[1/28/20 0:35:07:829 UTC] 0000268f FHIRPersisten 1   Extracted Parameter 'component-value-quantity' from Resource.
[1/28/20 0:35:07:830 UTC] 0000268f FHIRPersisten 1   Extracted Parameter 'component-value-quantity' from Resource.
[1/28/20 0:35:07:834 UTC] 0000268f FHIRPersisten 1   Processing SearchParameter code: _id, type: token, expression: Resource.id
[1/28/20 0:35:07:835 UTC] 0000268f FHIRPersisten 1   Extracted Parameter '_id' from Resource.
[1/28/20 0:35:07:835 UTC] 0000268f FHIRPersisten < com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl extractSearchParameters RETURN
[1/28/20 0:35:07:835 UTC] 0000268f ResourceDAOIm > com.ibm.fhir.persistence.jdbc.dao.impl.ResourceDAOImpl insert(Resource, List<ExtractedParameterValue> ENTRY
[1/28/20 0:35:07:835 UTC] 0000268f ResourceDAOIm > com.ibm.fhir.persistence.jdbc.dao.impl.ResourceDAOImpl insertToDb2 ENTRY
[1/28/20 0:35:07:835 UTC] 0000268f ResourceDAOIm > com.ibm.fhir.persistence.jdbc.dao.impl.ResourceDAOImpl readResourceTypeId ENTRY
[1/28/20 0:35:07:837 UTC] 0000268f ResourceDAOIm E   Failure storing Resource type name id: name=Observation
                                 com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: DB2 SQL Error: SQLCODE=-407, SQLSTATE=23502, SQLERRMC=TBSPACEID=-6, TABLEID=-32768, COLNO=0, DRIVER=4.26.14
    at com.ibm.db2.jcc.am.b7.a(b7.java:806)
    at com.ibm.db2.jcc.am.b7.a(b7.java:66)
    at com.ibm.db2.jcc.am.b7.a(b7.java:140)
    at com.ibm.db2.jcc.am.k4.b(k4.java:2471)
    at com.ibm.db2.jcc.am.k4.c(k4.java:2452)
    at com.ibm.db2.jcc.t4.ab.n(ab.java:914)
    at com.ibm.db2.jcc.t4.ab.f(ab.java:156)
    at com.ibm.db2.jcc.t4.p.e(p.java:81)
    at com.ibm.db2.jcc.t4.av.k(av.java:175)
    at com.ibm.db2.jcc.am.k4.ao(k4.java:2413)
    at com.ibm.db2.jcc.am.k5.a(k5.java:4686)
    at com.ibm.db2.jcc.am.CallableStatement.b(CallableStatement.java:134)
    at com.ibm.db2.jcc.am.CallableStatement.a(CallableStatement.java:103)
    at com.ibm.db2.jcc.am.CallableStatement.execute(CallableStatement.java:93)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.execute(WSJdbcPreparedStatement.java:390)
    at com.ibm.fhir.persistence.jdbc.dao.impl.ResourceDAOImpl.readResourceTypeId(ResourceDAOImpl.java:365)
    at com.ibm.fhir.persistence.jdbc.dao.impl.ResourceDAOImpl.insertToDb2(ResourceDAOImpl.java:513)
    at com.ibm.fhir.persistence.jdbc.dao.impl.ResourceDAOImpl.insert(ResourceDAOImpl.java:469)
    at com.ibm.fhir.persistence.jdbc.impl.FHIRPersistenceJDBCImpl.update(FHIRPersistenceJDBCImpl.java:375)
    at com.ibm.fhir.server.resources.FHIRResource.doPatchOrUpdate(FHIRResource.java:1509)
    at com.ibm.fhir.server.resources.FHIRResource.doUpdate(FHIRResource.java:1334)
    at com.ibm.fhir.server.resources.FHIRResource.update(FHIRResource.java:310)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.ibm.ws.jaxrs20.server.LibertyJaxRsServerFactoryBean.performInvocation(LibertyJaxRsServerFactoryBean.java:656)
    at com.ibm.ws.jaxrs20.server.LibertyJaxRsInvoker.performInvocation(LibertyJaxRsInvoker.java:160)
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
    at com.ibm.ws.jaxrs20.server.LibertyJaxRsInvoker.invoke(LibertyJaxRsInvoker.java:273)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:205)
    at com.ibm.ws.jaxrs20.server.LibertyJaxRsInvoker.invoke(LibertyJaxRsInvoker.java:444)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:111)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:61)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:99)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:124)
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:274)
    at com.ibm.ws.jaxrs20.endpoint.AbstractJaxRsWebEndpoint.invoke(AbstractJaxRsWebEndpoint.java:134)
    at com.ibm.websphere.jaxrs.server.IBMRestServlet.handleRequest(IBMRestServlet.java:146)
    at com.ibm.websphere.jaxrs.server.IBMRestServlet.doPut(IBMRestServlet.java:136)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    at com.ibm.websphere.jaxrs.server.IBMRestServlet.service(IBMRestServlet.java:96)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1230)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:729)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:426)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:182)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:93)
    at com.ibm.fhir.server.filter.rest.FHIRRestServletFilter.doFilter(FHIRRestServletFilter.java:151)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:201)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:90)
    at com.ibm.fhir.server.filter.rest.FHIRRestAuthorizationServletFilter.doFilter(FHIRRestAuthorizationServletFilter.java:86)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:201)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:90)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:1001)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1139)
    at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:5017)
    at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.handleRequest(DynamicVirtualHost.java:314)
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:1007)
    at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.run(DynamicVirtualHost.java:279)
    at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink$TaskWrapper.run(HttpDispatcherLink.java:1134)
    at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink.wrapHandlerAndExecute(HttpDispatcherLink.java:415)
    at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink.ready(HttpDispatcherLink.java:374)
    at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:548)
    at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleNewRequest(HttpInboundLink.java:482)
    at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.processRequest(HttpInboundLink.java:347)
    at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.ready(HttpInboundLink.java:318)
    at com.ibm.ws.channel.ssl.internal.SSLConnectionLink.determineNextChannel(SSLConnectionLink.java:1077)
    at com.ibm.ws.channel.ssl.internal.SSLConnectionLink$MyReadCompletedCallback.complete(SSLConnectionLink.java:656)
    at com.ibm.ws.channel.ssl.internal.SSLReadServiceContext$SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1803)
    at com.ibm.ws.tcpchannel.internal.WorkQueueManager.requestComplete(WorkQueueManager.java:503)
    at com.ibm.ws.tcpchannel.internal.WorkQueueManager.attemptIO(WorkQueueManager.java:573)
    at com.ibm.ws.tcpchannel.internal.WorkQueueManager.workerRun(WorkQueueManager.java:954)
    at com.ibm.ws.tcpchannel.internal.WorkQueueManager$Worker.run(WorkQueueManager.java:1043)
    at com.ibm.ws.threading.internal.ExecutorServiceImpl$RunnableWrapper.run(ExecutorServiceImpl.java:239)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:819)

To Reproduce
Steps to reproduce the behavior:

  1. Go to MultiDataStoreTest.testCreateObservation() and change study1 to default
  2. Execute build/pre-integration-test-docker.sh to setup up the fhir+db2 compose env
  3. Wait for it to start and execute the test

Expected behavior
The tenant1 requests should fallback

Additional context
Should we allow this kind of multi-database setup? What datasource should we use for the "admin" schema in these cases?
Can we use that one for the resource name cache so we don't get these conflicts?
If not, can we make the resource name cache tenant-specific?
Will our other caches have the same issue?

@lmsurpre
Copy link
Member Author

Assuming I'm right:
We discussed this as a team and decided that we CANNOT allow the server to fall back to the default config to find tenants.

What we're losing: in past you could configure a single "default" datastore in the "default" tenant and then serve multiple different tenants (each with their own config) from that one datastore.
After this change, EACH tenant will need to create its own tenant in their own config.

@lmsurpre lmsurpre added this to the Sprint 8 milestone Jan 28, 2020
@lmsurpre lmsurpre modified the milestones: Sprint 8, Sprint 9 Feb 18, 2020
@lmsurpre lmsurpre modified the milestones: Sprint 9, Sprint 10 Mar 9, 2020
@lmsurpre lmsurpre modified the milestones: Sprint 10, Sprint 11 Mar 30, 2020
@lmsurpre lmsurpre modified the milestones: Sprint 11, Sprint 12 Apr 21, 2020
@lmsurpre lmsurpre modified the milestones: Sprint 12, Sprint 13 May 20, 2020
@punktilious
Copy link
Collaborator

I think the above should read: "After this change, EACH tenant will need to create its own datasource in their own config."

I agree - it makes it more explicit, and tenants should be completely isolated.

@lmsurpre lmsurpre modified the milestones: Sprint 13, Sprint 14 Jun 19, 2020
@punktilious punktilious self-assigned this Jun 19, 2020
@lmsurpre lmsurpre modified the milestones: Sprint 14, Sprint 15 Jul 22, 2020
@lmsurpre lmsurpre modified the milestones: Sprint 15, Sprint 16 Aug 5, 2020
punktilious added a commit that referenced this issue Aug 19, 2020
… default

Signed-off-by: Robin Arnold <robin.arnold23@ibm.com>
punktilious added a commit that referenced this issue Aug 19, 2020
issue #639 datasources must come from tenant config, not fall back to…
@lmsurpre
Copy link
Member Author

The tests seem to adequately cover this change

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants