2323import org .apache .iotdb .common .rpc .thrift .TSStatus ;
2424import org .apache .iotdb .commons .exception .IoTDBRuntimeException ;
2525import org .apache .iotdb .commons .executable .ExecutableManager ;
26+ import org .apache .iotdb .commons .executable .ReferenceCountedJarMetaKeeper ;
2627import org .apache .iotdb .commons .snapshot .SnapshotProcessor ;
2728import org .apache .iotdb .commons .udf .UDFInformation ;
2829import org .apache .iotdb .commons .udf .UDFTable ;
4142import org .apache .iotdb .rpc .TSStatusCode ;
4243import org .apache .iotdb .udf .api .exception .UDFManagementException ;
4344
44- import org .apache .tsfile .utils .ReadWriteIOUtils ;
4545import org .slf4j .Logger ;
4646import org .slf4j .LoggerFactory ;
4747
5454import java .nio .ByteBuffer ;
5555import java .util .ArrayList ;
5656import java .util .Collections ;
57- import java .util .HashMap ;
5857import java .util .List ;
5958import java .util .Map ;
6059import java .util .concurrent .locks .ReentrantLock ;
@@ -67,8 +66,7 @@ public class UDFInfo implements SnapshotProcessor {
6766 ConfigNodeDescriptor .getInstance ().getConf ();
6867
6968 private final UDFTable udfTable ;
70- private final Map <String , String > existedJarToMD5 ;
71- private final Map <String , Integer > existedJarToReferenceCount ;
69+ private final ReferenceCountedJarMetaKeeper jarMetaKeeper ;
7270
7371 private final UDFExecutableManager udfExecutableManager ;
7472
@@ -78,8 +76,7 @@ public class UDFInfo implements SnapshotProcessor {
7876
7977 public UDFInfo () throws IOException {
8078 udfTable = new UDFTable ();
81- existedJarToMD5 = new HashMap <>();
82- existedJarToReferenceCount = new HashMap <>();
79+ jarMetaKeeper = new ReferenceCountedJarMetaKeeper ();
8380 udfExecutableManager =
8481 UDFExecutableManager .setupAndGetInstance (
8582 CONFIG_NODE_CONF .getUdfTemporaryLibDir (), CONFIG_NODE_CONF .getUdfDir ());
@@ -106,7 +103,8 @@ public void validate(Model model, String udfName, String jarName, String jarMD5)
106103 TSStatusCode .UDF_ALREADY_EXISTS .getStatusCode ());
107104 }
108105
109- if (existedJarToMD5 .containsKey (jarName ) && !existedJarToMD5 .get (jarName ).equals (jarMD5 )) {
106+ if (jarMetaKeeper .containsJar (jarName )
107+ && !jarMetaKeeper .jarNameExistsAndMatchesMd5 (jarName , jarMD5 )) {
110108 throw new IoTDBRuntimeException (
111109 String .format (
112110 ConfigNodeMessages .FAILED_TO_CREATE_UDF_THE_SAME_NAME_JAR_BUT_DIFFERENT ,
@@ -129,7 +127,7 @@ public UDFInformation getUDFInformation(Model model, String udfName)
129127 }
130128
131129 public boolean needToSaveJar (String jarName ) {
132- return ! existedJarToMD5 . containsKey (jarName );
130+ return jarMetaKeeper . needToSaveJar (jarName );
133131 }
134132
135133 public TSStatus addUDFInTable (CreateFunctionPlan physicalPlan ) {
@@ -209,7 +207,7 @@ public Map<Model, Map<String, UDFInformation>> getRawUDFTable() {
209207
210208 @ TestOnly
211209 public Map <String , String > getRawExistedJarToMD5 () {
212- return existedJarToMD5 ;
210+ return jarMetaKeeper . getJarNameToMd5Map () ;
213211 }
214212
215213 @ Override
@@ -260,46 +258,28 @@ public void processLoadSnapshot(File snapshotDir) throws IOException {
260258 }
261259
262260 public void serializeExistedJarToMD5 (OutputStream outputStream ) throws IOException {
263- ReadWriteIOUtils .write (existedJarToMD5 .size (), outputStream );
264- for (Map .Entry <String , String > entry : existedJarToMD5 .entrySet ()) {
265- ReadWriteIOUtils .write (entry .getKey (), outputStream );
266- ReadWriteIOUtils .write (entry .getValue (), outputStream );
267- }
261+ jarMetaKeeper .serializeJarNameToMd5 (outputStream );
268262 }
269263
270264 public void deserializeExistedJarToMD5 (InputStream inputStream ) throws IOException {
271- int size = ReadWriteIOUtils .readInt (inputStream );
272- while (size > 0 ) {
273- existedJarToMD5 .put (
274- ReadWriteIOUtils .readString (inputStream ), ReadWriteIOUtils .readString (inputStream ));
275- size --;
276- }
265+ jarMetaKeeper .deserializeJarNameToMd5 (inputStream );
277266 }
278267
279268 public void clear () {
280- existedJarToMD5 .clear ();
281- existedJarToReferenceCount .clear ();
269+ jarMetaKeeper .clear ();
282270 udfTable .clear ();
283271 }
284272
285273 private void addJarReference (String jarName , String jarMD5 ) {
286- existedJarToMD5 .putIfAbsent (jarName , jarMD5 );
287- existedJarToReferenceCount .merge (jarName , 1 , Integer ::sum );
274+ jarMetaKeeper .addReference (jarName , jarMD5 );
288275 }
289276
290277 private void removeJarReference (String jarName ) {
291- final Integer referenceCount = existedJarToReferenceCount .get (jarName );
292- if (referenceCount == null || referenceCount <= 1 ) {
293- existedJarToReferenceCount .remove (jarName );
294- existedJarToMD5 .remove (jarName );
295- return ;
296- }
297- existedJarToReferenceCount .put (jarName , referenceCount - 1 );
278+ jarMetaKeeper .removeReference (jarName );
298279 }
299280
300281 private void rebuildJarMetadataFromUDFTable () {
301- existedJarToMD5 .clear ();
302- existedJarToReferenceCount .clear ();
282+ jarMetaKeeper .clear ();
303283 for (UDFInformation udfInformation : udfTable .getAllInformationList ()) {
304284 if (udfInformation .isUsingURI ()) {
305285 addJarReference (udfInformation .getJarName (), udfInformation .getJarMD5 ());
0 commit comments