AllegroCache: an Introduction

Similar documents
AllegroCache. Reference Manual. Franz Inc. version 3.1.2

Common Lisp Object System Specification. 1. Programmer Interface Concepts

) Intel)(TX)memory):) Transac'onal) Synchroniza'on) Extensions)(TSX))) Transac'ons)

Object oriented programming

A Genetic Algorithm Implementation

Allegro CL Certification Program

Structure Programming in Lisp. Shared Structure. Tailp. Shared Structure. Top-Level List Structure

) Intel)(TX)memory):) Transac'onal) Synchroniza'on) Extensions)(TSX))) Transac'ons)

A little bit of Lisp

) Intel)(TX)memory):) Transac'onal) Synchroniza'on) Extensions)(TSX))) Transac'ons)

Department of Computer and information Science Norwegian University of Science and Technology

Database Management System Prof. D. Janakiram Department of Computer Science & Engineering Indian Institute of Technology, Madras Lecture No.

LP/LispLite: Trivial Lisp Org Mode Conversion

Lecture #2 Kenneth W. Flynn RPI CS

Debugging in LISP. trace causes a trace to be printed for a function when it is called

Using a waiting protocol to separate concerns in the mutual exclusion problem

COSI: Adding Constraints to the object-oriented paradigm

A Brief Introduction to Common Lisp

Object Oriented Programming (OOP)

CS122 Lecture 15 Winter Term,

Allegro CL Certification Program

Recursion & Iteration

Modern Programming Languages. Lecture LISP Programming Language An Introduction

CS5412: TRANSACTIONS (I)

Overview. Introduction to Transaction Management ACID. Transactions

CSE 530A ACID. Washington University Fall 2013

INF4820: Algorithms for Artificial Intelligence and Natural Language Processing. Common Lisp Fundamentals

Announcement. Overview. LISP: A Quick Overview. Outline of Writing and Running Lisp.

Database Management Systems 2010/11

Transactions. Chapter 15. New Chapter. CS 2550 / Spring 2006 Principles of Database Systems. Roadmap. Concept of Transaction.

JANUARY 20, 2016, SAN JOSE, CA. Microsoft. Microsoft SQL Hekaton Towards Large Scale Use of PM for In-memory Databases

CL-STORE: CL Serialization Package

Advanced Databases (SE487) Prince Sultan University College of Computer and Information Sciences. Dr. Anis Koubaa. Spring 2014

Jatha. Common Lisp in Java. Ola Bini JRuby Core Developer ThoughtWorks Studios.

Allegro CL Certification Program

CHAPTER 3 RECOVERY & CONCURRENCY ADVANCED DATABASE SYSTEMS. Assist. Prof. Dr. Volkan TUNALI

Transactions and Locking. Rose-Hulman Institute of Technology Curt Clifton

Databases - Transactions

