@@ -732,22 +732,23 @@ public TimeseriesMetadata readTimeseriesMetadata(
732732 boolean ignoreNotExistDevice ,
733733 LongConsumer ioSizeConsumer )
734734 throws IOException {
735- readFileMetadata (ioSizeConsumer );
736- MetadataIndexNode deviceMetadataIndexNode =
737- tsFileMetaData .getTableMetadataIndexNode (device .getTableName ());
738- Pair <IMetadataIndexEntry , Long > metadataIndexPair =
739- getMetadataAndEndOffsetOfDeviceNode (deviceMetadataIndexNode , device , true , ioSizeConsumer );
740- if (metadataIndexPair == null ) {
741- if (ignoreNotExistDevice ) {
742- return null ;
743- }
744- throw new IOException (
745- Messages .format ("error.read.device_not_in_metadata_file" , device , file ));
746- }
747- ByteBuffer buffer =
748- readData (metadataIndexPair .left .getOffset (), metadataIndexPair .right , ioSizeConsumer );
749- MetadataIndexNode metadataIndexNode = deviceMetadataIndexNode ;
750- if (!metadataIndexNode .getNodeType ().equals (MetadataIndexNodeType .LEAF_MEASUREMENT )) {
735+ return readTimeseriesMetadata (device , null , measurement , ignoreNotExistDevice , ioSizeConsumer );
736+ }
737+
738+ public TimeseriesMetadata readTimeseriesMetadata (
739+ IDeviceID device ,
740+ long [] deviceMetadataIndexNodeOffset ,
741+ String measurement ,
742+ boolean ignoreNotExistDevice ,
743+ LongConsumer ioSizeConsumer )
744+ throws IOException {
745+ Pair <IMetadataIndexEntry , Long > metadataIndexPair ;
746+ MetadataIndexNode metadataIndexNode ;
747+ ByteBuffer buffer ;
748+ if (deviceMetadataIndexNodeOffset != null ) {
749+ buffer =
750+ readData (
751+ deviceMetadataIndexNodeOffset [0 ], deviceMetadataIndexNodeOffset [1 ], ioSizeConsumer );
751752 try {
752753 metadataIndexNode =
753754 deserializeConfig .measurementMetadataIndexNodeBufferDeserializer .deserialize (
@@ -759,6 +760,36 @@ public TimeseriesMetadata readTimeseriesMetadata(
759760 metadataIndexPair =
760761 getMetadataAndEndOffsetOfMeasurementNode (
761762 metadataIndexNode , measurement , false , ioSizeConsumer );
763+ } else {
764+ readFileMetadata (ioSizeConsumer );
765+ MetadataIndexNode deviceMetadataIndexNode =
766+ tsFileMetaData .getTableMetadataIndexNode (device .getTableName ());
767+ metadataIndexPair =
768+ getMetadataAndEndOffsetOfDeviceNode (
769+ deviceMetadataIndexNode , device , true , ioSizeConsumer );
770+ if (metadataIndexPair == null ) {
771+ if (ignoreNotExistDevice ) {
772+ return null ;
773+ }
774+ throw new IOException (
775+ Messages .format ("error.read.device_not_in_metadata_file" , device , file ));
776+ }
777+ buffer =
778+ readData (metadataIndexPair .left .getOffset (), metadataIndexPair .right , ioSizeConsumer );
779+ metadataIndexNode = deviceMetadataIndexNode ;
780+ if (!metadataIndexNode .getNodeType ().equals (MetadataIndexNodeType .LEAF_MEASUREMENT )) {
781+ try {
782+ metadataIndexNode =
783+ deserializeConfig .measurementMetadataIndexNodeBufferDeserializer .deserialize (
784+ buffer , deserializeConfig );
785+ } catch (Exception e ) {
786+ logger .error (METADATA_INDEX_NODE_DESERIALIZE_ERROR , file );
787+ throw e ;
788+ }
789+ metadataIndexPair =
790+ getMetadataAndEndOffsetOfMeasurementNode (
791+ metadataIndexNode , measurement , false , ioSizeConsumer );
792+ }
762793 }
763794 if (metadataIndexPair == null ) {
764795 return null ;
@@ -781,13 +812,15 @@ public TimeseriesMetadata readTimeseriesMetadata(
781812 }
782813 // when the buffer length is over than Integer.MAX_VALUE,
783814 // using tsFileInput to get timeseriesMetadataList
784- tsFileInput .position (metadataIndexPair .left .getOffset ());
785- while (tsFileInput .position () < metadataIndexPair .right ) {
786- try {
787- timeseriesMetadataList .add (TimeseriesMetadata .deserializeFrom (tsFileInput , true ));
788- } catch (Exception e1 ) {
789- logger .error (Messages .get ("log.read.sequence_reader_tsm_deserialize_error" ), file );
790- throw e1 ;
815+ synchronized (this ) {
816+ tsFileInput .position (metadataIndexPair .left .getOffset ());
817+ while (tsFileInput .position () < metadataIndexPair .right ) {
818+ try {
819+ timeseriesMetadataList .add (TimeseriesMetadata .deserializeFrom (tsFileInput , true ));
820+ } catch (Exception e1 ) {
821+ logger .error (Messages .get ("log.read.sequence_reader_tsm_deserialize_error" ), file );
822+ throw e1 ;
823+ }
791824 }
792825 }
793826 }
@@ -872,8 +905,21 @@ public List<TimeseriesMetadata> readTimeseriesMetadata(
872905 boolean ignoreNotExistDevice ,
873906 LongConsumer ioSizeRecorder )
874907 throws IOException {
908+ return readTimeseriesMetadata (
909+ device , null , measurement , allSensors , ignoreNotExistDevice , ioSizeRecorder );
910+ }
911+
912+ public List <TimeseriesMetadata > readTimeseriesMetadata (
913+ IDeviceID device ,
914+ long [] deviceMetadataIndexNodeOffset ,
915+ String measurement ,
916+ Set <String > allSensors ,
917+ boolean ignoreNotExistDevice ,
918+ LongConsumer ioSizeRecorder )
919+ throws IOException {
875920 Pair <IMetadataIndexEntry , Long > metadataIndexPair =
876- getLeafMetadataIndexPair (device , measurement , ioSizeRecorder );
921+ getLeafMetadataIndexPair (
922+ device , deviceMetadataIndexNodeOffset , measurement , ioSizeRecorder );
877923 if (metadataIndexPair == null ) {
878924 if (ignoreNotExistDevice ) {
879925 return Collections .emptyList ();
@@ -927,19 +973,18 @@ public List<TimeseriesMetadata> readTimeseriesMetadata(
927973
928974 /* Get leaf MetadataIndexPair which contains path */
929975 private Pair <IMetadataIndexEntry , Long > getLeafMetadataIndexPair (
930- IDeviceID device , String measurement , LongConsumer ioSizeRecorder ) throws IOException {
931- readFileMetadata (ioSizeRecorder );
932- MetadataIndexNode deviceMetadataIndexNode =
933- tsFileMetaData .getTableMetadataIndexNode (device .getTableName ());
934- Pair <IMetadataIndexEntry , Long > metadataIndexPair =
935- getMetadataAndEndOffsetOfDeviceNode (deviceMetadataIndexNode , device , true , ioSizeRecorder );
936- if (metadataIndexPair == null ) {
937- return null ;
938- }
939- ByteBuffer buffer =
940- readData (metadataIndexPair .left .getOffset (), metadataIndexPair .right , ioSizeRecorder );
941- MetadataIndexNode metadataIndexNode = deviceMetadataIndexNode ;
942- if (!metadataIndexNode .getNodeType ().equals (MetadataIndexNodeType .LEAF_MEASUREMENT )) {
976+ IDeviceID device ,
977+ long [] deviceMetadataIndexNodeOffset ,
978+ String measurement ,
979+ LongConsumer ioSizeRecorder )
980+ throws IOException {
981+ Pair <IMetadataIndexEntry , Long > metadataIndexPair ;
982+ MetadataIndexNode metadataIndexNode ;
983+ ByteBuffer buffer ;
984+ if (deviceMetadataIndexNodeOffset != null ) {
985+ buffer =
986+ readData (
987+ deviceMetadataIndexNodeOffset [0 ], deviceMetadataIndexNodeOffset [1 ], ioSizeRecorder );
943988 try {
944989 metadataIndexNode =
945990 deserializeConfig .measurementMetadataIndexNodeBufferDeserializer .deserialize (
@@ -948,10 +993,33 @@ private Pair<IMetadataIndexEntry, Long> getLeafMetadataIndexPair(
948993 logger .error (METADATA_INDEX_NODE_DESERIALIZE_ERROR , file );
949994 throw e ;
950995 }
996+ } else {
997+ readFileMetadata (ioSizeRecorder );
998+ MetadataIndexNode deviceMetadataIndexNode =
999+ tsFileMetaData .getTableMetadataIndexNode (device .getTableName ());
9511000 metadataIndexPair =
952- getMetadataAndEndOffsetOfMeasurementNode (
953- metadataIndexNode , measurement , false , ioSizeRecorder );
1001+ getMetadataAndEndOffsetOfDeviceNode (
1002+ deviceMetadataIndexNode , device , true , ioSizeRecorder );
1003+ if (metadataIndexPair == null ) {
1004+ return null ;
1005+ }
1006+ buffer =
1007+ readData (metadataIndexPair .left .getOffset (), metadataIndexPair .right , ioSizeRecorder );
1008+ metadataIndexNode = deviceMetadataIndexNode ;
1009+ if (!metadataIndexNode .getNodeType ().equals (MetadataIndexNodeType .LEAF_MEASUREMENT )) {
1010+ try {
1011+ metadataIndexNode =
1012+ deserializeConfig .measurementMetadataIndexNodeBufferDeserializer .deserialize (
1013+ buffer , deserializeConfig );
1014+ } catch (Exception e ) {
1015+ logger .error (METADATA_INDEX_NODE_DESERIALIZE_ERROR , file );
1016+ throw e ;
1017+ }
1018+ }
9541019 }
1020+ metadataIndexPair =
1021+ getMetadataAndEndOffsetOfMeasurementNode (
1022+ metadataIndexNode , measurement , false , ioSizeRecorder );
9551023 return metadataIndexPair ;
9561024 }
9571025
@@ -1646,7 +1714,7 @@ private void generateMetadataIndexUsingTsFileInput(
16461714 needChunkMetadata );
16471715 }
16481716
1649- private void generateMetadataIndexUsingTsFileInput (
1717+ private synchronized void generateMetadataIndexUsingTsFileInput (
16501718 IMetadataIndexEntry metadataIndex ,
16511719 long start ,
16521720 long end ,
0 commit comments