Postgres was the first option that we started investigating, but after closer contact with Postgres' users through the mailing list, we found out that Postgres had lots of bugs and problems mainly when used by multiple users. From this point we decided that we would concentrate ours efforts in looking for object oriented databases. Some of the reasons for that were:
So, we started looking for others options: Arjuna, ODE and Exodus appeared as options.
Arjuna, developed at University of Newcastle Upon Tyne, was rejected because it is an object oriented programming system, based around transactions, for construction of fault tolerant distributed systems on top of UNIX. So, using it as a toolkit for building a database would not be straight forward. For more information on Arjuna, see [1].
ODE [2], [3] had the potential to be a very good solution. It is a toolkit for building databases based on O++, an upward-compatible extension of C++, which provides facilities for creating and manipulating the ODE database, for specifying transactions, creating and manipulating persistent objects, querying the database and creating and manipulating versions. Besides O++, ODE also has other useful features such as:
Exodus [4] [5], [6], [7], [8] is very similar to ODE. It has a programming language called E, which is an extension of gnu C++ that allows users to build database applications, providing very similar features to O++. But Exodus also provides a client library that can be linked to user application programs written in C++, allowing creation and manipulation of objects. Below, we describe the Exodus Storage Manager and the client library in more detail.
The Exodus Storage Manager is a multi-user object storage system supporting versions, indexes, single site transactions, distributed transactions, concurrency control, and recovery. It has a client-server architecture where application programs (clients) may reside on a machine different from the machine or machines on which the Storage Manager server or servers run. Part of the Exodus Storage Manager code and data structure refers to a client library that has to be linked with the application program in order to support the client programming interface. Each client has its own buffer pool for caching data. The client library connects to one or more server processes and communicates with them using a remote-procedure-call-style mechanism that runs over TCP.
The Storage Manager provides objects to store data, and distinguishes two basic types of objects: small (those that fit on a single disk page) and large (those that do not fit in a single disk page, and are represented using a B[+] tree index structure). All objects are described through object identifiers, and functions to read, overwrite, insert, delete and append to an object are provided. As grouping related information together is important for Exodus performance, the file concept exists. Files are collections of related objects. B[+] tree and linear hashing indexes are provided, and the key can be any C language type. Transactions, on Exodus, are either committed or aborted and nested transactions are not allowed. Transactions that use data on more than one server are committed using a distributed two-phase commit protocol. Concurrency control is based on the standard hierarchical two-phase locking protocol. The lock hierarchy contains two granularities: file level and page level. Deadlocks involving more than one server are resolved through timeouts. Every time that a new version for a small object is created (smaller than 1 page) a complete new object is created. For large objects (larger than 1 page), only the different pages are duplicated.
The choice between ODE and Exodus was not easy, since they are similar in many ways. However, the idea of using extensions to C++ in the ODE case (O++), and being dependent on fixed versions and eventual bugs was not very welcome. As Exodus provides a client library that can be linked to normal C++ applications, and the functionalities provided by the library seemed sufficient for us, we chose Exodus.