1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00
samba-mirror/source3/librpc/idl/open_files.idl
Jeremy Allison 13b6199a2f s3: locking: Add a memcache based lock cache.
Based on an idea by Volker to optimize cpu usage when
parsing struct share_mode_data entries.

Add a 64-bit sequence number to the share mode entry,
and after the entry is stored back in the db, cache
the in-memory version using talloc reparenting into the
memcache. The memcache key used is the same struct file_id
used as the key into the locking db.

On read, check if the locking db version sequence number
matches the in-memory cache, and if so reparent the
memcache version back onto the required memory context.

Saves all the ndr decoding when multiple accesses to the
same lock entry happen in succession.

Design also improved by Metze and Ira.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ira Cooper <ira@samba.org>

Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Fri Apr 17 22:38:34 CEST 2015 on sn-devel-104
2015-04-17 22:38:34 +02:00

135 lines
3.7 KiB
Plaintext

#include "idl_types.h"
import "server_id.idl";
import "security.idl";
import "file_id.idl";
import "smb2_lease_struct.idl";
import "misc.idl";
[
pointer_default(unique)
]
interface open_files
{
typedef [public,flag(NDR_PAHEX)] struct {
GUID client_guid;
smb2_lease_key lease_key;
smb2_lease_state current_state;
/*
* 'breaking' indicates that we're waiting
* for a lease break ack from the client
* and breaking_to_requested and breaking_to_required
* have a meaning.
*
* breaking_to_requested is the value already sent to
* the client, the client needs to ack to this (or less).
*
* breaking_to_required is the internal value that needs to
* be reached before we can reset breaking = false, this
* may requires multiple roundtrips to the client, e.g.
* when the lease broken to a more reduced value, while
* the lease break is still in progress.
*
* The following can be assumed (if breaking == true):
*
* current_state > breaking_to_requested >= breaking_to_required
*/
boolean8 breaking;
smb2_lease_state breaking_to_requested;
smb2_lease_state breaking_to_required;
uint16 lease_version;
uint16 epoch;
} share_mode_lease;
typedef [public] struct {
server_id pid;
hyper op_mid;
uint16 op_type;
uint32 lease_idx;
uint32 access_mask;
uint32 share_access;
uint32 private_options;
timeval time;
file_id id;
udlong share_file_id;
uint32 uid;
uint16 flags;
uint32 name_hash;
/*
* In-memory flag indicating a non-existing pid. We don't want
* to store this share_mode_entry on disk.
*/
[skip] boolean8 stale;
[skip] share_mode_lease *lease;
} share_mode_entry;
typedef [public] struct {
uint32 name_hash;
security_token *delete_nt_token;
security_unix_token *delete_token;
} delete_token;
typedef [public] struct {
hyper sequence_number;
[string,charset(UTF8)] char *servicepath;
[string,charset(UTF8)] char *base_name;
[string,charset(UTF8)] char *stream_name;
uint32 num_share_modes;
[size_is(num_share_modes)] share_mode_entry share_modes[];
uint32 num_leases;
[size_is(num_leases)] share_mode_lease leases[];
uint32 num_delete_tokens;
[size_is(num_delete_tokens)] delete_token delete_tokens[];
timespec old_write_time;
timespec changed_write_time;
[skip] boolean8 fresh;
[skip] boolean8 modified;
[ignore] db_record *record;
[ignore] file_id id; /* In memory key used to lookup cache. */
} share_mode_data;
/* these are 0x30 (48) characters */
const string VFS_DEFAULT_DURABLE_COOKIE_MAGIC =
"VFS_DEFAULT_DURABLE_COOKIE_MAGIC ";
const uint32 VFS_DEFAULT_DURABLE_COOKIE_VERSION = 0;
/* this corresponds to struct stat_ex (SMB_STRUCT_STAT) */
typedef struct {
hyper st_ex_dev;
hyper st_ex_ino;
hyper st_ex_mode;
hyper st_ex_nlink;
hyper st_ex_uid;
hyper st_ex_gid;
hyper st_ex_rdev;
hyper st_ex_size;
timespec st_ex_atime;
timespec st_ex_mtime;
timespec st_ex_ctime;
timespec st_ex_btime;
boolean8 st_ex_calculated_birthtime;
hyper st_ex_blksize;
hyper st_ex_blocks;
uint32 st_ex_flags;
uint32 st_ex_mask;
} vfs_default_durable_stat;
typedef [public] struct {
[value(VFS_DEFAULT_DURABLE_COOKIE_MAGIC),charset(DOS)] uint8 magic[0x30];
[value(VFS_DEFAULT_DURABLE_COOKIE_VERSION)] uint32 version;
boolean8 allow_reconnect;
file_id id;
[string,charset(UTF8)] char *servicepath;
[string,charset(UTF8)] char *base_name;
hyper initial_allocation_size;
hyper position_information;
boolean8 update_write_time_triggered;
boolean8 update_write_time_on_close;
boolean8 write_time_forced;
timespec close_write_time;
vfs_default_durable_stat stat_info;
} vfs_default_durable_cookie;
}