IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Aug 7, 2009, 4:08:25 PM (17 years ago)
Author:
Paul Price
Message:

Merging trunk (r25026) to get up-to-date on old branch.

Location:
branches/pap
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/pap

  • branches/pap/Nebulous-Server

  • branches/pap/Nebulous-Server/lib/Nebulous/Server/SQL.pm

    r23947 r25027  
    6767        WHERE parent_id = ?
    6868            AND dirname = ?
     69        LOCK IN SHARE MODE
    6970    },
    7071    new_directory       => qq{
     
    8283    stat_object          => qq{
    8384        SELECT
    84             storage_object.so_id,
    85             storage_object.ext_id,
    86             read_lock,
    87             write_lock,
    88             storage_object_attr.epoch,
    89             storage_object_attr.mtime,
     85            so.so_id,
     86            so.ext_id,
     87            attr.read_lock,
     88            attr.write_lock,
     89            attr.epoch,
     90            attr.mtime,
     91            SUM(available) as available,
    9092            COUNT(instance.so_id) as instances
    91         FROM storage_object
    92         JOIN storage_object_attr
     93        FROM storage_object as so
     94        JOIN storage_object_attr as attr
    9395            USING (so_id)
    9496        JOIN instance
    9597            USING (so_id)
    96         WHERE ext_id = ?
    97         GROUP BY storage_object.so_id
     98        LEFT JOIN mountedvol
     99            USING(vol_id)
     100        WHERE ext_id = ?
     101        GROUP BY so.so_id
    98102    },
    99103    # Note: this sets an update lock
     
    175179        WHERE ext_id = ?
    176180    },
    177     delete_instance    => qq{
     181    delete_instance_by_ins_id => qq{
    178182        DELETE FROM instance
    179         WHERE uri = ?
     183        WHERE ins_id = ?
    180184    },
    181185    get_object_from_uri   => qq{
     
    184188        WHERE uri = ?
    185189    },
     190    get_instance_by_uri   => qq{
     191        SELECT ins_id
     192        FROM instance
     193        WHERE
     194            so_id = ?
     195            AND uri = ?
     196    },
    186197    get_instance_count   => qq{
    187198        SELECT count(ins_id)
    188199        FROM instance
    189200        WHERE so_id = ?
     201    },
     202    get_instance_count_by_ext_id   => qq{
     203        SELECT
     204            so_id,
     205            count(ins_id) as total,
     206            sum(available) as available
     207        FROM instance
     208        JOIN storage_object
     209            USING(so_id)
     210        LEFT JOIN mountedvol
     211            USING(vol_id)
     212        WHERE
     213            ext_id = ?
     214        GROUP BY so_id
     215    },
     216    copy_dead_instances_to_deleted => qq{
     217        INSERT INTO deleted
     218        SELECT vol_id, uri, NULL
     219        FROM instance
     220        LEFT JOIN mountedvol
     221            USING(vol_id)
     222        WHERE
     223            so_id = ?
     224            AND (mountedvol.available IS NULL || mountedvol.available = 0)
     225    },
     226    find_dead_instances_by_so_id => qq{
     227        SELECT so_id, ins_id, vol_id, uri
     228        FROM instance
     229        LEFT JOIN mountedvol
     230            USING(vol_id)
     231        WHERE
     232            so_id = ?
     233            AND (mountedvol.available IS NULL || mountedvol.available = 0)
    190234    },
    191235    get_object_instances    => qq{
     
    233277    get_replication_volume_for_ext_id   => qq{
    234278        SELECT
    235             vol_id,
     279            m.vol_id,
    236280            host,
    237281            path,
    238282            xattr,
    239283            total - used as free
    240         FROM (
    241 -- This query works but is slow...
    242 --             SELECT
    243 --                  mountedvol.*
    244 --             FROM mountedvol
    245 --             WHERE
    246 --                 vol_id NOT IN(
    247 --                     SELECT vol_id
    248 --                     FROM storage_object
    249 --                     JOIN instance
    250 --                         USING(so_id)
    251 --                     WHERE ext_id = --
    252 --                  )
    253                 SELECT
    254                     m.*
    255                 FROM mountedvol AS m
    256                 LEFT JOIN instance AS i
    257                     ON m.vol_id = i.vol_id
    258                     AND i.so_id = (
    259                         SELECT so_id
    260                         FROM storage_object
    261                         WHERE ext_id = ?
    262                     )
    263                 WHERE
    264                     i.vol_id IS NULL
    265         ) as Foo
    266         WHERE
    267             used / total < ?
     284        FROM mountedvol AS m
     285        LEFT JOIN instance AS i
     286            ON m.vol_id = i.vol_id
     287            AND i.so_id = (
     288                SELECT so_id
     289                FROM storage_object
     290                WHERE ext_id = ?
     291            )
     292        WHERE
     293            i.vol_id IS NULL
     294            AND used / total < ?
    268295            AND available = ?
    269296            AND allocate = ?
    270         ORDER BY RAND()
    271         LIMIT 1
     297            ORDER BY RAND()
     298            LIMIT 1
    272299    },
    273300    get_storage_volume          => qq{
     
    287314    },
    288315    new_volume          => qq{
    289         INSERT INTO volume (name, host, path, allocate, available, xattr)
    290         VALUES (?, ?, ?, TRUE, TRUE, FALSE)
     316        INSERT INTO volume (name, host, path, allocate, available, xattr, mountpoint)
     317        VALUES (?, ?, ?, TRUE, TRUE, FALSE, ?)
    291318    },
    292319    get_volume_by_name => qq{
     
    310337    },
    311338    find_object_by_ext_id => qq{
    312         SELECT ext_id, ext_id_basename
     339        SELECT so_id, ext_id, ext_id_basename
    313340        FROM storage_object
    314341        WHERE ext_id = ?
     
    318345        FROM storage_object
    319346        WHERE dir_id = ?
     347    },
     348    find_dir_by_parent_id => qq{
     349        SELECT dir_id, dirname
     350        FROM directory
     351        WHERE parent_id = ?
    320352    },
    321353    rename_object => qq{
     
    397429    },
    398430    get_mounted_volumes => qq{
    399         SELECT * FROM mountedvol ORDER BY host, name
     431        SELECT mountpoint, total, used, vol_id, name, host, path, allocate, available, xattr FROM mountedvol ORDER BY host, name
    400432    },
    401433);
     
    424456DROP TABLE IF EXISTS lock_record;
    425457DROP TABLE IF EXISTS volume;
    426 DROP TABLE IF EXISTS mount;
     458DROP TABLE IF EXISTS mountedvol;
    427459DROP TABLE IF EXISTS log;
    428 DROP TABLE IF EXISTS mountedvol;
    429460DROP TABLE IF EXISTS directory;
    430 DROP PROCEDURE IF EXISTS getmountedvol;
     461DROP TABLE IF EXISTS deleted;
    431462SET FOREIGN_KEY_CHECKS=1
    432463END
     464#DROP PROCEDURE IF EXISTS getmountedvol;
    433465    $sql{get_db_clear} = \@clear;
    434466}
     
    447479
    4484801;
     481
     482# ###
     483#
     484# CREATE PROCEDURE getmountedvol() DETERMINISTIC
     485# BEGIN
     486#     DECLARE done BOOLEAN DEFAULT FALSE;
     487#     DECLARE vol_idvar INT;
     488#     DECLARE namevar VARCHAR(255);
     489#     DECLARE hostvar VARCHAR(255);
     490#     DECLARE pathvar VARCHAR(255);
     491#     DECLARE allocatevar BOOLEAN;
     492#     DECLARE availablevar BOOLEAN;
     493#     DECLARE xattrvar BOOLEAN;
     494#     DECLARE trans_level VARCHAR(255);
     495#     DECLARE key_checks BOOLEAN;
     496#     DECLARE cur1 CURSOR FOR SELECT vol_id, name, host, path, allocate, available, xattr FROM myvolume;
     497#     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
     498#
     499#     -- store the okey checking state
     500# --    SELECT @@FOREIGN_KEY_CHECKS INTO key_checks;
     501#     -- disable foregin check checks to prevent deadlocks on the mountedvol table
     502# --    SET FOREIGN_KEY_CHECKS=0;
     503#
     504#     -- make sure the temp table does not already exist... this can happy if the
     505#     -- stored proc fails for some reason
     506#     DROP TABLE IF EXISTS myvolume;
     507#     CREATE TEMPORARY TABLE myvolume LIKE volume;
     508#     INSERT INTO myvolume SELECT * FROM volume;
     509#
     510#     -- store the current transaction level
     511# --    SELECT @@session.tx_isolation INTO trans_level;
     512#     -- set trans level to repeatable-read so the volume table does not change
     513#     -- out from under our cursor
     514# --    SET @@session.tx_isolation = 'REPEATABLE-READ';
     515#
     516#     -- iterate over the volume table finding the coresponding entry in the
     517#     -- mount table and inserting union of the volume & mount row into the
     518#     -- mountedvol table
     519#     OPEN cur1;
     520#
     521#     myloop: LOOP
     522#         FETCH cur1 INTO vol_idvar, namevar, hostvar, pathvar, allocatevar, availablevar, xattrvar;
     523#         IF `done` THEN LEAVE myloop; END IF;
     524#         REPLACE INTO mountedvol
     525#             SELECT mountpoint, total, used, vol_idvar, namevar, hostvar, pathvar, allocatevar, availablevar, xattrvar
     526#             FROM
     527#                 (SELECT *, INSTR(pathvar, mountpoint) = 1 as substring
     528#                 FROM mount
     529#                 HAVING substring = 1
     530#                 ORDER BY substring DESC, LENGTH(mountpoint) DESC
     531#                 LIMIT 1) as bar;
     532#     END LOOP myloop;
     533#     
     534#     CLOSE cur1;
     535#
     536#     -- restore the original transaction level
     537# --    SET @@session.tx_isolation = trans_level;
     538#
     539#     -- restore the original key checking state
     540# --    SET @@FOREIGN_KEY_CHECKS = key_checks;
     541#
     542#     DROP TABLE IF EXISTS myvolume;
     543#
     544# --    SET FOREIGN_KEY_CHECKS=1;
     545#
     546#     COMMIT;
     547# END
    449548
    450549__DATA__
     
    455554    FOREIGN KEY(parent_id) REFERENCES directory(dir_id),
    456555    PRIMARY KEY(dir_id),
    457     KEY(parent_id)
     556    KEY(parent_id),
     557    KEY(dirname),
     558    UNIQUE(dirname, parent_id)
    458559) ENGINE=innodb DEFAULT CHARSET=latin1;
    459560
     
    466567CREATE TABLE storage_object (
    467568    so_id BIGINT NOT NULL AUTO_INCREMENT,
    468     ext_id VARCHAR(255) NOT NULL UNIQUE,
     569    ext_id VARCHAR(255) NOT NULL,
    469570    ext_id_basename VARCHAR(255) NOT NULL,
    470571    dir_id BIGINT NOT NULL,
     
    472573    type enum('REG_FILE'),
    473574    PRIMARY KEY(so_id),
     575    UNIQUE KEY(ext_id),
    474576    KEY(dir_id),
    475577    KEY(type)
     
    514616CREATE TABLE volume (
    515617    vol_id INT NOT NULL AUTO_INCREMENT,
    516     name VARCHAR(255) UNIQUE NOT NULL,
     618    name VARCHAR(255) NOT NULL,
    517619    host VARCHAR(255) NOT NULL,
    518620    path VARCHAR(255) NOT NULL,
     
    520622    available BOOLEAN DEFAULT FALSE,
    521623    xattr BOOLEAN DEFAULT FALSE,
     624    mountpoint VARCHAR(255) NOT NULL,
    522625    PRIMARY KEY(vol_id),
     626    UNIQUE KEY(name),
     627    UNiQUE KEY(path),
    523628    KEY(host(16)),
    524     KEY(path(255)),
    525629    KEY(allocate),
    526     KEY(available)
     630    KEY(available),
     631    KEY(mountpoint(255))
     632) ENGINE=innodb DEFAULT CHARSET=latin1;
     633
     634###
     635
     636CREATE TABLE mountedvol(
     637    vol_id INT NOT NULL,
     638    FOREIGN KEY(vol_id) REFERENCES volume(vol_id) ON DELETE CASCADE,
     639    name VARCHAR(255) NOT NULL,
     640    host VARCHAR(255) NOT NULL,
     641    path VARCHAR(255) NOT NULL,
     642    FOREIGN KEY(path) REFERENCES volume(path) ON DELETE CASCADE,
     643    allocate BOOLEAN DEFAULT FALSE,
     644    available BOOLEAN DEFAULT FALSE,
     645    xattr BOOLEAN DEFAULT FALSE,
     646    mountpoint VARCHAR(255) NOT NULL,
     647    FOREIGN KEY(mountpoint) REFERENCES volume(mountpoint) ON DELETE CASCADE,
     648    total BIGINT NOT NULL,
     649    used BIGINT NOT NULL,
     650    PRIMARY KEY(vol_id),
     651    KEY(name),
     652    KEY(host),
     653    KEY(path),
     654    KEY(allocate),
     655    KEY(available),
     656    KEY(xattr),
     657    KEY(mountpoint(255))
    527658) ENGINE=innodb DEFAULT CHARSET=latin1;
    528659
     
    532663    ins_id BIGINT NOT NULL AUTO_INCREMENT,
    533664    so_id BIGINT NOT NULL,
    534     FOREIGN KEY(so_id) REFERENCES storage_object(so_id),
     665    FOREIGN KEY(so_id) REFERENCES storage_object(so_id) ON DELETE CASCADE,
    535666    vol_id INT NOT NULL,
    536667    FOREIGN KEY(vol_id) REFERENCES volume(vol_id),
     
    546677###
    547678
    548 CREATE TABLE mount (
    549     mountpoint VARCHAR(255) NOT NULL,
    550     total BIGINT NOT NULL,
    551     used BIGINT NOT NULL,
    552     PRIMARY KEY(mountpoint)
    553 ) ENGINE=innodb DEFAULT CHARSET=latin1;
    554 
    555 ###
    556 
    557679CREATE TABLE log (
    558680    timestamp TIMESTAMP,
     
    566688###
    567689
    568 CREATE TABLE mountedvol(
    569     mountpoint VARCHAR(255) NOT NULL,
    570     FOREIGN KEY(mountpoint) REFERENCES mount(mountpoint) ON DELETE CASCADE,
    571     total BIGINT NOT NULL,
    572     used BIGINT NOT NULL,
     690CREATE TABLE deleted (
    573691    vol_id INT NOT NULL,
    574     FOREIGN KEY(vol_id) REFERENCES volume(vol_id) ON DELETE CASCADE,
    575     name VARCHAR(255) NOT NULL,
    576     host VARCHAR(255) NOT NULL,
    577     path VARCHAR(255) NOT NULL,
    578     FOREIGN KEY(path) REFERENCES volume(path) ON DELETE CASCADE,
    579     allocate BOOLEAN DEFAULT FALSE,
    580     available BOOLEAN DEFAULT FALSE,
    581     xattr BOOLEAN DEFAULT FALSE,
    582     PRIMARY KEY(mountpoint),
     692    FOREIGN KEY(vol_id) REFERENCES volume(vol_id),
     693    uri VARCHAR(255) NOT NULL,
     694    timestamp TIMESTAMP,
     695    PRIMARY KEY(vol_id, uri),
    583696    KEY(vol_id),
    584     KEY(name),
    585     KEY(host),
    586     KEY(path),
    587     KEY(allocate),
    588     KEY(available),
    589     KEY(xattr)
    590 ) ENGINE=innodb DEFAULT CHARSET=latin1;
    591 
    592 ###
    593 
    594 CREATE PROCEDURE getmountedvol() DETERMINISTIC
    595 BEGIN
    596     DECLARE done BOOLEAN DEFAULT FALSE;
    597     DECLARE vol_idvar INT;
    598     DECLARE namevar VARCHAR(255);
    599     DECLARE hostvar VARCHAR(255);
    600     DECLARE pathvar VARCHAR(255);
    601     DECLARE allocatevar BOOLEAN;
    602     DECLARE availablevar BOOLEAN;
    603     DECLARE xattrvar BOOLEAN;
    604     DECLARE trans_level VARCHAR(255);
    605     DECLARE key_checks BOOLEAN;
    606     DECLARE cur1 CURSOR FOR SELECT vol_id, name, host, path, allocate, available, xattr FROM myvolume;
    607     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
    608 
    609     -- store the okey checking state
    610     SELECT @@FOREIGN_KEY_CHECKS INTO key_checks;
    611     -- disable foregin check checks to prevent deadlocks on the mountedvol table
    612     SET FOREIGN_KEY_CHECKS=0;
    613 
    614     -- make sure the temp table does not already exist... this can happy if the
    615     -- stored proc fails for some reason
    616     DROP TABLE IF EXISTS myvolume;
    617     CREATE TEMPORARY TABLE myvolume LIKE volume;
    618     INSERT INTO myvolume SELECT * FROM volume;
    619 
    620     -- store the current transaction level
    621 --    SELECT @@session.tx_isolation INTO trans_level;
    622     -- set trans level to repeatable-read so the volume table does not change
    623     -- out from under our cursor
    624 --    SET @@session.tx_isolation = 'REPEATABLE-READ';
    625 
    626     -- iterate over the volume table finding the coresponding entry in the
    627     -- mount table and inserting union of the volume & mount row into the
    628     -- mountedvol table
    629     OPEN cur1;
    630 
    631     DELETE FROM mountedvol;
    632 
    633     myloop: LOOP
    634         FETCH cur1 INTO vol_idvar, namevar, hostvar, pathvar, allocatevar, availablevar, xattrvar;
    635         IF `done` THEN LEAVE myloop; END IF;
    636         INSERT INTO mountedvol
    637             SELECT mountpoint, total, used, vol_idvar, namevar, hostvar, pathvar, allocatevar, availablevar, xattrvar
    638             FROM
    639                 (SELECT *, INSTR(pathvar, mountpoint) = 1 as substring
    640                 FROM mount
    641                 HAVING substring = 1
    642                 ORDER BY substring DESC, LENGTH(mountpoint) DESC
    643                 LIMIT 1) as bar;
    644     END LOOP myloop;
    645    
    646     CLOSE cur1;
    647 
    648     -- restore the original transaction level
    649 --    SET @@session.tx_isolation = trans_level;
    650 
    651     -- restore the original key checking state
    652     SET @@FOREIGN_KEY_CHECKS = key_checks;
    653 
    654     DROP TABLE IF EXISTS myvolume;
    655 
    656     SET FOREIGN_KEY_CHECKS=1;
    657 
    658     COMMIT;
    659 END
     697    KEY(uri)
     698) ENGINE=innodb DEFAULT CHARSET=latin1;
Note: See TracChangeset for help on using the changeset viewer.