Table Of Contents

Previous topic

Account DB and Container DB

Next topic

Misc

This Page

Object

Object Server

Object Server for Swift

class swift.obj.server.ObjectController(conf)

Bases: object

Implements the WSGI application for the Swift Object Server.

DELETE(*a, **kw)

Handle HTTP DELETE requests for the Swift Object Server.

GET(*a, **kw)

Handle HTTP GET requests for the Swift Object Server.

HEAD(*a, **kw)

Handle HTTP HEAD requests for the Swift Object Server.

POST(*a, **kw)

Handle HTTP POST requests for the Swift Object Server.

PUT(*a, **kw)

Handle HTTP PUT requests for the Swift Object Server.

REPLICATE(*a, **kw)

Handle REPLICATE requests for the Swift Object Server. This is used by the object replicator to get hashes for directories.

async_update(op, account, container, obj, host, partition, contdevice, headers_out, objdevice)

Sends or saves an async update.

Parameters:
  • op – operation performed (ex: ‘PUT’, or ‘DELETE’)
  • account – account name for the object
  • container – container name for the object
  • obj – object name
  • host – host that the container is on
  • partition – partition that the container is on
  • contdevice – device name that the container is on
  • headers_out – dictionary of headers to send in the container request
  • objdevice – device name that the object is in
container_update(op, account, container, obj, request, headers_out, objdevice)

Update the container when objects are updated.

Parameters:
  • op – operation performed (ex: ‘PUT’, or ‘DELETE’)
  • account – account name for the object
  • container – container name for the object
  • obj – object name
  • request – the original request object driving the update
  • headers_out – dictionary of headers to send in the container request(s)
  • objdevice – device name that the object is in
delete_at_update(op, delete_at, account, container, obj, request, objdevice)

Update the expiring objects container when objects are updated.

Parameters:
  • op – operation performed (ex: ‘PUT’, or ‘DELETE’)
  • delete_at – scheduled delete in UNIX seconds, int
  • account – account name for the object
  • container – container name for the object
  • obj – object name
  • request – the original request driving the update
  • objdevice – device name that the object is in
get_diskfile(device, partition, account, container, obj, **kwargs)

Utility method for instantiating a DiskFile object supporting a given REST API.

An implementation of the object server that wants to use a different DiskFile class would simply over-ride this method to provide that behavior.

setup(conf)

Implementation specific setup. This method is called at the very end by the constructor to allow a specific implementation to modify existing attributes or add its own attributes.

Parameters:conf – WSGI configuration parameter
swift.obj.server.app_factory(global_conf, **local_conf)

paste.deploy app factory for creating WSGI object server apps

Object Replicator

class swift.obj.replicator.ObjectReplicator(conf)

Bases: swift.common.daemon.Daemon

Replicate objects.

Encapsulates most logic and data needed by the object replication process. Each call to .replicate() performs one replication pass. It’s up to the caller to do this in a loop.

check_ring()

Check to see if the ring has been updated

Returns:boolean indicating whether or not the ring has changed
collect_jobs()

Returns a sorted list of jobs (dictionaries) that specify the partitions, nodes, etc to be rsynced.

detect_lockups()

In testing, the pool.waitall() call very occasionally failed to return. This is an attempt to make sure the replicator finishes its replication pass in some eventuality.

heartbeat()

Loop that runs in the background during replication. It periodically logs progress.

kill_coros()

Utility function that kills all coroutines currently running.

replicate(override_devices=None, override_partitions=None)

Run a replication pass

rsync(node, job, suffixes)

Synchronize local suffix directories from a partition with a remote node.

Parameters:
  • node – the “dev” entry for the remote node to sync with
  • job – information about the partition being synced
  • suffixes – a list of suffixes which need to be pushed
Returns:

boolean indicating success or failure

run_forever(*args, **kwargs)
run_once(*args, **kwargs)
stats_line()

Logs various stats for the currently running replication pass.

update(job)

High-level method that replicates a single partition.

Parameters:job – a dict containing info about the partition to be replicated
update_deleted(job)

