udplib.hpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*##############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems®.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. #ifndef UDPMSGPK_INCL
  14. #define UDPMSGPK_INCL
  15. #include "jiface.hpp"
  16. #include "jstring.hpp"
  17. #include "jisem.hpp"
  18. #include "jsocket.hpp"
  19. #include "roxiemem.hpp"
  20. #ifdef _WIN32
  21. #ifdef UDPLIB_EXPORTS
  22. #define UDPLIB_API __declspec(dllexport)
  23. #else
  24. #define UDPLIB_API __declspec(dllimport)
  25. #endif
  26. #else
  27. #define UDPLIB_API
  28. #endif
  29. typedef unsigned ruid_t; // at 1000/sec recycle every 49 days
  30. #define RUIDF "0x%.8x"
  31. #define RUID_PING 0
  32. #define RUID_DISCARD 1
  33. #define RUID_FIRST 2
  34. typedef unsigned RecordLengthType;
  35. #define MAX_RECORD_LENGTH 0xffffffff
  36. interface IMessagePacker : extends IInterface
  37. {
  38. virtual void *getBuffer(unsigned len, bool variable) = 0;
  39. virtual void putBuffer(const void *buf, unsigned len, bool variable) = 0;
  40. virtual void flush(bool last_message = false) = 0;
  41. virtual bool dataQueued() = 0;
  42. virtual void sendMetaInfo(const void *buf, unsigned len) = 0;
  43. virtual unsigned size() const = 0; // Total amount written via putBuffer plus any overhead from record length prefixes
  44. // Notes:
  45. // 1. Parameters to putBuffer must have been returned from getBuffer.
  46. // 2 putBuffer must me called before any call to flush
  47. // 3. There is an implicit abort if is released without final flush
  48. // 4 This interface is single threaded
  49. // 5. call to getbuffer, without call to makes the previous call to getBuffer and NULL operation
  50. // 6. if flush has been called with last_message true, then any calls to getBuffer or putBuffer is undefined.
  51. };
  52. interface IException;
  53. interface IMessageUnpackCursor : extends IInterface
  54. {
  55. virtual const void *getNext(int length) = 0;
  56. virtual bool atEOF() const = 0;
  57. virtual bool isSerialized() const = 0;
  58. // if one tries to read past the last record then NULL will be returned,
  59. // if one asks for more data than available then throws exception.
  60. };
  61. interface IMessageResult : extends IInterface
  62. {
  63. virtual IMessageUnpackCursor *getCursor(roxiemem::IRowManager *rowMgr) const = 0;
  64. virtual const void *getMessageHeader(unsigned &length) const = 0;
  65. virtual const void *getMessageMetadata(unsigned &length) const = 0;
  66. virtual void discard() const = 0;
  67. };
  68. interface IMessageCollator : extends IInterface
  69. {
  70. virtual IMessageResult *getNextResult(unsigned time_out, bool &anyActivity) = 0;
  71. virtual void interrupt(IException *E = NULL) = 0;
  72. virtual ruid_t queryRUID() const = 0;
  73. virtual unsigned queryBytesReceived() const = 0;
  74. virtual bool add_package(roxiemem::DataBuffer *dataBuff) = 0;
  75. };
  76. interface IReceiveManager : extends IInterface
  77. {
  78. virtual IMessageCollator *createMessageCollator(roxiemem::IRowManager *rowManager, ruid_t ruid) = 0;
  79. virtual void detachCollator(const IMessageCollator *collator) = 0;
  80. virtual void setDefaultCollator(IMessageCollator *collator) = 0;
  81. };
  82. interface ISendManager : extends IInterface
  83. {
  84. virtual IMessagePacker *createMessagePacker(ruid_t id, unsigned sequence, const void *messageHeader, unsigned headerSize, unsigned destNodeIndex, int queue) = 0;
  85. virtual bool dataQueued(ruid_t ruid, unsigned sequence, unsigned destNodeIndex) = 0;
  86. virtual bool abortData(ruid_t ruid, unsigned sequence, unsigned destNodeIndex) = 0;
  87. virtual bool allDone() = 0;
  88. virtual void writeOwn(unsigned destNodeIndex, roxiemem::DataBuffer *buffer, unsigned len, unsigned queue) = 0; // NOTE: takes ownership of the DataBuffer
  89. };
  90. extern UDPLIB_API IReceiveManager *createReceiveManager(int server_flow_port, int data_port, int client_flow_port, int sniffer_port, const IpAddress &sniffer_multicast_ip, int queue_size, unsigned maxSlotsPerSender, unsigned myNodeIndex);
  91. extern UDPLIB_API ISendManager *createSendManager(int server_flow_port, int data_port, int client_flow_port, int sniffer_port, const IpAddress &sniffer_multicast_ip, int queue_size_pr_server, int queues_pr_server, unsigned maxRetryData, TokenBucket *rateLimiter, unsigned myNodeIndex);
  92. extern UDPLIB_API IMessagePacker *createMessagePacker(ruid_t ruid, unsigned msgId, const void *messageHeader, unsigned headerSize, ISendManager &_parent, unsigned _destNode, unsigned _sourceNode, unsigned _msgSeq, unsigned _queue);
  93. extern UDPLIB_API const IpAddress &getNodeAddress(unsigned index);
  94. extern UDPLIB_API unsigned addRoxieNode(const char *ipString);
  95. extern UDPLIB_API unsigned getNumNodes();
  96. extern UDPLIB_API atomic_t unwantedDiscarded;
  97. extern UDPLIB_API atomic_t packetsRetried;
  98. extern UDPLIB_API atomic_t packetsAbandoned;
  99. extern UDPLIB_API unsigned udpTraceLevel;
  100. extern UDPLIB_API unsigned udpTraceCategories;
  101. extern UDPLIB_API unsigned udpOutQsPriority;
  102. extern UDPLIB_API void queryMemoryPoolStats(StringBuffer &memStats);
  103. extern UDPLIB_API unsigned multicastTTL;
  104. #ifdef __linux__
  105. extern UDPLIB_API void setLinuxThreadPriority(int level);
  106. #endif
  107. extern UDPLIB_API unsigned udpFlowSocketsSize;
  108. extern UDPLIB_API unsigned udpLocalWriteSocketSize;
  109. extern UDPLIB_API unsigned udpMaxRetryTimedoutReqs;
  110. extern UDPLIB_API unsigned udpRequestToSendTimeout;
  111. extern UDPLIB_API unsigned udpRetryBusySenders;
  112. extern UDPLIB_API unsigned udpInlineCollationPacketLimit;
  113. extern UDPLIB_API bool udpInlineCollation;
  114. extern UDPLIB_API bool udpSnifferEnabled;
  115. extern UDPLIB_API bool udpSendCompletedInData;
  116. extern UDPLIB_API unsigned udpSnifferReadThreadPriority;
  117. extern UDPLIB_API unsigned udpSnifferSendThreadPriority;
  118. #endif