mirror of
https://github.com/containers/podman.git
synced 2025-08-06 03:19:52 +08:00

Also, do a general cleanup of all the timeout code. Changes include: - Convert from int to *uint where possible. Timeouts cannot be negative, hence the uint change; and a timeout of 0 is valid, so we need a new way to detect that the user set a timeout (hence, pointer). - Change name in the database to avoid conflicts between new data type and old one. This will cause timeouts set with 4.2.0 to be lost, but considering nobody is using the feature at present (and the lack of validation means we could have invalid, negative timeouts in the DB) this feels safe. - Ensure volume plugin timeouts can only be used with volumes created using a plugin. Timeouts on the local driver are nonsensical. - Remove the existing test, as it did not use a volume plugin. Write a new test that does. The actual plumbing of the containers.conf timeout in is one line in volume_api.go; the remainder are the above-described cleanups. Signed-off-by: Matthew Heon <mheon@redhat.com>
219 lines
8.0 KiB
Go
219 lines
8.0 KiB
Go
package winapi
|
|
|
|
import (
|
|
"unsafe"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
// Messages that can be received from an assigned io completion port.
|
|
// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_associate_completion_port
|
|
const (
|
|
JOB_OBJECT_MSG_END_OF_JOB_TIME uint32 = 1
|
|
JOB_OBJECT_MSG_END_OF_PROCESS_TIME uint32 = 2
|
|
JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT uint32 = 3
|
|
JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO uint32 = 4
|
|
JOB_OBJECT_MSG_NEW_PROCESS uint32 = 6
|
|
JOB_OBJECT_MSG_EXIT_PROCESS uint32 = 7
|
|
JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS uint32 = 8
|
|
JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT uint32 = 9
|
|
JOB_OBJECT_MSG_JOB_MEMORY_LIMIT uint32 = 10
|
|
JOB_OBJECT_MSG_NOTIFICATION_LIMIT uint32 = 11
|
|
)
|
|
|
|
// Access rights for creating or opening job objects.
|
|
//
|
|
// https://docs.microsoft.com/en-us/windows/win32/procthread/job-object-security-and-access-rights
|
|
const (
|
|
JOB_OBJECT_QUERY = 0x0004
|
|
JOB_OBJECT_ALL_ACCESS = 0x1F001F
|
|
)
|
|
|
|
// IO limit flags
|
|
//
|
|
// https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/ns-jobapi2-jobobject_io_rate_control_information
|
|
const JOB_OBJECT_IO_RATE_CONTROL_ENABLE = 0x1
|
|
|
|
const JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE uint32 = 0x1
|
|
|
|
// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_cpu_rate_control_information
|
|
const (
|
|
JOB_OBJECT_CPU_RATE_CONTROL_ENABLE uint32 = 1 << iota
|
|
JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED
|
|
JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP
|
|
JOB_OBJECT_CPU_RATE_CONTROL_NOTIFY
|
|
JOB_OBJECT_CPU_RATE_CONTROL_MIN_MAX_RATE
|
|
)
|
|
|
|
// JobObjectInformationClass values. Used for a call to QueryInformationJobObject
|
|
//
|
|
// https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/nf-jobapi2-queryinformationjobobject
|
|
const (
|
|
JobObjectBasicAccountingInformation uint32 = 1
|
|
JobObjectBasicProcessIdList uint32 = 3
|
|
JobObjectBasicAndIoAccountingInformation uint32 = 8
|
|
JobObjectLimitViolationInformation uint32 = 13
|
|
JobObjectMemoryUsageInformation uint32 = 28
|
|
JobObjectNotificationLimitInformation2 uint32 = 33
|
|
JobObjectIoAttribution uint32 = 42
|
|
)
|
|
|
|
// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_limit_information
|
|
type JOBOBJECT_BASIC_LIMIT_INFORMATION struct {
|
|
PerProcessUserTimeLimit int64
|
|
PerJobUserTimeLimit int64
|
|
LimitFlags uint32
|
|
MinimumWorkingSetSize uintptr
|
|
MaximumWorkingSetSize uintptr
|
|
ActiveProcessLimit uint32
|
|
Affinity uintptr
|
|
PriorityClass uint32
|
|
SchedulingClass uint32
|
|
}
|
|
|
|
// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_cpu_rate_control_information
|
|
type JOBOBJECT_CPU_RATE_CONTROL_INFORMATION struct {
|
|
ControlFlags uint32
|
|
Value uint32
|
|
}
|
|
|
|
// https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/ns-jobapi2-jobobject_io_rate_control_information
|
|
type JOBOBJECT_IO_RATE_CONTROL_INFORMATION struct {
|
|
MaxIops int64
|
|
MaxBandwidth int64
|
|
ReservationIops int64
|
|
BaseIOSize uint32
|
|
VolumeName string
|
|
ControlFlags uint32
|
|
}
|
|
|
|
// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_process_id_list
|
|
type JOBOBJECT_BASIC_PROCESS_ID_LIST struct {
|
|
NumberOfAssignedProcesses uint32
|
|
NumberOfProcessIdsInList uint32
|
|
ProcessIdList [1]uintptr
|
|
}
|
|
|
|
// AllPids returns all the process Ids in the job object.
|
|
func (p *JOBOBJECT_BASIC_PROCESS_ID_LIST) AllPids() []uintptr {
|
|
return (*[(1 << 27) - 1]uintptr)(unsafe.Pointer(&p.ProcessIdList[0]))[:p.NumberOfProcessIdsInList:p.NumberOfProcessIdsInList]
|
|
}
|
|
|
|
// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_accounting_information
|
|
type JOBOBJECT_BASIC_ACCOUNTING_INFORMATION struct {
|
|
TotalUserTime int64
|
|
TotalKernelTime int64
|
|
ThisPeriodTotalUserTime int64
|
|
ThisPeriodTotalKernelTime int64
|
|
TotalPageFaultCount uint32
|
|
TotalProcesses uint32
|
|
ActiveProcesses uint32
|
|
TotalTerminateProcesses uint32
|
|
}
|
|
|
|
//https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_and_io_accounting_information
|
|
type JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION struct {
|
|
BasicInfo JOBOBJECT_BASIC_ACCOUNTING_INFORMATION
|
|
IoInfo windows.IO_COUNTERS
|
|
}
|
|
|
|
// typedef struct _JOBOBJECT_MEMORY_USAGE_INFORMATION {
|
|
// ULONG64 JobMemory;
|
|
// ULONG64 PeakJobMemoryUsed;
|
|
// } JOBOBJECT_MEMORY_USAGE_INFORMATION, *PJOBOBJECT_MEMORY_USAGE_INFORMATION;
|
|
//
|
|
type JOBOBJECT_MEMORY_USAGE_INFORMATION struct {
|
|
JobMemory uint64
|
|
PeakJobMemoryUsed uint64
|
|
}
|
|
|
|
// typedef struct _JOBOBJECT_IO_ATTRIBUTION_STATS {
|
|
// ULONG_PTR IoCount;
|
|
// ULONGLONG TotalNonOverlappedQueueTime;
|
|
// ULONGLONG TotalNonOverlappedServiceTime;
|
|
// ULONGLONG TotalSize;
|
|
// } JOBOBJECT_IO_ATTRIBUTION_STATS, *PJOBOBJECT_IO_ATTRIBUTION_STATS;
|
|
//
|
|
type JOBOBJECT_IO_ATTRIBUTION_STATS struct {
|
|
IoCount uintptr
|
|
TotalNonOverlappedQueueTime uint64
|
|
TotalNonOverlappedServiceTime uint64
|
|
TotalSize uint64
|
|
}
|
|
|
|
// typedef struct _JOBOBJECT_IO_ATTRIBUTION_INFORMATION {
|
|
// ULONG ControlFlags;
|
|
// JOBOBJECT_IO_ATTRIBUTION_STATS ReadStats;
|
|
// JOBOBJECT_IO_ATTRIBUTION_STATS WriteStats;
|
|
// } JOBOBJECT_IO_ATTRIBUTION_INFORMATION, *PJOBOBJECT_IO_ATTRIBUTION_INFORMATION;
|
|
//
|
|
type JOBOBJECT_IO_ATTRIBUTION_INFORMATION struct {
|
|
ControlFlags uint32
|
|
ReadStats JOBOBJECT_IO_ATTRIBUTION_STATS
|
|
WriteStats JOBOBJECT_IO_ATTRIBUTION_STATS
|
|
}
|
|
|
|
// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_associate_completion_port
|
|
type JOBOBJECT_ASSOCIATE_COMPLETION_PORT struct {
|
|
CompletionKey windows.Handle
|
|
CompletionPort windows.Handle
|
|
}
|
|
|
|
// BOOL IsProcessInJob(
|
|
// HANDLE ProcessHandle,
|
|
// HANDLE JobHandle,
|
|
// PBOOL Result
|
|
// );
|
|
//
|
|
//sys IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *int32) (err error) = kernel32.IsProcessInJob
|
|
|
|
// BOOL QueryInformationJobObject(
|
|
// HANDLE hJob,
|
|
// JOBOBJECTINFOCLASS JobObjectInformationClass,
|
|
// LPVOID lpJobObjectInformation,
|
|
// DWORD cbJobObjectInformationLength,
|
|
// LPDWORD lpReturnLength
|
|
// );
|
|
//
|
|
//sys QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo unsafe.Pointer, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) = kernel32.QueryInformationJobObject
|
|
|
|
// HANDLE OpenJobObjectW(
|
|
// DWORD dwDesiredAccess,
|
|
// BOOL bInheritHandle,
|
|
// LPCWSTR lpName
|
|
// );
|
|
//
|
|
//sys OpenJobObject(desiredAccess uint32, inheritHandle bool, lpName *uint16) (handle windows.Handle, err error) = kernel32.OpenJobObjectW
|
|
|
|
// DWORD SetIoRateControlInformationJobObject(
|
|
// HANDLE hJob,
|
|
// JOBOBJECT_IO_RATE_CONTROL_INFORMATION *IoRateControlInfo
|
|
// );
|
|
//
|
|
//sys SetIoRateControlInformationJobObject(jobHandle windows.Handle, ioRateControlInfo *JOBOBJECT_IO_RATE_CONTROL_INFORMATION) (ret uint32, err error) = kernel32.SetIoRateControlInformationJobObject
|
|
|
|
// DWORD QueryIoRateControlInformationJobObject(
|
|
// HANDLE hJob,
|
|
// PCWSTR VolumeName,
|
|
// JOBOBJECT_IO_RATE_CONTROL_INFORMATION **InfoBlocks,
|
|
// ULONG *InfoBlockCount
|
|
// );
|
|
//sys QueryIoRateControlInformationJobObject(jobHandle windows.Handle, volumeName *uint16, ioRateControlInfo **JOBOBJECT_IO_RATE_CONTROL_INFORMATION, infoBlockCount *uint32) (ret uint32, err error) = kernel32.QueryIoRateControlInformationJobObject
|
|
|
|
// NTSTATUS
|
|
// NtOpenJobObject (
|
|
// _Out_ PHANDLE JobHandle,
|
|
// _In_ ACCESS_MASK DesiredAccess,
|
|
// _In_ POBJECT_ATTRIBUTES ObjectAttributes
|
|
// );
|
|
//sys NtOpenJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) = ntdll.NtOpenJobObject
|
|
|
|
// NTSTATUS
|
|
// NTAPI
|
|
// NtCreateJobObject (
|
|
// _Out_ PHANDLE JobHandle,
|
|
// _In_ ACCESS_MASK DesiredAccess,
|
|
// _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
|
|
// );
|
|
//sys NtCreateJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) = ntdll.NtCreateJobObject
|