High-level method that replicates a single partition that doesn’t belong on this node.

Parameters:job – a dict containing info about the partition to be replicated

Object Updater

class swift.obj.updater.ObjectUpdater(conf)

Bases: swift.common.daemon.Daemon

Update object information in container listings.

get_container_ring()

Get the container ring. Load it, if it hasn’t been yet.

object_sweep(device)

If there are async pendings on the device, walk each one and update.

Parameters:device – path to device
object_update(node, part, op, obj, headers)

Perform the object update to the container

Parameters:
  • node – node dictionary from the container ring
  • part – partition that holds the container
  • op – operation performed (ex: ‘POST’ or ‘DELETE’)
  • obj – object name being updated
  • headers – headers to send with the update
process_object_update(update_path, device)

Process the object information to be updated and update.

Parameters:
  • update_path – path to pickled object update file
  • device – path to device
run_forever(*args, **kwargs)

Run the updater continuously.

run_once(*args, **kwargs)

Run the updater once.

swift.obj.updater.random()

random() -> x in the interval [0, 1).

Object Auditor

class swift.obj.auditor.AuditorWorker(conf, logger, zero_byte_only_at_fps=0)

Bases: object

Walk through file system to audit object

audit_all_objects(mode='once')
failsafe_object_audit(path, device, partition)

Entrypoint to object_audit, with a failsafe generic exception handler.

object_audit(path, device, partition)

Audits the given object path.

Parameters:
  • path – a path to an object
  • device – the device the path is on
  • partition – the partition the path is on
record_stats(obj_size)

Based on config’s object_size_stats will keep track of how many objects fall into the specified ranges. For example with the following:

object_size_stats = 10, 100, 1024

and your system has 3 objects of sizes: 5, 20, and 10000 bytes the log will look like: {“10”: 1, “100”: 1, “1024”: 0, “OVER”: 1}

class swift.obj.auditor.ObjectAuditor(conf, **options)

Bases: swift.common.daemon.Daemon

Audit objects.

run_forever(*args, **kwargs)

Run the object audit until stopped.

run_once(*args, **kwargs)

Run the object audit once.

Object Backend

Disk File Interface for the Swift Object Server

The DiskFile, DiskFileWriter and DiskFileReader classes combined define the on-disk abstraction layer for supporting the object server REST API interfaces (excluding REPLICATE). Other implementations wishing to provide an alternative backend for the object server must implement the three classes. An example alternative implementation can be found in the mem_server.py and mem_diskfile.py modules along size this one.

The DiskFileManager is a reference implemenation specific class and is not part of the backend API.

The remaining methods in this module are considered implementation specifc and are also not considered part of the backend API.

class swift.obj.diskfile.DiskFile(mgr, device_path, threadpool, partition, account, container, obj)

Bases: object

Manage object files.

This specific implementation manages object files on a disk formatted with a POSIX-compliant file system that supports extended attributes as metadata on a file or directory.

Note

The arguments to the constructor are considered implementation specific. The API does not define the constructor arguments.

Parameters:
  • mgr – associated DiskFileManager instance
  • device_path – path to the target device or drive
  • threadpool – thread pool to use for blocking operations
  • partition – partition on the device in which the object lives
  • account – account name for the object
  • container – container name for the object
  • obj – object name for the object
create(*args, **kwds)

Context manager to create a file. We create a temporary file first, and then return a DiskFileWriter object to encapsulate the state.

Note

An implementation is not required to perform on-disk preallocations even if the parameter is specified. But if it does and it fails, it must raise a DiskFileNoSpace exception.

Parameters:size – optional initial size of file to explicitly allocate on disk
Raises DiskFileNoSpace:
 if a size is specified and allocation fails
delete(timestamp)

Delete the object.

This implementation creates a tombstone file using the given timestamp, and removes any older versions of the object file. Any file that has an older timestamp than timestamp will be deleted.

Note

An implementation is free to use or ignore the timestamp parameter.

