src/Pure/System/host.scala
author wenzelm
Thu, 02 Mar 2023 14:41:21 +0100
changeset 77476 5f6f567a2661
parent 77475 3bc611c80346
child 77477 f376aebca9c1
permissions -rw-r--r--
clarified modules;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
77475
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/System/host.scala
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
     3
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
     4
Information about compute hosts.
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
     5
*/
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
     6
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
     7
package isabelle
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
     8
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
     9
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
    10
object Host {
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
    11
  /* allocated resources */
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
    12
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
    13
  object Node_Info { def none: Node_Info = Node_Info("", None) }
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
    14
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
    15
  sealed case class Node_Info(hostname: String, numa_node: Option[Int])
77476
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    16
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    17
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    18
  /* SQL data model */
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    19
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    20
  object Data {
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    21
    def make_table(name: String, columns: List[SQL.Column], body: String = ""): SQL.Table =
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    22
      SQL.Table("isabelle_host" + if_proper(name, "_" + name), columns, body = body)
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    23
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    24
    object Node_Info {
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    25
      val hostname = SQL.Column.string("hostname").make_primary_key
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    26
      val numa_index = SQL.Column.int("numa_index")
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    27
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    28
      val table = make_table("node_info", List(hostname, numa_index))
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    29
    }
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    30
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    31
    def read_numa_index(db: SQL.Database, hostname: String): Int =
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    32
      db.using_statement(
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    33
        Node_Info.table.select(List(Node_Info.numa_index),
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    34
          sql = Node_Info.hostname.where_equal(hostname))
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    35
      )(stmt => stmt.execute_query().iterator(_.int(Node_Info.numa_index)).nextOption.getOrElse(0))
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    36
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    37
    def update_numa_index(db: SQL.Database, hostname: String, numa_index: Int): Boolean =
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    38
      if (read_numa_index(db, hostname) != numa_index) {
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    39
        db.using_statement(
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    40
          Node_Info.table.delete(sql = Node_Info.hostname.where_equal(hostname))
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    41
        )(_.execute())
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    42
        db.using_statement(Node_Info.table.insert()) { stmt =>
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    43
          stmt.string(1) = hostname
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    44
          stmt.int(2) = numa_index
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    45
          stmt.execute()
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    46
        }
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    47
        true
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    48
      }
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    49
      else false
5f6f567a2661 clarified modules;
wenzelm
parents: 77475
diff changeset
    50
  }
77475
3bc611c80346 clarified modules;
wenzelm
parents:
diff changeset
    51
}