@@ -124,12 +124,12 @@ func (p *PartitionManager) Init() error {
124124func (p * PartitionManager ) TimeToPart (t int64 ) (* DBPartition , error ) {
125125 if p .headPartition == nil {
126126 // Rounding t to the nearest PartitionInterval multiple
127- _ , err := p .createNewPartition (p .currentPartitionInterval * (t / p .currentPartitionInterval ))
127+ _ , err := p .createAndUpdatePartition (p .currentPartitionInterval * (t / p .currentPartitionInterval ))
128128 return p .headPartition , err
129129 } else {
130130 if t >= p .headPartition .startTime {
131- if (t - p .headPartition .startTime ) > p .currentPartitionInterval {
132- _ , err := p .createNewPartition (p .headPartition .startTime + p .currentPartitionInterval )
131+ if (t - p .headPartition .startTime ) >= p .currentPartitionInterval {
132+ _ , err := p .createAndUpdatePartition (p .headPartition .startTime + p .currentPartitionInterval )
133133 if err != nil {
134134 return nil , err
135135 }
@@ -144,21 +144,35 @@ func (p *PartitionManager) TimeToPart(t int64) (*DBPartition, error) {
144144 return p .partitions [i ], nil
145145 }
146146 }
147+ head := p .headPartition
148+ part , _ := p .createAndUpdatePartition (p .currentPartitionInterval * (t / p .currentPartitionInterval ))
149+ p .headPartition = head
150+ return part , nil
147151 }
148152 }
149- return p .headPartition , nil
150153}
151154
152- func (p * PartitionManager ) createNewPartition (t int64 ) (* DBPartition , error ) {
155+ func (p * PartitionManager ) createAndUpdatePartition (t int64 ) (* DBPartition , error ) {
153156 time := t & 0x7FFFFFFFFFFFFFF0
154157 partPath := path .Join (p .path , strconv .FormatInt (time / 1000 , 10 )) + "/"
155158 partition , err := NewDBPartition (p , time , partPath )
156159 if err != nil {
157160 return nil , err
158161 }
159162 p .currentPartitionInterval = partition .partitionInterval
160- p .headPartition = partition
161- p .partitions = append (p .partitions , partition )
163+ if p .headPartition == nil || time > p .headPartition .startTime {
164+ p .headPartition = partition
165+ p .partitions = append (p .partitions , partition )
166+ } else {
167+ for i , part := range p .partitions {
168+ if part .startTime > time {
169+ p .partitions = append (p .partitions , nil )
170+ copy (p .partitions [i + 1 :], p .partitions [i :])
171+ p .partitions [i ] = partition
172+ break
173+ }
174+ }
175+ }
162176 err = p .updatePartitionInSchema (partition )
163177 return partition , err
164178}
@@ -169,7 +183,9 @@ func (p *PartitionManager) updatePartitionInSchema(partition *DBPartition) error
169183 if err != nil {
170184 return errors .Wrap (err , "Failed to update new partition in schema file" )
171185 }
172- err = p .container .Sync .PutObject (& v3io.PutObjectInput {Path : path .Join (p .path , config .SCHEMA_CONFIG ), Body : data })
186+ if p .container != nil { //tests use case only
187+ err = p .container .Sync .PutObject (& v3io.PutObjectInput {Path : path .Join (p .path , config .SCHEMA_CONFIG ), Body : data })
188+ }
173189 return err
174190}
175191
0 commit comments