diff --git a/castor/db/oracleCommon.schema.sql b/castor/db/oracleCommon.schema.sql index 9a21758c5738e1eb88a648b2503ed3080f077d1d..b3b2d0d3b9347d2b4265a72d08b6664d70a206de 100644 --- a/castor/db/oracleCommon.schema.sql +++ b/castor/db/oracleCommon.schema.sql @@ -6,7 +6,7 @@ *******************************************************************/ /* SQL statement to populate the intial schema version */ -UPDATE UpgradeLog SET schemaVersion = '2_1_14_0'; +UPDATE UpgradeLog SET schemaVersion = '2_1_14_2'; /* Sequence for indices */ CREATE SEQUENCE ids_seq CACHE 300; @@ -333,6 +333,7 @@ INITRANS 50 PCTFREE 50 ENABLE ROW MOVEMENT; ALTER TABLE CastorFile ADD CONSTRAINT FK_CastorFile_FileClass FOREIGN KEY (fileClass) REFERENCES FileClass (id) INITIALLY DEFERRED DEFERRABLE; +CREATE UNIQUE INDEX I_CastorFile_LastKnownFileName ON CastorFile (lastKnownFileName); ALTER TABLE CastorFile ADD CONSTRAINT UN_CastorFile_LKFileName UNIQUE (lastKnownFileName); CREATE INDEX I_CastorFile_FileClass ON CastorFile(FileClass); CREATE UNIQUE INDEX I_CastorFile_FileIdNsHost ON CastorFile (fileId, nsHost); @@ -808,6 +809,9 @@ CREATE TABLE DiskPool (name VARCHAR2(2048), id INTEGER CONSTRAINT PK_DiskPool_Id CREATE TABLE DiskPool2SvcClass (Parent INTEGER, Child INTEGER) INITRANS 50 PCTFREE 50; CREATE INDEX I_DiskPool2SvcClass_C on DiskPool2SvcClass (child); CREATE INDEX I_DiskPool2SvcClass_P on DiskPool2SvcClass (parent); +ALTER TABLE DiskPool2SvcClass + ADD CONSTRAINT FK_DiskPool2SvcClass_P FOREIGN KEY (Parent) REFERENCES DiskPool (id) + ADD CONSTRAINT FK_DiskPool2SvcClass_C FOREIGN KEY (Child) REFERENCES SvcClass (id); /* SQL statements for type DiskCopy */ CREATE TABLE DiskCopy (path VARCHAR2(2048), gcWeight NUMBER, creationTime INTEGER, lastAccessTime INTEGER, diskCopySize INTEGER, nbCopyAccesses NUMBER, owneruid NUMBER, ownergid NUMBER, id INTEGER CONSTRAINT PK_DiskCopy_Id PRIMARY KEY, gcType INTEGER, fileSystem INTEGER, castorFile INTEGER, status INTEGER) INITRANS 50 PCTFREE 50 ENABLE ROW MOVEMENT; @@ -873,7 +877,8 @@ CREATE INDEX I_QueryParameter_Query ON QueryParameter (query); /* Constraint on FileClass name */ ALTER TABLE FileClass ADD CONSTRAINT UN_FileClass_Name UNIQUE (name); -ALTER TABLE FileClass MODIFY (classid CONSTRAINT NN_FileClass_Name NOT NULL); +ALTER TABLE FileClass MODIFY (name CONSTRAINT NN_FileClass_Name NOT NULL); +ALTER TABLE FileClass MODIFY (classId CONSTRAINT NN_FileClass_ClassId NOT NULL); /* Custom type to handle int arrays */ CREATE OR REPLACE TYPE "numList" IS TABLE OF INTEGER; diff --git a/castor/db/stager_oracle_create.sql b/castor/db/stager_oracle_create.sql index 77d60c91a8a6f97171356cd7f5fd96714489fd08..1e5fd15ba4e1873a3042b09c13b8dfb763961a91 100644 --- a/castor/db/stager_oracle_create.sql +++ b/castor/db/stager_oracle_create.sql @@ -719,7 +719,7 @@ END serrno; *******************************************************************/ /* SQL statement to populate the intial schema version */ -UPDATE UpgradeLog SET schemaVersion = '2_1_14_0'; +UPDATE UpgradeLog SET schemaVersion = '2_1_14_2'; /* Sequence for indices */ CREATE SEQUENCE ids_seq CACHE 300; @@ -1046,6 +1046,7 @@ INITRANS 50 PCTFREE 50 ENABLE ROW MOVEMENT; ALTER TABLE CastorFile ADD CONSTRAINT FK_CastorFile_FileClass FOREIGN KEY (fileClass) REFERENCES FileClass (id) INITIALLY DEFERRED DEFERRABLE; +CREATE UNIQUE INDEX I_CastorFile_LastKnownFileName ON CastorFile (lastKnownFileName); ALTER TABLE CastorFile ADD CONSTRAINT UN_CastorFile_LKFileName UNIQUE (lastKnownFileName); CREATE INDEX I_CastorFile_FileClass ON CastorFile(FileClass); CREATE UNIQUE INDEX I_CastorFile_FileIdNsHost ON CastorFile (fileId, nsHost); @@ -1521,6 +1522,9 @@ CREATE TABLE DiskPool (name VARCHAR2(2048), id INTEGER CONSTRAINT PK_DiskPool_Id CREATE TABLE DiskPool2SvcClass (Parent INTEGER, Child INTEGER) INITRANS 50 PCTFREE 50; CREATE INDEX I_DiskPool2SvcClass_C on DiskPool2SvcClass (child); CREATE INDEX I_DiskPool2SvcClass_P on DiskPool2SvcClass (parent); +ALTER TABLE DiskPool2SvcClass + ADD CONSTRAINT FK_DiskPool2SvcClass_P FOREIGN KEY (Parent) REFERENCES DiskPool (id) + ADD CONSTRAINT FK_DiskPool2SvcClass_C FOREIGN KEY (Child) REFERENCES SvcClass (id); /* SQL statements for type DiskCopy */ CREATE TABLE DiskCopy (path VARCHAR2(2048), gcWeight NUMBER, creationTime INTEGER, lastAccessTime INTEGER, diskCopySize INTEGER, nbCopyAccesses NUMBER, owneruid NUMBER, ownergid NUMBER, id INTEGER CONSTRAINT PK_DiskCopy_Id PRIMARY KEY, gcType INTEGER, fileSystem INTEGER, castorFile INTEGER, status INTEGER) INITRANS 50 PCTFREE 50 ENABLE ROW MOVEMENT; @@ -1586,7 +1590,8 @@ CREATE INDEX I_QueryParameter_Query ON QueryParameter (query); /* Constraint on FileClass name */ ALTER TABLE FileClass ADD CONSTRAINT UN_FileClass_Name UNIQUE (name); -ALTER TABLE FileClass MODIFY (classid CONSTRAINT NN_FileClass_Name NOT NULL); +ALTER TABLE FileClass MODIFY (name CONSTRAINT NN_FileClass_Name NOT NULL); +ALTER TABLE FileClass MODIFY (classId CONSTRAINT NN_FileClass_ClassId NOT NULL); /* Custom type to handle int arrays */ CREATE OR REPLACE TYPE "numList" IS TABLE OF INTEGER; diff --git a/upgrades/stager_2.1.13-9_to_2.1.14-2.sql b/upgrades/stager_2.1.13-9_to_2.1.14-2.sql index 3d9e177201bc507351d331f7e6c36f843abb5f04..0380a8a3a3e1f599bc7e4079def1127a58cbcd74 100644 --- a/upgrades/stager_2.1.13-9_to_2.1.14-2.sql +++ b/upgrades/stager_2.1.13-9_to_2.1.14-2.sql @@ -75,7 +75,7 @@ END; /******************/ -- First update constants -@oracleConstants.sql +@../castor/db/oracleConstants.sql -- Drop the I_SubRequest_CT_ID index in case it was not dropped when deploying 2.1.13-6. -- See SR #133974 for more details. @@ -94,7 +94,9 @@ DROP INDEX I_DiskCopy_Status_7; CREATE INDEX I_DiskCopy_Status_7_FS ON DiskCopy (decode(status,7,status,NULL), fileSystem); /* new rating of filesystems */ -CREATE OR REPLACE FUNCTION fileSystemRate(nbReadStreams IN NUMBER, nbWriteStreams IN NUMBER) +CREATE OR REPLACE FUNCTION fileSystemRate +(nbReadStreams IN NUMBER, + nbWriteStreams IN NUMBER) RETURN NUMBER DETERMINISTIC IS BEGIN RETURN - nbReadStreams - nbWriteStreams; @@ -105,6 +107,40 @@ END; DROP INDEX I_FileSystem_Rate; CREATE INDEX I_FileSystem_Rate ON FileSystem(fileSystemRate(nbReadStreams, nbWriteStreams)); +/* we need to revalidate this procedure early otherwise, the dropping of columns in the + DiskServer table in the next statement will fail as it won't be able to revalidate the + tr_DiskServer_Update trigger that is using checkFSBackInProd */ +CREATE OR REPLACE +PROCEDURE checkFSBackInProd(fsId NUMBER) AS +BEGIN + -- Flag the filesystem for processing in a bulk operation later. + -- We need to do this because some operations are database intensive + -- and therefore it is often better to process several filesystems + -- simultaneous with one query as opposed to one by one. Especially + -- where full table scans are involved. + UPDATE FileSystemsToCheck SET toBeChecked = 1 + WHERE fileSystem = fsId; + -- Look for files that are STAGEOUT on the filesystem coming back to life + -- but already VALID/WAITFS/STAGEOUT/ + -- WAITFS_SCHEDULING somewhere else + FOR cf IN (SELECT /*+ USE_NL(D E) INDEX(D I_DiskCopy_Status6) */ + UNIQUE D.castorfile, D.id dcId + FROM DiskCopy D, DiskCopy E + WHERE D.castorfile = E.castorfile + AND D.fileSystem = fsId + AND E.fileSystem != fsId + AND decode(D.status,6,D.status,NULL) = dconst.DISKCOPY_STAGEOUT + AND E.status IN (dconst.DISKCOPY_VALID, + dconst.DISKCOPY_WAITFS, dconst.DISKCOPY_STAGEOUT, + dconst.DISKCOPY_WAITFS_SCHEDULING)) LOOP + -- Invalidate the DiskCopy + UPDATE DiskCopy + SET status = dconst.DISKCOPY_INVALID + WHERE id = cf.dcId; + END LOOP; +END; +/ + /* amend FileSystem and DiskServer tables */ ALTER TABLE FileSystem DROP (minFreeSpace, readRate, writeRate, nbReadWriteStreams); ALTER TABLE DiskServer DROP (readRate, writeRate, nbReadStreams, nbWriteStreams, nbReadWriteStreams, nbMigratorStreams, nbRecallerStreams); @@ -198,6 +234,8 @@ CREATE INDEX I_DC_status ON DiskCopy(status); DECLARE srIds "numList"; + srId INTEGER; + dcId INTEGER; BEGIN -- merge STAGED and CANBEMIGR FOR cf IN (SELECT unique castorFile, status, nbCopies @@ -219,16 +257,27 @@ BEGIN -- invalidate all FAILED diskcopies on disk so that they're properly garbage collected UPDATE DiskCopy SET status = dconst.DISKCOPY_INVALID WHERE status = dconst.DISKCOPY_FAILED AND fileSystem != 0; - -- drop all existing WAITDISK2DISKCOPY DiskCopies and fail corresponding requests - DELETE FROM DiskCopy WHERE status = dconst.DISKCOPY_WAITDISK2DISKCOPY - RETURNING subrequest BULK COLLECT INTO srIds; - FORALL i IN srIds.FIRST .. srIds.LAST - archiveSubReq(srIds(i), dconst.SUBREQUEST_FAILED_FINISHED); + COMMIT; + + -- drop all disk to disk copy activity. Note that StageDiskCopyReplicaRequests are + -- dropped with the table itself + FOR req IN (SELECT client, id FROM StageDiskCopyReplicaRequest) LOOP + DELETE FROM Client WHERE id = req.client; + SELECT id, diskCopy INTO srId, dcId FROM SubRequest WHERE request = req.id; + DELETE FROM DiskCopy WHERE id = dcId; + UPDATE SubRequest SET status = dconst.SUBREQUEST_RESTART, parent = NULL + WHERE parent = srId AND status = dconst.SUBREQUEST_WAITSUBREQ; + DELETE FROM SubRequest WHERE id = srId; + END LOOP; + COMMIT; + -- fail any remaining pending subrequest SELECT id BULK COLLECT INTO srIds FROM SubRequest WHERE status IN (dconst.SUBREQUEST_READY, dconst.SUBREQUEST_WAITSUBREQ); - FORALL i IN srIds.FIRST .. srIds.LAST + FOR i IN 1 .. srIds.COUNT LOOP archiveSubReq(srIds(i), dconst.SUBREQUEST_FAILED_FINISHED); + END LOOP; + COMMIT; END; / @@ -260,10 +309,11 @@ END; DROP INDEX I_CF_OpenTimeNull; ALTER TABLE CastorFile MODIFY (nsOpenTime CONSTRAINT NN_CastorFile_NsOpenTime NOT NULL); - +ALTER TABLE SvcClass DROP (recallerPolicy); ALTER TABLE StageRepackRequest ADD (fileCount INTEGER, totalSize INTEGER); -UPDATE StageRepackRequest SET fileCount = 0, totalSize = 0; -- those figures are only used for statistical purposes, assume no need to compute them for existing requests +-- those figures are only used for statistical purposes, assume no need to compute them for existing requests +UPDATE StageRepackRequest SET fileCount = 0, totalSize = 0; ALTER TABLE StageRepackRequest MODIFY (fileCount CONSTRAINT NN_StageRepackReq_fileCount NOT NULL, totalSize CONSTRAINT NN_StageRepackReq_totalSize NOT NULL, status CONSTRAINT NN_StageRepackReq_status NOT NULL, repackVid CONSTRAINT NN_StageRepackReq_repackVid NOT NULL); DROP TRIGGER tr_DiskCopy_Online; @@ -322,6 +372,9 @@ ALTER TABLE CastorFile ADD CONSTRAINT CK_CastorFile_TapeStatus CHECK (tapeStatus IN (0, 1, 2)); +ALTER TABLE FileClass MODIFY (name CONSTRAINT NN_FileClass_Name NOT NULL); +ALTER TABLE FileClass MODIFY (classId CONSTRAINT NN_FileClass_ClassId NOT NULL); + /* Creation of the DrainingJob table * - id : unique identifier of the DrainingJob * - userName, euid, egid : identification of the originator of the job @@ -455,7 +508,7 @@ INITRANS 50 PCTFREE 50 ENABLE ROW MOVEMENT; CREATE INDEX I_Disk2DiskCopyJob_Tid ON Disk2DiskCopyJob(transferId); CREATE INDEX I_Disk2DiskCopyJob_CfId ON Disk2DiskCopyJob(CastorFile); CREATE INDEX I_Disk2DiskCopyJob_CT_Id ON Disk2DiskCopyJob(creationTime, id); -CREATE INDEX I_Disk2DiskCopyJob_drainingJob ON Disk2DiskCopyJob(drainingJob); +CREATE INDEX I_Disk2DiskCopyJob_drainJob ON Disk2DiskCopyJob(drainingJob); CREATE INDEX I_Disk2DiskCopyJob_SC_type ON Disk2DiskCopyJob(destSvcClass, replicationType); BEGIN -- PENDING status is when a Disk2DiskCopyJob is created @@ -505,7 +558,13 @@ DROP PROCEDURE removeFailedDrainingTransfers; DROP PROCEDURE drainFileSystem; DROP PROCEDURE startDraining; DROP PROCEDURE stopDraining; -DROP PROCEDURE cancelRecall; +DROP VIEW DrainingFailures; +DROP VIEW DrainingOverview; +DROP FUNCTION getInterval; +DROP FUNCTION getTimeString; +DROP FUNCTION sizeOfFmtSI; +DROP PROCEDURE insertD2dRequest; +DROP PROCEDURE storeClusterStatus; CREATE INDEX I_FileMigResultsHelper_ReqId ON FileMigrationResultsHelper(ReqId);