rpathsync / rmake (http://wiki.rpath.com/wiki/rMake)

rMake facilitates building packages consistently across computers with dissimilar environments.

Clone this repository (size: 1.6 MB): HTTPS / SSH
$ hg clone http://bitbucket.org/rpathsync/rmake/
commit 1297: dffd99e76b4f
parent 1296: e23e3a6615f7
branch: default
Initial round of fixes for rmakedb on postgres.
Michael Tharp
2 months ago

Changed (Δ465 bytes):

raw changeset »

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
                        timeStamp)
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
                            sessionId)
55
                cu.binary(sessionId))
56
56
        if result.fetchall():
57
57
            match = True
58
58
            cu.execute('UPDATE AuthCache SET timeStamp=? WHERE sessionId=?',
59
                        time.time() + CACHE_TIMEOUT, sessionId)
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.cursor().execute('BEGIN IMMEDIATE')
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=0 ORDER BY logId LIMIT ? OFFSET ?
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 MAX(SUM(slots),1)
120
                        """SELECT SUM(slots)
121
121
                           FROM Nodes WHERE active=1""").fetchone()[0]
122
        return totalSlots
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          INTEGER PRIMARY KEY AUTOINCREMENT,
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
            key         STRING NOT NULL,
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
            key         STRING NOT NULL,
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
            context        STRING NOT NULL DEFAULT '',
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
            flavor      STRING,
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 VARCHAR NOT NULL,
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    VARCHAR PRIMARY KEY NOT NULL,
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      VARCHAR NOT NULL UNIQUE,
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
                        "STRING NOT NULL DEFAULT ''")
455
                        "TEXT NOT NULL DEFAULT ''")
450
456
        self._addColumn('JobConfig',  "context",
451
                        "STRING NOT NULL DEFAULT ''")
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
                        "STRING NOT NULL DEFAULT ''")
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      STRING NOT NULL DEFAULT 'build'")
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 (?,"ALL")
76
                       WHERE jobId IN (0,?) AND event IN (?,'ALL')
77
77
                  '''
78
        subCmd = cmd + 'AND subEvent IN (?, "ALL")'
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(subEvent)
84
                params.append(str(subEvent))
85
85
            else:
86
86
                thisCmd = cmd
87
87

Up to file-list rmake/server/server.py:

@@ -591,7 +591,6 @@ class rMakeServer(apirpc.XMLApiServer):
591
591
        if close:
592
592
            self._close()
593
593
        else:
594
            self.db.close()
595
594
            self.db.reopen()
596
595
        return pid
597
596