rpathsync / rmake (http://wiki.rpath.com/wiki/rMake)
rMake facilitates building packages consistently across computers with dissimilar environments.
| commit 1297: | dffd99e76b4f |
| parent 1296: | e23e3a6615f7 |
| branch: | default |
2 months ago
Changed (Δ465 bytes):
rmake/db/authcache.py (5 lines added, 5 lines removed)
rmake/db/database.py (4 lines added, 2 lines removed)
rmake/db/jobstore.py (5 lines added, 5 lines removed)
rmake/db/nodestore.py (2 lines added, 2 lines removed)
rmake/db/schema.py (81 lines added, 75 lines removed)
rmake/db/subscriber.py (3 lines added, 3 lines removed)
rmake/server/server.py (0 lines added, 1 lines removed)
Up to file-list rmake/db/authcache.py:
| … | … | @@ -20,9 +20,9 @@ class AuthenticationCache(object): |
20 |
20 |
for x in range(3): |
21 |
21 |
try: |
22 |
22 |
cu.execute("DELETE FROM AuthCache WHERE sessionId = ?", |
23 |
sessionId) |
|
24 |
cu.execute("INSERT INTO AuthCache VALUES (?, ?)", sessionId, |
|
25 |
|
|
23 |
cu.binary(sessionId)) |
|
24 |
cu.execute("INSERT INTO AuthCache (sessionid, timestamp) " |
|
25 |
"VALUES (?, ?)", cu.binary(sessionId), timeStamp) |
|
26 |
26 |
except (DatabaseLocked, ColumnNotUnique): |
27 |
27 |
# Race condition -- someone inserted a conflicting value |
28 |
28 |
# between our statements. Try again. |
| … | … | @@ -52,10 +52,10 @@ class AuthenticationCache(object): |
52 |
52 |
self._deleteOld(cu) |
53 |
53 |
match = False |
54 |
54 |
result = cu.execute('SELECT timeStamp FROM AuthCache WHERE sessionId=?', |
55 |
|
|
55 |
cu.binary(sessionId)) |
|
56 |
56 |
if result.fetchall(): |
57 |
57 |
match = True |
58 |
58 |
cu.execute('UPDATE AuthCache SET timeStamp=? WHERE sessionId=?', |
59 |
|
|
59 |
time.time() + CACHE_TIMEOUT, cu.binary(sessionId)) |
|
60 |
60 |
self.db.commit() |
61 |
61 |
return match |
Up to file-list rmake/db/database.py:
| … | … | @@ -42,7 +42,7 @@ class DBInterface(object): |
42 |
42 |
Commits after running a function |
43 |
43 |
""" |
44 |
44 |
self._holdCommits = True |
45 |
self. |
|
45 |
self.db.transaction() |
|
46 |
46 |
try: |
47 |
47 |
rv = fn(*args, **kw) |
48 |
48 |
self._holdCommits = False |
| … | … | @@ -66,10 +66,12 @@ class DBInterface(object): |
66 |
66 |
return self.db.inTransaction() |
67 |
67 |
|
68 |
68 |
def reopen(self): |
69 |
if self.db: |
|
70 |
self.db.close_fork() |
|
69 |
71 |
self.db = self.open() |
70 |
72 |
|
71 |
73 |
def close(self): |
72 |
self.db.close |
|
74 |
self.db.close_fork() |
|
73 |
75 |
self.db = None |
74 |
76 |
|
75 |
77 |
class Database(DBInterface): |
Up to file-list rmake/db/jobstore.py:
| … | … | @@ -341,7 +341,7 @@ class JobStore(object): |
341 |
341 |
ret = [] |
342 |
342 |
cu.execute(""" |
343 |
343 |
SELECT changed, message, args FROM StateLogs |
344 |
WHERE jobId = ? AND troveId |
|
344 |
WHERE jobId = ? AND troveId IS NULL ORDER BY logId LIMIT ? OFFSET ? |
|
345 |
345 |
""", (jobId, 100, mark)) |
346 |
346 |
return cu.fetchall() |
347 |
347 |
|
| … | … | @@ -378,8 +378,8 @@ class JobStore(object): |
378 |
378 |
|
379 |
379 |
def addJob(self, job): |
380 |
380 |
cu = self.db.cursor() |
381 |
cu.execute("INSERT INTO Jobs (jobId, uuid, state, owner) " |
|
382 |
"VALUES (NULL, ?, ?, ?)", |
|
381 |
cu.execute("INSERT INTO Jobs (uuid, state, owner) " |
|
382 |
"VALUES ( ?, ?, ? )", |
|
383 |
383 |
job.uuid, job.state, job.owner) |
384 |
384 |
jobId = cu.lastrowid |
385 |
385 |
for trove in job.iterTroves(): |
| … | … | @@ -556,8 +556,8 @@ class JobStore(object): |
556 |
556 |
|
557 |
557 |
def updateJobLog(self, job, message): |
558 |
558 |
cu = self.db.cursor() |
559 |
cu.execute("INSERT INTO StateLogs (jobId, troveId, message, args)" |
|
560 |
" VALUES (?, 0, ?, ?)", |
|
559 |
cu.execute("INSERT INTO StateLogs (jobId, message, args)" |
|
560 |
" VALUES (?, ?, ?)", |
|
561 |
561 |
(job.jobId, message, '')) |
562 |
562 |
return True |
563 |
563 |
Up to file-list rmake/db/nodestore.py:
| … | … | @@ -117,9 +117,9 @@ class NodeStore(object): |
117 |
117 |
def getSlotCount(self): |
118 |
118 |
cu = self.db.cursor() |
119 |
119 |
totalSlots = cu.execute( |
120 |
"""SELECT |
|
120 |
"""SELECT SUM(slots) |
|
121 |
121 |
FROM Nodes WHERE active=1""").fetchone()[0] |
122 |
return |
|
122 |
return max(totalSlots, 1) |
|
123 |
123 |
|
124 |
124 |
|
125 |
125 |
def getOrCreateChrootId(self, trove): |
Up to file-list rmake/db/schema.py:
| … | … | @@ -16,17 +16,17 @@ def createJobs(db): |
16 |
16 |
if "Jobs" not in db.tables: |
17 |
17 |
cu.execute(""" |
18 |
18 |
CREATE TABLE Jobs ( |
19 |
jobId |
|
19 |
jobId %(PRIMARYKEY)s, |
|
20 |
20 |
pid INTEGER NOT NULL DEFAULT 0, |
21 |
21 |
uuid CHAR(32) NOT NULL DEFAULT '', |
22 |
22 |
state INTEGER NOT NULL DEFAULT 0, |
23 |
status STRING NOT NULL DEFAULT 'JobID entry created', |
|
24 |
owner STRING NOT NULL DEFAULT '', |
|
25 |
start STRING NOT NULL DEFAULT '0', |
|
26 |
finish STRING NOT NULL DEFAULT '0', |
|
27 |
failureReason STRING NOT NULL DEFAULT '', |
|
28 |
failureData STRING NOT NULL DEFAULT '' |
|
29 |
|
|
23 |
status TEXT NOT NULL DEFAULT 'JobID entry created', |
|
24 |
owner TEXT NOT NULL DEFAULT '', |
|
25 |
start TEXT NOT NULL DEFAULT '0', |
|
26 |
finish TEXT NOT NULL DEFAULT '0', |
|
27 |
failureReason TEXT NOT NULL DEFAULT '', |
|
28 |
failureData TEXT NOT NULL DEFAULT '' |
|
29 |
)""" % db.keywords) |
|
30 |
30 |
db.tables["Jobs"] = [] |
31 |
31 |
commit = True |
32 |
32 |
if commit: |
| … | … | @@ -39,12 +39,13 @@ def createJobConfig(db): |
39 |
39 |
if "JobConfig" not in db.tables: |
40 |
40 |
cu.execute(""" |
41 |
41 |
CREATE TABLE JobConfig ( |
42 |
jobId INTEGER NOT NULL, |
|
43 |
context STRING NOT NULL DEFAULT "", |
|
44 |
|
|
42 |
jobId INTEGER NOT NULL |
|
43 |
REFERENCES Jobs ON DELETE CASCADE, |
|
44 |
context TEXT NOT NULL DEFAULT '', |
|
45 |
key TEXT NOT NULL, |
|
45 |
46 |
ord INTEGER NOT NULL, |
46 |
value STRING NOT NULL |
|
47 |
)""") |
|
47 |
value TEXT NOT NULL |
|
48 |
)""" % db.keywords) |
|
48 |
49 |
db.tables["JobConfig"] = [] |
49 |
50 |
if db.createIndex("JobConfig", "JobConfigIdx", "jobId", |
50 |
51 |
unique = False): |
| … | … | @@ -65,12 +66,14 @@ def createTroveSettings(db): |
65 |
66 |
if "TroveSettings" not in db.tables: |
66 |
67 |
cu.execute(""" |
67 |
68 |
CREATE TABLE TroveSettings ( |
68 |
jobId INTEGER NOT NULL, |
|
69 |
troveId INTEGER NOT NULL, |
|
70 |
|
|
69 |
jobId INTEGER NOT NULL |
|
70 |
REFERENCES Jobs ON DELETE CASCADE, |
|
71 |
troveId INTEGER NOT NULL |
|
72 |
REFERENCES BuildTroves ON DELETE CASCADE, |
|
73 |
key TEXT NOT NULL, |
|
71 |
74 |
ord INTEGER NOT NULL, |
72 |
value STRING NOT NULL |
|
73 |
)""") |
|
75 |
value TEXT NOT NULL |
|
76 |
)""" % db.keywords) |
|
74 |
77 |
db.tables["TroveSettings"] = [] |
75 |
78 |
if db.createIndex("TroveSettings", "TroveSettingsIdx", "jobId", |
76 |
79 |
unique = False): |
| … | … | @@ -89,10 +92,10 @@ def createSubscriber(db): |
89 |
92 |
if "Subscriber" not in db.tables: |
90 |
93 |
cu.execute(""" |
91 |
94 |
CREATE TABLE Subscriber( |
92 |
subscriberId INTEGER PRIMARY KEY AUTOINCREMENT, |
|
93 |
jobId INTEGER NOT NULL, |
|
94 |
uri STRING NOT NULL |
|
95 |
)""") |
|
95 |
subscriberId %(PRIMARYKEY)s, |
|
96 |
jobId INTEGER, |
|
97 |
uri TEXT NOT NULL |
|
98 |
)""" % db.keywords) |
|
96 |
99 |
db.tables["Subscriber"] = [] |
97 |
100 |
commit = True |
98 |
101 |
|
| … | … | @@ -103,9 +106,9 @@ def createSubscriber(db): |
103 |
106 |
cu.execute(""" |
104 |
107 |
CREATE TABLE SubscriberEvents ( |
105 |
108 |
subscriberId INTEGER NOT NULL, |
106 |
event STRING NOT NULL, |
|
107 |
subevent STRING NOT NULL |
|
108 |
|
|
109 |
event TEXT NOT NULL, |
|
110 |
subevent TEXT NOT NULL |
|
111 |
)""" % db.keywords) |
|
109 |
112 |
db.tables["SubscriberEvents"] = [] |
110 |
113 |
commit = True |
111 |
114 |
|
| … | … | @@ -122,9 +125,9 @@ def createSubscriber(db): |
122 |
125 |
if "SubscriberData" not in db.tables: |
123 |
126 |
cu.execute(""" |
124 |
127 |
CREATE TABLE SubscriberData ( |
125 |
subscriberId STRING NOT NULL, |
|
126 |
data STRING NOT NULL |
|
127 |
|
|
128 |
subscriberId integer NOT NULL, |
|
129 |
data TEXT NOT NULL |
|
130 |
)""" % db.keywords) |
|
128 |
131 |
db.tables["SubscriberData"] = [] |
129 |
132 |
commit = True |
130 |
133 |
|
| … | … | @@ -145,28 +148,29 @@ def createBuildTroves(db): |
145 |
148 |
# XXX: will normalize later |
146 |
149 |
cu.execute(""" |
147 |
150 |
CREATE TABLE BuildTroves ( |
148 |
troveId INTEGER PRIMARY KEY AUTOINCREMENT, |
|
149 |
jobId INTEGER NOT NULL, |
|
151 |
troveId %(PRIMARYKEY)s, |
|
152 |
jobId INTEGER NOT NULL |
|
153 |
REFERENCES Jobs ON DELETE CASCADE, |
|
150 |
154 |
pid INTEGER NOT NULL DEFAULT 0, |
151 |
troveName STRING NOT NULL, |
|
152 |
troveType STRING NOT NULL DEFAULT 'build', |
|
153 |
version STRING NOT NULL, |
|
154 |
flavor STRING NOT NULL, |
|
155 |
|
|
155 |
troveName TEXT NOT NULL, |
|
156 |
troveType TEXT NOT NULL DEFAULT 'build', |
|
157 |
version TEXT NOT NULL, |
|
158 |
flavor TEXT NOT NULL, |
|
159 |
context TEXT NOT NULL DEFAULT '', |
|
156 |
160 |
state INTEGER NOT NULL, |
157 |
status STRING NOT NULL DEFAULT '', |
|
158 |
failureReason STRING NOT NULL DEFAULT '', |
|
159 |
failureData STRING NOT NULL DEFAULT '', |
|
160 |
start STRING NOT NULL DEFAULT '0', |
|
161 |
finish STRING NOT NULL DEFAULT '0', |
|
162 |
logPath STRING NOT NULL DEFAULT '', |
|
161 |
status TEXT NOT NULL DEFAULT '', |
|
162 |
failureReason TEXT NOT NULL DEFAULT '', |
|
163 |
failureData TEXT NOT NULL DEFAULT '', |
|
164 |
start TEXT NOT NULL DEFAULT '0', |
|
165 |
finish TEXT NOT NULL DEFAULT '0', |
|
166 |
logPath TEXT NOT NULL DEFAULT '', |
|
163 |
167 |
recipeType INTEGER NOT NULL DEFAULT 1, |
164 |
168 |
chrootId INTEGER NOT NULL DEFAULT 0, |
165 |
169 |
buildType INTEGER NOT NULL DEFAULT 0, |
166 |
170 |
CONSTRAINT BuildTroves_jobId_fk |
167 |
171 |
FOREIGN KEY(jobId) REFERENCES Jobs(jobId) |
168 |
172 |
ON DELETE CASCADE ON UPDATE RESTRICT |
169 |
)""" |
|
173 |
)""" % db.keywords) |
|
170 |
174 |
db.tables["BuildTroves"] = [] |
171 |
175 |
commit = True |
172 |
176 |
if db.createIndex("BuildTroves", "BuildTrovesIdx", |
| … | … | @@ -199,13 +203,13 @@ def createBinaryTroves(db): |
199 |
203 |
cu.execute(""" |
200 |
204 |
CREATE TABLE BinaryTroves ( |
201 |
205 |
troveId INTEGER NOT NULL, |
202 |
troveName STRING, |
|
203 |
version STRING, |
|
204 |
|
|
206 |
troveName TEXT, |
|
207 |
version TEXT, |
|
208 |
flavor TEXT, |
|
205 |
209 |
CONSTRAINT BinaryTroves_jobId_fk |
206 |
210 |
FOREIGN KEY(troveId) REFERENCES BuildTroves(troveId) |
207 |
211 |
ON DELETE CASCADE ON UPDATE RESTRICT |
208 |
)""" |
|
212 |
)""" % db.keywords) |
|
209 |
213 |
db.tables["BinaryTroves"] = [] |
210 |
214 |
commit = True |
211 |
215 |
if db.createIndex("BinaryTroves", "BinaryTrovesIdx", |
| … | … | @@ -219,18 +223,18 @@ def createStateLogs(db): |
219 |
223 |
cu = db.cursor() |
220 |
224 |
commit = False |
221 |
225 |
if "StateLogs" not in db.tables: |
226 |
# NB: troveId NULL means logs are for a job |
|
222 |
227 |
cu.execute(""" |
223 |
228 |
CREATE TABLE StateLogs ( |
224 |
logId INTEGER PRIMARY KEY AUTOINCREMENT, |
|
225 |
jobId INTEGER NOT NULL, |
|
226 |
troveId INTEGER NOT NULL, |
|
227 |
message STRING NOT NULL, |
|
228 |
args STRING NOT NULL DEFAULT '', |
|
229 |
changed STRING NOT NULL DEFAULT CURRENT_TIMESTAMP, |
|
230 |
CONSTRAINT StateLogsJob_fk |
|
231 |
FOREIGN KEY(jobId) REFERENCES Jobs(jobId) |
|
232 |
ON DELETE CASCADE ON UPDATE RESTRICT |
|
233 |
)""") |
|
229 |
logId %(PRIMARYKEY)s, |
|
230 |
jobId INTEGER NOT NULL |
|
231 |
REFERENCES Jobs ON DELETE CASCADE, |
|
232 |
troveId INTEGER |
|
233 |
REFERENCES BuildTroves ON DELETE CASCADE, |
|
234 |
message TEXT NOT NULL, |
|
235 |
args TEXT NOT NULL DEFAULT '', |
|
236 |
changed TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP |
|
237 |
)""" % db.keywords) |
|
234 |
238 |
db.tables["StateLogs"] = [] |
235 |
239 |
commit = True |
236 |
240 |
if db.createIndex("StateLogs", "StateLogsJobTroveId", "jobId,troveId"): |
| … | … | @@ -247,7 +251,8 @@ def createJobQueue(db): |
247 |
251 |
cu.execute(""" |
248 |
252 |
CREATE TABLE JobQueue ( |
249 |
253 |
jobId INTEGER |
250 |
|
|
254 |
REFERENCES Jobs ON DELETE CASCADE |
|
255 |
)""" % db.keywords) |
|
251 |
256 |
db.tables["JobQueue"] = [] |
252 |
257 |
commit = True |
253 |
258 |
if commit: |
| … | … | @@ -260,12 +265,13 @@ def createChroots(db): |
260 |
265 |
if "Chroots" not in db.tables: |
261 |
266 |
cu.execute(""" |
262 |
267 |
CREATE TABLE Chroots ( |
263 |
chrootId INTEGER PRIMARY KEY AUTOINCREMENT, |
|
264 |
nodeName VARCHAR, |
|
265 |
path VARCHAR, |
|
266 |
troveId INTEGER NOT NULL, |
|
268 |
chrootId %(PRIMARYKEY)s, |
|
269 |
nodeName TEXT, |
|
270 |
path TEXT, |
|
271 |
troveId INTEGER NOT NULL |
|
272 |
REFERENCES BuildTroves ON DELETE CASCADE, |
|
267 |
273 |
active INTEGER NOT NULL |
268 |
)""" |
|
274 |
)""" % db.keywords) |
|
269 |
275 |
db.tables["Chroots"] = [] |
270 |
276 |
commit = True |
271 |
277 |
if db.createIndex("Chroots", "ChrootdsIdx", "troveId"): |
| … | … | @@ -280,12 +286,12 @@ def createNodes(db): |
280 |
286 |
if "Nodes" not in db.tables: |
281 |
287 |
cu.execute(""" |
282 |
288 |
CREATE TABLE Nodes ( |
283 |
nodeName VARCHAR PRIMARY KEY NOT NULL, |
|
284 |
host VARCHAR NOT NULL, |
|
289 |
nodeName TEXT PRIMARY KEY NOT NULL, |
|
290 |
host TEXT NOT NULL, |
|
285 |
291 |
slots INTEGER NOT NULL, |
286 |
buildFlavors |
|
292 |
buildFlavors TEXT NOT NULL, |
|
287 |
293 |
active INTEGER NOT NULL DEFAULT 0 |
288 |
)""" |
|
294 |
)""" % db.keywords) |
|
289 |
295 |
db.tables["Nodes"] = [] |
290 |
296 |
commit = True |
291 |
297 |
if commit: |
| … | … | @@ -298,9 +304,9 @@ def createAuthCache(db): |
298 |
304 |
if "AuthCache" not in db.tables: |
299 |
305 |
cu.execute(""" |
300 |
306 |
CREATE TABLE AuthCache ( |
301 |
sessionId |
|
307 |
sessionId %(BINARY20)s PRIMARY KEY NOT NULL, |
|
302 |
308 |
timeStamp FLOAT NOT NULL |
303 |
)""" |
|
309 |
)""" % db.keywords) |
|
304 |
310 |
db.tables["AuthCache"] = [] |
305 |
311 |
commit = True |
306 |
312 |
if commit: |
| … | … | @@ -313,9 +319,9 @@ def createPluginVersionTable(db): |
313 |
319 |
if "PluginVersion" not in db.tables: |
314 |
320 |
cu.execute(""" |
315 |
321 |
CREATE TABLE PluginVersion ( |
316 |
plugin |
|
322 |
plugin TEXT NOT NULL UNIQUE, |
|
317 |
323 |
version INTEGER |
318 |
)""" |
|
324 |
)""" % db.keywords) |
|
319 |
325 |
db.tables["PluginVersion"] = [] |
320 |
326 |
commit = True |
321 |
327 |
if commit: |
| … | … | @@ -395,8 +401,8 @@ class SchemaManager(AbstractSchemaManage |
395 |
401 |
db = self.db |
396 |
402 |
createJobs(db) |
397 |
403 |
createJobConfig(db) |
404 |
createBuildTroves(db) |
|
398 |
405 |
createTroveSettings(db) |
399 |
createBuildTroves(db) |
|
400 |
406 |
createBinaryTroves(db) |
401 |
407 |
createStateLogs(db) |
402 |
408 |
createSubscriber(db) |
| … | … | @@ -446,9 +452,9 @@ class Migrator(AbstractMigrator): |
446 |
452 |
|
447 |
453 |
def migrateFrom6(self): |
448 |
454 |
self._addColumn('BuildTroves', "context", |
449 |
" |
|
455 |
"TEXT NOT NULL DEFAULT ''") |
|
450 |
456 |
self._addColumn('JobConfig', "context", |
451 |
" |
|
457 |
"TEXT NOT NULL DEFAULT ''") |
|
452 |
458 |
self._addColumn('BuildTroves', "buildType", |
453 |
459 |
"INTEGER NOT NULL DEFAULT 0") |
454 |
460 |
self.cu.execute("DROP INDEX BuildTrovesIdx") # this idx is no longer |
| … | … | @@ -468,7 +474,7 @@ class Migrator(AbstractMigrator): |
468 |
474 |
|
469 |
475 |
def migrateFrom9(self): |
470 |
476 |
self._addColumn("Jobs", "owner", |
471 |
" |
|
477 |
"TEXT NOT NULL DEFAULT ''") |
|
472 |
478 |
return 10 |
473 |
479 |
|
474 |
480 |
def migrateFrom10(self): |
| … | … | @@ -478,7 +484,7 @@ class Migrator(AbstractMigrator): |
478 |
484 |
return 11 |
479 |
485 |
createTroveSettings(self.db) |
480 |
486 |
self._addColumn("BuildTroves", "troveType", |
481 |
"troveType |
|
487 |
"troveType TEXT NOT NULL DEFAULT 'build'") |
|
482 |
488 |
return 11 |
483 |
489 |
|
484 |
490 |
class PluginSchemaManager(AbstractSchemaManager): |
Up to file-list rmake/db/subscriber.py:
| … | … | @@ -73,15 +73,15 @@ class SubscriberData(object): |
73 |
73 |
FROM Subscriber |
74 |
74 |
JOIN SubscriberEvents USING(subscriberId) |
75 |
75 |
JOIN SubscriberData USING(subscriberId) |
76 |
WHERE jobId IN (0,?) AND event IN (?, |
|
76 |
WHERE jobId IN (0,?) AND event IN (?,'ALL') |
|
77 |
77 |
''' |
78 |
subCmd = cmd + |
|
78 |
subCmd = cmd + "AND subEvent IN (?, 'ALL')" |
|
79 |
79 |
subscriberCache = {} |
80 |
80 |
for (event, subEvent), data in eventList: |
81 |
81 |
params = [jobId, event] |
82 |
82 |
if subEvent: |
83 |
83 |
thisCmd = subCmd |
84 |
params.append(s |
|
84 |
params.append(str(subEvent)) |
|
85 |
85 |
else: |
86 |
86 |
thisCmd = cmd |
87 |
87 |