Transactions. Lecture 8. Transactions. ACID Properties. Transaction Concept. Example of Fund Transfer. Example of Fund Transfer (Cont.

ò Very reliable, best-of-breed traditional file system design ò Much like the JOS file system you are building now

Massimiliano Ghilardi

In This Lecture. Transactions and Recovery. Transactions. Transactions. Isolation and Durability. Atomicity and Consistency. Transactions Recovery

Lisp Basic Example Test Questions

19 Machine Learning in Lisp

Intro to Transactions

INF4820. Common Lisp: Closures and Macros

Memory. Introduction CHAPTER 16

Ext3/4 file systems. Don Porter CSE 506

RECOVERY CHAPTER 21,23 (6/E) CHAPTER 17,19 (5/E)

The IDE s Object Editor and Class Grid

ESA: A CLIM Library for Writing Emacs-Style Applications

Chapter 15: Transactions

Transaction Management: Crash Recovery (Chap. 18), part 1

some sequential execution crash! Recovery Manager replacement MAIN MEMORY policy DISK

Common Lisp. Blake McBride

TRANSACTION PROCESSING MONITOR OVERVIEW OF TPM FOR DISTRIBUTED TRANSACTION PROCESSING

Berkeley DB Architecture

ACID Properties. Transaction Management: Crash Recovery (Chap. 18), part 1. Motivation. Recovery Manager. Handling the Buffer Pool.

6.830 Lecture Recovery 10/30/2017

6.830 Lecture Recovery 10/30/2017

Recoverability. Kathleen Durant PhD CS3200

Chapter 7 (Cont.) Transaction Management and Concurrency Control

Look at the outermost list first, evaluate each of its arguments, and use the results as arguments to the outermost operator.

System Malfunctions. Implementing Atomicity and Durability. Failures: Crash. Failures: Abort. Log. Failures: Media

A Quick Introduction to Common Lisp

New Abstractions for Fast Non-Volatile Storage

Concurrency Control & Recovery

Lecture 21: Transactional Memory. Topics: consistency model recap, introduction to transactional memory

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 4. LISP: PROMĚNNÉ, DALŠÍ VLASTNOSTI FUNKCÍ, BLOKY, MAPOVACÍ FUNKCIONÁLY, ITERAČNÍ CYKLY,

Intro to DB CHAPTER 15 TRANSACTION MNGMNT

TRANSACTION PROCESSING PROPERTIES OF A TRANSACTION TRANSACTION PROCESSING PROPERTIES OF A TRANSACTION 4/3/2014

Contents. Error Message Descriptions... 7

Transaction Management

Streams and Lazy Evaluation in Lisp

Intro. Scheme Basics. scm> 5 5. scm>

Chapter 13: Transactions

TRANSACTION PROPERTIES

Atomic Transactions

Database Principles: Fundamentals of Design, Implementation, and Management Tenth Edition. Chapter 13 Managing Transactions and Concurrency

DATABASE TRANSACTIONS. CS121: Relational Databases Fall 2017 Lecture 25

Transaction Management: Concurrency Control

Generic Function Parameter and Method Parameter Metaobjects: A Proposed Enhancement to the CLOS Metaobject Protocol. Eric L.

CMPUT325 Extensions to Pure Lisp. Extensions to Pure Lisp. Bob Price and Russ Greiner. 5th October 2004

Transactions. Prepared By: Neeraj Mangla

Administration Naive DBMS CMPT 454 Topics. John Edgar 2

DB2 Lecture 10 Concurrency Control

Bill Bridge. Oracle Software Architect NVM support for C Applications

CSC 261/461 Database Systems Lecture 20. Spring 2017 MW 3:25 pm 4:40 pm January 18 May 3 Dewey 1101

Chapter 8 :: Composite Types

Lecture Notes on Lisp A Brief Introduction

Chapter 22. Transaction Management

Scott Meder Senior Regional Sales Manager

CS352 Lecture - The Transaction Concept

COURSE 1. Database Management Systems

Database Management System

Unit 9 Transaction Processing: Recovery Zvi M. Kedem 1

BİL 354 Veritabanı Sistemleri. Transaction (Hareket)

Database System Concepts

Bases de Dades: introduction to SQL (indexes and transactions)

UNIT-IV TRANSACTION PROCESSING CONCEPTS

Transcription:

AllegroCache: an Introduction David Margolies (dm@franz.com) Questions and comments to support@franz.com

Topics What is AllegroCache? Getting started Persistent classes and objects Transactions, committing and rollback Indexes and cursors Multiple users Transactions, committing and rollback again Other features Object editor Documentation 7/28/2010 2

What is AllegroCache? A high-performance, dynamic object caching database system. Programmers to work directly with objects as if they were in memory while in fact the object data is always stored persistently. It meets the classic ACID (atomicity, consistency, isolation, durability) requirements for a reliable and robust database. 7/28/2010 3

Talk assumptions You have some familiarity with Lisp and CLOS programming. You have some familiarity with databases and issues of consistency, multiple users making changes, data loss and recovery, and so on. You have access to Allegro CL. 7/28/2010 4

Our background example We will be using an example of a theater box office, with performance events, tickets and sales This is a simple example but one that is (we hope) easy to understand. We will show how we can define persistent classes and then change them when the requirements evolve. 7/28/2010 5

AllegroCache paradigm You create classes and instances just as with regular CLOS programming. When the class is persistent, the definition and instances are stored in the database. You do have to say when you want your changes stored: that is not done automatically (to avoid inconsistency). 7/28/2010 6

Getting started Load AllegroCache (require :acache) will signal an error which will show what versions are available. (require :acache "acache-2.1.12.fasl") or whatever version you have and want - loads AllegroCache. AllegroCache package is :db.allegrocache, nicknamed :db.ac. 7/28/2010 7

Opening a database (open-file-database "theater ;; names local directory :if-does-not-exist :create :if-exists :supersede) ;; or :open (the default) if you ;; already have a database create-file-database calls open-file-database with those arguments. Additional keyword arguments allow specifying sizes and other features for better performance (see reference manual). Variable *allegrocache* set to opened database. 7/28/2010 8

Persistent classes and objects You create persistent objects by creating persistent classes and then instances of those classes (defclass performance () ((date :initarg :date :index :any :accessor perf-date) (time :initarg :time :accessor perf-time) (unsold :initarg :available :initform 100 :accessor perf-unsold) (sold :initarg :sold :initform 0 :accessor perf-sold) (event-title :initarg :event-title :index :any :accessor perf-event-title)) (:metaclass persistent-class)) This class is now defined and instances can be stored in the database. 7/28/2010 9

Creating persistent objects (make-instance 'performance :event-title "Rolling Stones :date "20101010" :time "2000") (make-instance 'performance :event-title "Joan Rivers" :date "20101101" :time "1900") These two events are created, but not yet stored. You store them by evaluating (commit). 7/28/2010 10

What can be stored? Symbols Numbers (integers and floats) String or character Vector (type t) or cons, where values are from this list Persistent objects Map or set (discussed later) Structure (when encode-object method is defined) 7/28/2010 11

Transactions, committing and rollback A transaction is an action which syncs the local status with the stored status (if possible). The database is always in a consistent state. When you make changes in Lisp, they are not stored until you say they should be (by calling (commit) or an equivalent). They are only stored if all changes can be made. If any change fails, no change is made. (rollback) undoes any local changes. In single user mode, commits never fail. 7/28/2010 12

Single-user database connection When only one person is using the database, the transaction model is simple because you make the changes. Commits will not fail. In our example, we define a sell function to sell tickets to a performance: (defun sell (perf-title perf-date perf-time number) (let* ((perf-title-set (retrieve-from-index 'performance event-title perf-title :all t)) perf avail sold) (setq perf (dolist (i perf-title-set) (if (and (string-equal (perf-date i) perf-date) (string-equal (perf-time i) perf-time)) (return i)))) (if (null perf) (error "no such performance with that title, date, and time")) (setq avail (perf-unsold perf)) (setq sold (perf-sold perf)) (if (<= number avail) (progn (setf (perf-avail perf) (- avail number)) (setf (perf-sold perf) (+ sold number))) (error "only ~d available, cannot sell ~d" avail number)))) 7/28/2010 13

Digression: we need an perf-id slot The only way to get an instance is to use event-title, date, and time. If we had an perf-id slot, we could use that. (defclass performance () ((date :initarg :date :index :any :accessor perf-date) (time :initarg :time :accessor perf-time) (unsold :initarg :available :initform 100 :accessor perf-unsold) (sold :initarg :sold :initform 0 :accessor perf-sold) (event-title :initarg :title :index :any :accessor perf-event-title)) (perf-id :initarg :perf-id :index :any-unique :accessor perf-id)) (:metaclass persistent-class)) 7/28/2010 14

When we commit, changed definition will be seen We must set the perf-id s for existing objects, doing something like: (doclass (i 'performance) (format t "title ~s, date ~s, time ~s ~%" (perf-event-title i) (perf-date i) (perf-time i)) (setf (perf-id i) (read))) doclass iterates over objects in a class. New sell function: (defun sell (perf-id number) (let* ((perf (retrieve-from-index 'performance perf-id)) (avail (perf-unsold perf)) (sold (perf-sold perf))) (if (<= number avail) (progn (setf (perf-unsold perf) (- avail number)) (setf (perf-sold perf) (+ sold number))) (error "only ~d available, cannot sell ~d" avail number)))) 7/28/2010 15

Indexes When a slot is defined with :index :any, an index is created which goes from a slot value to a set of instances. When a slot is defined with :index :anyunique, an index is created which goes from a slot value to a single instance. retrieve-from-index get the list of instances (for :any) or single instance (for :any-unique). Indexes order objects as follows: lisp values (except below), numbers, NaNs, strings. 7/28/2010 16

Cursors A cursor is a pointer that iterates through the instances of a class based on the indexed values of a slot. An index cursor is created with create-indexcursor (setq ic (create-index-cursor performance event-title) next-index-cursor and previous-indexcursor move forward and backward You can create a cursor with restrictions (where to start, where to end, etc.) free-index-cursor free cursor storage when no longer needed. 7/28/2010 17

More on indexes Indexes use resources so only index slots which you will use to access objects. We indexed date, event-title, perf-id, but not time, sold, or unsold. When retrieving from an index, you can specify specific values (as we do with perf-id) or ranges: (retrieve-from-index-range performance date 20101001 20101101 ) retrieves all events in October, 2010 7/28/2010 18

Multiple users: what is supported Multiple users can access a database server running on the machine where the database is stored. Clients can be on any machine that can connect to the server. Now, commits may fail because of simultaneous changes! with-transaction-restart catches the commit failed error. 7/28/2010 19

Transactions, commit, and rollback again You have made changes and call (commit) to store them. If the changes do not conflict with the current state of the database, the commit works. If there is a conflict, the commit fails with an error. Now (rollback) undoes all your changes and syncs your local copy of the data with the stored copy. 7/28/2010 20

Transactions, commit, and rollback again 2 Suppose two people are selling performance tickets. Seller one calls (sell jr1101 5) and commits. Now Seller two, without updating, does (sell jr1101 6) and tries to commit. That will fail because the local and stored sold and unsold slot values are different. (rollback) deletes changes and syncs local and stored. Now (sell jr1101 6) (commit) may work if seller one has not again sold tickets and committed. 7/28/2010 21

Transactions, commit, and rollback again 3 Here is the standard way: (with-transaction-restart () (sell jr1001 6) (commit)) This tries to commit and, if necessary, syncs (with (rollback), done automatically) and tries to commit again until success. Won t work with very many users and transactions: you need locks or other mechanisms. with-transaction-restart returns body return value and t (two values) if successful and nil (one value) if not. 7/28/2010 22

Transactions, commit, and rollback again 4: new sell function (defun sell (perf-id number) (let* ((perf (retrieve-from-index 'performance 'perf-id perf-id))) (with-transaction-restart () (let* ((avail (perf-unsold perf)) (sold (perf-sold perf))) (if (<= number avail) (progn (setf (perf-unsold perf) (- avail number)) (setf (perf-sold perf) (+ sold number)) (commit)) (error "only ~d tickets available, cannot sell ~d" avail number)))))) 7/28/2010 23

But you really need to design for multiple users With the ticket selling model, these problems: If a lot of sellers, your transactions may never commit. As designed, you cannot guarantee you will not oversell tickets, or that you will not promise tickets are available and find them sold out from under you by another sales person, Solution: locks might work, but likely better is a ticket-hold slot for the performance class: (defclass performance () ((date :initarg :date :index :any :accessor perf-date) (time :initarg :time :accessor perf-time) (unsold :initarg :available :initform 100 :accessor perf-unsold) (tickets-hold :initform 0 :accessor perf-hold) (sold :initarg :sold :initform 0 :accessor perf-sold) (event-title :initarg :title :index :any :accessor perf-event-title)) (:metaclass persistent-class)) 7/28/2010 24

commit and rollback review Commit stores any current changes to the database. If the local data on your machine conflicts with stored data (because another user committed changes) commit fails. Rollback deletes all changes you made since your last commit and updates your local data to latest database values. Changes to values in vectors, lists, or structures are not noticed automatically and so you have to mark objects as changed. 7/28/2010 25

Some network details On server use start-server (database-directory and port are required arguments, password etc. supported). On client, open-network-database (server and port are required arguments). 7/28/2010 26

Other features and details There are more features than we will mention! Sets and maps: a set is (for a large number of objects) better than lists. Maps (of class acmap-range) are a kind of persistent hash table, but should be used sparingly because of resource demands. Objects have internal but accessible ids (called oids). You can program using them or not as you wish. 7/28/2010 27

More features and details Delete instances (objects) with deleteinstance. When an instance is deleted locally, accessing it causes and error. (rollback) undeletes. (commit) deletes in stored database. deleted-instance-p tests whether an object is deleted. 7/28/2010 28

More features and details 2 Loading a large amount of data at once can be slow because index btrees can overflow the cache. Using commit s :bulk-load option delays index creation and can be much faster. Bulk loading should be used when a lot of data is loaded and other accesses can wait until the bulk load is finished (such as an initial load). 7/28/2010 29

More features and details 2 When accessing the database from multiple processes within the same Lisp, only one process can use a database connection at a time, but there can be multiple connections. See the reference manual for details. 7/28/2010 30

More features and details 3 There are many ways performance can be optimized, such as, for example, specifying appropriate file and cache sizes. Modifying gc parameters is sometimes useful. This is discussed in the reference manual. 7/28/2010 31

More features and details 4 close-database closes the connection to the database. There is functionality for closing client connections and other connection functionality detailed in the reference manual. In the standalone version and in the client side of the client/server version every persistent class in the database has a cache of objects of that class. The cache must be at least as large as all the objects currently pointed to by objects in the lisp heap. It is useful to make it even larger. See the reference manual. 7/28/2010 32

Where Acache differs from standard CLOS programming AllegroCache is designed to make database operations similar to ordinary CLOS programming, so, for example, class changes are easy and standard. But there are some important differences: change-class does not work. You cannot change the class of a persistent object. Modifications of non-clos objects (values in vectors or lists, e.g.) are not tracked automatically. See mark-instance-modified. 7/28/2010 33

Finding objects and iteration options You can always (of course) iterate through the whole database using doclass. You can use indexed slots and find objects, specifying ranges to restrict the search. You can use expression cursors (made with createexpression-cursor) to search for values in multiple slots (and (:range date 20101101 20101201 ) (:range time 1800 )) Will find all events in November, 2010 starting at 6:00 pm or later and next-index-cursor will loop through what is found. 7/28/2010 34

Data recovery save-database stores current state in a file. restore-database uses that file to open a database (the file may be different from the current state of the database). AllegroCache builds a log file recording all transactions. The database can be restored from these files. 7/28/2010 35

Object editor The IDE s Object Editor can be used to display the AllegroCache data: 7/28/2010 36

Documentation http://www.franz.com/products/allegrocache/docs/ Reference manual http://www.franz.com/products/allegrocache/ docs/acache.pdf Web page http://www.franz.com/products/allegrocache/ 7/28/2010 37

AllegroCache: an Introduction David Margolies (dm@franz.com) Questions and comments to support@franz.com 7/28/2010 38