Skip to main content

MmdbFileReader

Struct MmdbFileReader 

pub struct MmdbFileReader { /* private fields */ }
Available on crate feature net only.
Expand description

A MaxMind DB reader that reads the file through positional reads.

Nothing is mapped and nothing beyond the metadata, the jump table and the optional BlockCache is held in memory, so modifying the file is never undefined behaviour, unlike for a memory map. Lookups return owned GeoLocations.

§Reload

A reader opened on a path follows the file that path names:

  • At most once per check interval a lookup stats the path (following symlinks). If the file identity (see FileIdentity) differs from the loaded one, the file is reopened.
  • A read that comes up short within the size seen at open, or a stale handle, also triggers a reopen.

One lookup reopens, others keep using the loaded version and never wait. A new file is validated before it replaces the loaded version; if it fails the loaded version stays, a warning is logged once for that file, and it is retried only when the path names a different file or after a back-off (1 s, doubling, capped at the check interval). Each version owns its own handles, jump table and cache, and stays alive while any lookup that loaded it is running. Usually two versions overlap briefly during a swap; lookups that run across several swaps keep each version they loaded, so more than two can be alive at once.

Update the file by renaming a complete new file over it, as geoipupdate and Kubernetes volume updates do. Rewriting the file in place is not supported: until the change is noticed lookups may return None or wrong values, though never undefined behaviour. Changes are noticed only after the check interval plus any attribute caching of the filesystem (up to 60 s on NFS). A process that does no lookups does not check, so it keeps the replaced file (and its disk blocks) open until it does.

On Windows the rename must be one that may replace an open file: MoveFileExW with MOVEFILE_REPLACE_EXISTING, which many runtimes use for their rename or move, fails with ERROR_ACCESS_DENIED while this reader holds the file open. std::fs::rename falls back to a POSIX semantics rename (NTFS, Windows 10 1809 and later), which works. With other tools, first rename the old file away, then the new one into place. See FileIdentity for which replacements are visible.

§Blocking

Lookups read the file with blocking positional reads; see the blocking section of ReadAt for why that is accepted on async workers.

Implementations§

§

impl MmdbFileReader

pub fn open(path: impl AsRef<Path>) -> Result<MmdbFileReader, GeoIpError>

Open the database at path with the default MmdbFileConfig.

§Errors

Returns GeoIpError::Io if the file cannot be opened or is not a regular file, or another GeoIpError if it is not a valid database.

pub fn open_with_config( path: impl AsRef<Path>, config: MmdbFileConfig, ) -> Result<MmdbFileReader, GeoIpError>

Open the database at path with config.

§Errors

Same as Self::open.

pub fn from_read_at( src: impl ReadAt + Send + Sync + 'static, config: MmdbFileConfig, ) -> Result<MmdbFileReader, GeoIpError>

Read the database from any ReadAt source, such as an in-memory buffer. The source is never reloaded.

§Errors

Returns GeoIpError if the source cannot be read or is not a valid database.

pub fn with_language(self, lang: impl Into<Box<str>>) -> MmdbFileReader

Set the preferred language code used to resolve localised names (default "en"), falling back to English.

pub fn path(&self) -> Option<&Path>

The path this reader follows, if it was opened from one.

pub fn metadata(&self) -> Metadata

The Metadata of the currently loaded version.

pub fn lookup(&self, ip: IpAddr) -> Option<GeoLocation>

Look up ip, returning its record if present.

IPv4-mapped IPv6 inputs are canonicalised to IPv4 first. This is best-effort: corruption, I/O errors and a file that changed under the reader all yield None. Use Self::try_lookup to observe them.

pub fn try_lookup(&self, ip: IpAddr) -> Result<Option<GeoLocation>, GeoIpError>

Like Self::lookup, but reports errors.

§Errors

Returns GeoIpError::Corrupt if the database is structurally invalid for ip, GeoIpError::SourceChanged if the file changed and no newer version could be loaded by this call, or GeoIpError::Io for another read error.

Trait Implementations§

§

impl Clone for MmdbFileReader

§

fn clone(&self) -> MmdbFileReader

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for MmdbFileReader

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl From<MmdbFileReader> for GeoReader

§

fn from(reader: MmdbFileReader) -> GeoReader

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self> ⓘ

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a rama_grpc::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
§

impl<T, U> RamaFrom<T> for U
where U: From<T>,

§

fn rama_from(value: T) -> U

§

impl<T, U, CrateMarker> RamaInto<U, CrateMarker> for T
where U: RamaFrom<T, CrateMarker>,

§

fn rama_into(self) -> U

§

impl<T, U> RamaTryFrom<T> for U
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

§

fn rama_try_from(value: T) -> Result<U, <U as RamaTryFrom<T>>::Error>

§

impl<T, U, CrateMarker> RamaTryInto<U, CrateMarker> for T
where U: RamaTryFrom<T, CrateMarker>,

§

type Error = <U as RamaTryFrom<T, CrateMarker>>::Error

§

fn rama_try_into(self) -> Result<U, <U as RamaTryFrom<T, CrateMarker>>::Error>

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<V, F> ValueFormatter<&V> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &&V)

Write value to writer
§

impl<V, F> ValueFormatter<Arc<V>> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Arc<V>)

Write value to writer
§

impl<V, F> ValueFormatter<Box<V>> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Box<V>)

Write value to writer
§

impl<V, F> ValueFormatter<Cow<'_, V>> for F
where V: ToOwned + ?Sized, F: ValueFormatter<V> + ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Cow<'_, V>)

Write value to writer
§

impl<V, F> ValueFormatter<Option<V>> for F
where F: ValueFormatter<V> + ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Option<V>)

Write value to writer
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more