Parameters:timestamp – timestamp to compare with each file
Raises DiskFileError:
 this implementation will raise the same errors as the create() method.
get_metadata()

Provide the metadata for a previously opened object as a dictionary.

Returns:object’s metadata dictionary
Raises DiskFileNotOpen:
 if the swift.obj.diskfile.DiskFile.open() method was not previously invoked
open()

Open the object.

This implementation opens the data file representing the object, reads the associated metadata in the extended attributes, additionally combining metadata from fast-POST .meta files.

Note

An implementation is allowed to raise any of the following exceptions, but is only required to raise DiskFileNotExist when the object representation does not exist.

Raises:
  • DiskFileCollision – on name mis-match with metadata
  • DiskFileNotExist – if the object does not exist
  • DiskFileDeleted – if the object was previously deleted
  • DiskFileQuarantined – if while reading metadata of the file some data did pass cross checks
Returns:

itself for use as a context manager

read_metadata()

Return the metadata for an object without requiring the caller to open the object first.

Returns:metadata dictionary for an object
Raises DiskFileError:
 this implementation will raise the same errors as the open() method.
reader(iter_hook=None, keep_cache=False)

Return a swift.common.swob.Response class compatible “app_iter” object as defined by swift.obj.diskfile.DiskFileReader.

For this implementation, the responsibility of closing the open file is passed to the swift.obj.diskfile.DiskFileReader object.

Parameters:
  • iter_hook – called when __iter__ returns a chunk
  • keep_cache – caller’s preference for keeping data read in the OS buffer cache
Returns:

a swift.obj.diskfile.DiskFileReader object

write_metadata(metadata)

Write a block of metadata to an object without requiring the caller to create the object first. Supports fast-POST behavior semantics.

Parameters:metadata – dictionary of metadata to be associated with the object
Raises DiskFileError:
 this implementation will raise the same errors as the create() method.
class swift.obj.diskfile.DiskFileManager(conf, logger)

Bases: object

Management class for devices, providing common place for shared parameters and methods not provided by the DiskFile class (which primarily services the object server REST API layer).

The get_diskfile() method is how this implementation creates a DiskFile object.

Note

This class is reference implementation specific and not part of the pluggable on-disk backend API.

Note

TODO(portante): Not sure what the right name to recommend here, as “manager” seemed generic enough, though suggestions are welcome.

Parameters:
  • conf – caller provided configuration object
  • logger – caller provided logger
construct_dev_path(device)

Construct the path to a device without checking if it is mounted.

Parameters:device – name of target device
Returns:full path to the device
get_dev_path(device)

Return the path to a device, checking to see that it is a proper mount point based on a configuration parameter.

Parameters:device – name of target device
Returns:full path to the device, None if the path to the device is not a proper mount point.
get_diskfile(device, partition, account, container, obj, **kwargs)
get_hashes(device, partition, suffix)
pickle_async_update(device, account, container, obj, data, timestamp)
class swift.obj.diskfile.DiskFileReader(fp, data_file, obj_size, etag, threadpool, disk_chunk_size, keep_cache_size, device_path, logger, iter_hook=None, keep_cache=False)

Bases: object

Encapsulation of the WSGI read context for servicing GET REST API requests. Serves as the context manager object for the swift.obj.diskfile.DiskFile class’s swift.obj.diskfile.DiskFile.reader() method.

Note

The quarantining behavior of this method is considered implementation specific, and is not required of the API.

Note

The arguments to the constructor are considered implementation specific. The API does not define the constructor arguments.

Parameters:
  • fp – open file object pointer reference
  • data_file – on-disk data file name for the object
  • obj_size – verified on-disk size of the object
  • etag – expected metadata etag value for entire file
  • threadpool – thread pool to use for read operations
  • disk_chunk_size – size of reads from disk in bytes
  • keep_cache_size – maximum object size that will be kept in cache
  • device_path – on-disk device path, used when quarantining an obj
  • logger – logger caller wants this object to use
  • iter_hook – called when __iter__ returns a chunk
  • keep_cache – should resulting reads be kept in the buffer cache
