core/file_server/event/Event.h (117 lines of code) (raw):

/* * Copyright 2022 iLogtail Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <stdint.h> #include <string> #include "common/DevInode.h" namespace logtail { typedef uint32_t EventType; #define EVENT_TIMEOUT (1) #define EVENT_CREATE (2) #define EVENT_MODIFY (4) #define EVENT_ISDIR (8) #define EVENT_OVERFLOW (16) #define EVENT_MOVE_FROM (32) #define EVENT_MOVE_TO (64) #define EVENT_DELETE (128) #define EVENT_CONTAINER_STOPPED (256) #define EVENT_READER_FLUSH_TIMEOUT (512) class Event { private: std::string mSource; // path of file or dir std::string mObject; // the object who has changed EventType mType; int mWd; uint32_t mCookie; uint64_t mDev; uint64_t mInode; int64_t mHashKey; std::string mConfigName; std::string mContainerID; // for read timeout int64_t mLastReadPos; int64_t mLastFilePos; public: Event(const std::string& source, const std::string& object, EventType type, int wd, uint32_t cookie = 0) : mSource(source), mObject(object), mType(type), mWd(wd), mCookie(cookie), mDev(NO_BLOCK_DEV), mInode(NO_BLOCK_INODE) {} Event(const std::string& source, const std::string& object, EventType type, int wd, uint32_t cookie, uint64_t dev, uint64_t inode) : mSource(source), mObject(object), mType(type), mWd(wd), mCookie(cookie), mDev(dev), mInode(inode) {} static bool CompareByFullPath(const Event* lhs, const Event* rhs) { std::string lhsPath(lhs->mSource); lhsPath.append("/").append(lhs->mObject); std::string rhsPath(rhs->mSource); rhsPath.append("/").append(rhs->mObject); size_t lhsLen = lhsPath.length(); size_t rhsLen = rhsPath.length(); if (lhsLen < rhsLen) { return false; } if (lhsLen > rhsLen) { return true; } return lhsPath > rhsPath; } const std::string& GetSource() const { return mSource; } const std::string& GetObject() const { return mObject; } // GetObject_ is the same as GetObject, but used to avoid compilation failure on Windows. const std::string& GetObject_() const { return mObject; } EventType GetType() const { return mType; } uint64_t GetDev() const { return mDev; } uint64_t GetInode() const { return mInode; } int GetWd() const { return mWd; } const uint32_t GetCookie() const { return mCookie; } int64_t GetHashKey() { return mHashKey; } const std::string& GetConfigName() const { return mConfigName; } const std::string& GetContainerID() const { return mContainerID; } int64_t GetLastReadPos() const { return mLastReadPos; } int64_t GetLastFilePos() const { return mLastFilePos; } void SetSource(const std::string& source) { mSource = source; } void SetDev(uint64_t dev) { mDev = dev; } void SetInode(uint64_t inode) { mInode = inode; } void SetHashKey(int64_t hashKey) { mHashKey = hashKey; } void SetConfigName(const std::string& configName) { mConfigName = configName; } void SetContainerID(const std::string& containerID) { mContainerID = containerID; } void SetLastReadPos(int64_t lastReadPos) { mLastReadPos = lastReadPos; } void SetLastFilePos(int64_t lastFilePos) { mLastFilePos = lastFilePos; } bool IsCreate() const { return mType & EVENT_CREATE; } bool IsModify() const { return mType & EVENT_MODIFY; } bool IsDir() const { return mType & EVENT_ISDIR; } // Check if event buffer is overflow. bool IsOverflow() const { return mType & EVENT_OVERFLOW; } bool IsTimeout() const { return mType & EVENT_TIMEOUT; } bool IsMoveFrom() const { return mType & EVENT_MOVE_FROM; } bool IsMoveTo() const { return mType & EVENT_MOVE_TO; } bool IsDeleted() const { return mType & EVENT_DELETE; } bool IsContainerStopped() const { return mType & EVENT_CONTAINER_STOPPED; } bool IsReaderFlushTimeout() const { return mType & EVENT_READER_FLUSH_TIMEOUT; } std::string GetTypeString() const { std::string type; if (IsDir()) { type = "ISDIR | "; } if (IsCreate()) { type += "CREATE"; } else if (IsModify()) { type += "MODIFY"; } else if (IsMoveFrom()) { type += "MOVED_FROM"; } else if (IsMoveTo()) { type += "MOVED_TO"; } else if (IsDeleted()) { type += "DELETE"; } else if (IsTimeout()) { type += "DELETE_SELF"; } else if (IsContainerStopped()) { type += "CONTAINER_STOPPED"; } return type; } }; } // namespace logtail