]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/QueryControlImpl.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.db.procore / src / fi / vtt / simantics / procore / internal / QueryControlImpl.java
1 package fi.vtt.simantics.procore.internal;
2
3 import java.util.Collection;
4
5 import org.simantics.db.AsyncReadGraph;
6 import org.simantics.db.ReadGraph;
7 import org.simantics.db.Resource;
8 import org.simantics.db.WriteGraph;
9 import org.simantics.db.common.request.WriteRequest;
10 import org.simantics.db.exception.DatabaseException;
11 import org.simantics.db.impl.ResourceImpl;
12 import org.simantics.db.impl.graph.ReadGraphImpl;
13 import org.simantics.db.procedure.AsyncContextMultiProcedure;
14 import org.simantics.db.procedure.AsyncMultiProcedure;
15 import org.simantics.db.request.ExternalRead;
16 import org.simantics.db.request.Read;
17 import org.simantics.db.service.QueryControl;
18 import org.simantics.utils.DataContainer;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
21
22 public class QueryControlImpl implements QueryControl {
23
24         private static final Logger LOGGER = LoggerFactory.getLogger(QueryControlImpl.class);
25
26         final private SessionImplSocket session;
27         
28         QueryControlImpl(SessionImplSocket session) {
29                 this.session = session;
30         }
31
32         @Override
33         public int getAmountOfQueryThreads() {
34                 return session.getAmountOfQueryThreads();
35         }
36         
37     @Override
38     public int getGraphThread(AsyncReadGraph graph) {
39         return 0;
40     }
41
42     @Override
43     public int flush() {
44         final DataContainer<Integer> result = new DataContainer<Integer>(); 
45         try {
46             session.syncRequest(new WriteRequest() {
47
48                 @Override
49                 public void perform(WriteGraph graph) throws DatabaseException {
50                     result.set(session.queryProvider2.clean());
51                 }
52                 
53             });
54         } catch (DatabaseException e) {
55             LOGGER.error("query flush failed", e);
56         }
57         return result.get();
58     }
59
60     @Override
61     public int flush(ReadGraph graph) {
62         return session.queryProvider2.clean();
63     }
64     
65     @Override
66     public int count() {
67         return session.queryProvider2.querySize();
68     }
69     
70     @Override
71     public void gc(ReadGraph graph, int allowedTimeInMs) {
72         // 20% young target
73         session.queryProvider2.gc(20, allowedTimeInMs);
74     }
75     
76     @Override
77     public void gc(final Collection<ExternalRead<?>> requests) {
78         try {
79                 session.syncRequest(new WriteRequest() {
80                 @Override
81                 public void perform(WriteGraph graph) throws DatabaseException {
82                     gc(graph, requests);
83                 }
84             });
85         } catch (DatabaseException e) {
86             LOGGER.error("query gc failed", e);
87         }
88     }
89
90     @Override
91     public void gc(WriteGraph graph, final Collection<ExternalRead<?>> requests) {
92         if (graph == null)
93             throw new IllegalArgumentException("null WriteGraph");
94         if (requests == null)
95             throw new IllegalArgumentException("null requests");
96         session.queryProvider2.clean(requests);
97     }
98     
99         @Override
100         public boolean scheduleByCluster(AsyncReadGraph graph, final Resource resource, final AsyncMultiProcedure<Resource> procedure) {
101                 final ReadGraphImpl impl = (ReadGraphImpl)graph;
102                 ResourceImpl res = (ResourceImpl)resource;
103                 int targetThread = ((res.id >>> 16) & session.queryProvider2.THREAD_MASK);
104                 if(0 == targetThread) return true;
105                 //System.err.println("scheduleByCluster[" + res.id + "|" + (res.id>>>16) + "] " + impl.callerThread + " -> " + targetThread);
106 //              impl.state.barrier.inc();
107 //              
108 //              AsyncReadGraph targetGraph = impl.newAsync();
109                 procedure.execute(impl, resource);
110 //              impl.state.barrier.dec();
111                 
112                 return false;
113                 
114         }
115
116         @Override
117         public <C> boolean scheduleByCluster(AsyncReadGraph graph, final Resource resource, final C context, final AsyncContextMultiProcedure<C, Resource> procedure) {
118                 final ReadGraphImpl impl = (ReadGraphImpl)graph;
119                 ResourceImpl res = (ResourceImpl)resource;
120                 int targetThread = ((res.id >>> 16) & session.queryProvider2.THREAD_MASK);
121                 if(0 == targetThread) return true;
122                 //System.err.println("scheduleByCluster[" + res.id + "|" + (res.id>>>16) + "] " + impl.callerThread + " -> " + targetThread);
123 //              impl.state.barrier.inc();
124 //              
125 //              AsyncReadGraph targetGraph = impl.newAsync();
126                 procedure.execute(impl, context, resource);
127 //              impl.state.barrier.dec();
128                 
129                 return false;
130         }
131
132         @Override
133         public void schedule(AsyncReadGraph graph, int targetThread, final ControlProcedure procedure) {
134                 final ReadGraphImpl impl = (ReadGraphImpl)graph;
135
136 //              impl.state.barrier.inc();
137 //
138 //              AsyncReadGraph targetGraph = impl.newAsync();
139                 procedure.execute(impl);
140 //              impl.state.barrier.dec();
141
142         }
143         
144         @Override
145         public ReadGraph getIndependentGraph(ReadGraph graph) {
146                 ReadGraphImpl impl = (ReadGraphImpl)graph;
147                 return impl.withParent(null, null, false);
148         }
149         
150     @Override
151     public <T> T syncRequestIndependent(ReadGraph graph, Read<T> request) throws DatabaseException {
152         ReadGraphImpl independent = ((ReadGraphImpl)graph).withParent(null, null, false);
153         independent.asyncBarrier.inc();
154         try {
155             return independent.syncRequest(request);
156         } finally {
157             independent.asyncBarrier.dec();
158         }
159     }
160
161         @Override
162         public boolean hasParentRequest(ReadGraph graph) {
163                 ReadGraphImpl impl = (ReadGraphImpl)graph;
164                 return impl.parent != null;
165         }
166         
167         @Override
168         public boolean resume(ReadGraph graph) {
169                 ReadGraphImpl impl = (ReadGraphImpl)graph;
170                 return impl.processor.querySupport.resume(impl);
171         }
172
173 }