app_iter_range(start, stop)

Returns an iterator over the data file for range (start, stop)

app_iter_ranges(ranges, content_type, boundary, size)

Returns an iterator over the data file for a set of ranges

close()

Close the open file handle if present.

For this specific implementation, this method will handle quarantining the file if necessary.

class swift.obj.diskfile.DiskFileWriter(name, datadir, fd, tmppath, bytes_per_sync, threadpool)

Bases: object

Encapsulation of the write context for servicing PUT REST API requests. Serves as the context manager object for the swift.obj.diskfile.DiskFile class’s swift.obj.diskfile.DiskFile.create() method.

Note

It is the responsibility of the swift.obj.diskfile.DiskFile.create() method context manager to close the open file descriptor.

Note

The arguments to the constructor are considered implementation specific. The API does not define the constructor arguments.

Parameters:
  • name – name of object from REST API
  • datadir – on-disk directory object will end up in on swift.obj.diskfile.DiskFileWriter.put()
  • fd – open file descriptor of temporary file to receive data
  • tmppath – full path name of the opened file descriptor
  • bytes_per_sync – number bytes written between sync calls
  • threadpool – internal thread pool to use for disk operations
put(metadata)

Finalize writing the file on disk.

For this implementation, this method is responsible for renaming the temporary file to the final name and directory location. This method should be called after the final call to swift.obj.diskfile.DiskFileWriter.write().

Parameters:metadata – dictionary of metadata to be associated with the object
write(chunk)

Write a chunk of data to disk. All invocations of this method must come before invoking the :func:

For this implementation, the data is written into a temporary file.

Parameters:chunk – the chunk of data to write as a string object
Returns:the total number of bytes written to an object
swift.obj.diskfile.get_hashes(partition_dir, recalculate=None, do_listdir=False, reclaim_age=604800)

Get a list of hashes for the suffix dir. do_listdir causes it to mistrust the hash cache for suffix existence at the (unexpectedly high) cost of a listdir. reclaim_age is just passed on to hash_suffix.

Parameters:
  • partition_dir – absolute path of partition to get hashes for
  • recalculate – list of suffixes which should be recalculated when got
  • do_listdir – force existence check for all hashes in the partition
  • reclaim_age – age at which to remove tombstones
Returns:

tuple of (number of suffix dirs hashed, dictionary of hashes)

swift.obj.diskfile.hash_cleanup_listdir(hsh_path, reclaim_age=604800)

List contents of a hash directory and clean up any old files.

Parameters:
  • hsh_path – object hash path
  • reclaim_age – age in seconds at which to remove tombstones
Returns:

list of files remaining in the directory, reverse sorted

swift.obj.diskfile.hash_suffix(path, reclaim_age)

Performs reclamation and returns an md5 of all (remaining) files.

Parameters:

reclaim_age – age in seconds at which to remove tombstones

Raises:
  • PathNotDir – if given path is not a valid directory
  • OSError – for non-ENOTDIR errors
swift.obj.diskfile.invalidate_hash(suffix_dir)

Invalidates the hash for a suffix_dir in the partition’s hashes file.

Parameters:suffix_dir – absolute path to suffix dir whose hash needs invalidating
swift.obj.diskfile.quarantine_renamer(device_path, corrupted_file_path)

In the case that a file is corrupted, move it to a quarantined area to allow replication to fix it.

Params device_path:
 The path to the device the corrupted file is on.
Params corrupted_file_path:
 The path to the file you want quarantined.
Returns:path (str) of directory the file was moved to
Raises OSError:re-raises non errno.EEXIST / errno.ENOTEMPTY exceptions from rename
swift.obj.diskfile.read_metadata(fd)

Helper function to read the pickled metadata from an object file.

Parameters:fd – file descriptor or filename to load the metadata from
Returns:dictionary of metadata
swift.obj.diskfile.write_metadata(fd, metadata)

Helper function to write pickled metadata for an object file.

Parameters:
  • fd – file descriptor or filename to write the metadata
  • metadata – metadata to write